Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么Vim会在文件末尾添加新行?_Vim_Diff_Newline - Fatal编程技术网

为什么Vim会在文件末尾添加新行?

为什么Vim会在文件末尾添加新行?,vim,diff,newline,Vim,Diff,Newline,我经常使用Wordpress,有时我会临时更改Wordpress核心文件,以了解正在发生的事情,特别是在调试时。今天我得到了一个小小的惊喜。当我准备将更改提交到git存储库时,我注意到,git status正在将其中一个Wordpress文件标记为未提交。我记得在关闭该文件之前,我已还原了对该文件所做的所有更改,因此我决定使用diff查看更改的内容。我将项目中的文件与我保存在下载目录中的Wordpress副本中的文件进行了比较。事实证明,文件的结尾是不同的diff表示原始文件末尾缺少换行符: 1

我经常使用Wordpress,有时我会临时更改Wordpress核心文件,以了解正在发生的事情,特别是在调试时。今天我得到了一个小小的惊喜。当我准备将更改提交到git存储库时,我注意到,
git status
正在将其中一个Wordpress文件标记为未提交。我记得在关闭该文件之前,我已还原了对该文件所做的所有更改,因此我决定使用
diff
查看更改的内容。我将项目中的文件与我保存在下载目录中的Wordpress副本中的文件进行了比较。事实证明,文件的结尾是不同的
diff
表示原始文件末尾缺少换行符:

1724c1724
< }
\ No newline at end of file
---
> }
1724c1724
< }
\文件末尾没有换行符
---
> }

我甚至都没碰过那条线。我在一个大文件中间的某个地方做的改变。这让我想到vim在文件末尾添加了一个换行符。为什么会发生这种情况?

添加换行符是Vim的默认行为。如果不需要,请使用以下解决方案:

要禁用,请将其添加到.vimrc

set fileformats+=dos
autocmd FileType php setlocal noeol binary

您可以将以下行放入.vimrc

set fileformats+=dos
autocmd FileType php setlocal noeol binary

这应该可以做到,但实际上你的方法有些错误。首先,
php
根本不介意结束,其次,如果您不想保存更改,请不要按
u
或更糟的手动尝试重新创建文件状态,只需退出而不保存
q。如果出于某种原因离开编辑器并保存,请尝试
git checkout

,因为
vim
是一个文本编辑器,它有时可以为您“清理”文件。有关如何在不使用结尾换行符的情况下写作的详细信息,请参阅,如下所述:

如果文件末尾没有换行符(EOL),如何编写文件?

您可以关闭
eol
选项,并打开
binary
选项来编写文件,但文件末尾没有eol:
:设置二进制

:设置noeol

:w

或者,您可以使用:
:设置noeol

:w++bin


我在这里看到的所有答案都是针对“如何防止Vim在文件末尾添加换行符?”的问题,而问题是“Vim为什么要在文件末尾添加新行?”。我的浏览器的搜索引擎把我带到了这里,但我没有找到这个问题的答案

它与POSIX标准定义行的方式有关(请参阅)。因此,基本上,一条线是:

3.206行 零个或多个非字符加上一个终止字符的序列。 因此,它们都需要以换行符结尾。这就是为什么Vim总是在默认情况下添加一个换行符(因为根据POSIX,它应该总是在那里)

它不是唯一一个这样做的编辑,中的默认文本编辑器执行相同的操作


编辑 许多其他工具也期望使用换行符。例如,见:

此外,您可能对以下内容感兴趣:

3.206线路 零个或多个非字符加上一个终止字符的序列


有趣的是,vim将允许您打开一个新文件,写入该文件,该文件将为零字节。如果您打开一个新文件并使用
o
追加一行,则写入该文件将有两个字符长。如果您打开所述文件备份并删除第二行
dd
,然后写入该文件,则其长度将为一个字节。打开文件备份并删除剩下的唯一一行,然后将文件写入零字节。因此,只要零字节文件完全为空,vim将允许您编写零字节文件。似乎违反了上面的posix定义。我猜…

那里的git解决方案看起来也很有趣。谢谢,我不知道这是Vim的默认行为。这对我不起作用。我已经将
文件格式设置为
unix、dos、mac
(我使用的是OS X),但vim仍然像OP所描述的那样添加EOF lineendings。在这里不起作用-linux ubuntu。正如Max在下面所说的,我必须使用SETNOEOL二进制。使用
q不起作用,因为在某个时候我已经保存了对该文件的更改。否则,我无法看到我正在执行的测试的结果。我已经知道如何恢复文件,但不知道为什么Vim会添加换行符。感谢您将这一行添加到vimrc文件中。感谢您的回答和链接。这似乎是一个非常有用的常见问题集。这不是重复的。这个问题问的是原因:“Vim为什么要这么做?”。谢谢你,Peque。是句子中的小细节造成了所有的不同。有时,一个人需要一个完全遵守用户输入内容的编辑器,如果他没有输入新行,那么。。。如果这条新生产线不是预期的,这个标准可能会产生大便。这是非常特殊的情况,但我更喜欢只有在键入新行时才使用它。我学到了一种非常困难的方法(2小时的调试),即如果没有新行字符,tcsh将不会执行脚本的最后一行。我正在生成tcsh脚本,但忘了向文件中添加最终\n。然后我注意到,如果我只是在vim中打开文件,除了保存它什么都不做,它会突然开始工作。