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