关于diff:为什么Vim会在文件末尾添加一个新行?

Why would Vim add a new line at the end of a file?

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

1
2
3
4
5
1724c1724
< }
\ No newline at end of file
---
> }

我从来没有触及那条线。 我在大文件中间某处所做的更改。 这让我认为vim在文件末尾添加了换行符。 为什么会这样?


我在这里看到的所有答案都解决了"我怎么能阻止Vim在文件末尾添加换行符?"的问题,而问题是"为什么Vim会在文件末尾添加一个新行?"。我的浏览器的搜索引擎把我带到了这里,我找不到这个问题的答案。

它与POSIX标准如何定义一条线有关(请参阅文件为什么以换行符结尾?)。所以,基本上,一行是:

3.206 Line
A sequence of zero or more non- characters plus a terminating character.

因此,他们都需要以换行符结束。这就是为什么Vim总是默认添加换行符(因为根据POSIX,它应该总是在那里)。

它不是唯一一个这样做的编辑。 GNOME中的默认文本编辑器Gedit也做了同样的事情。

编辑

许多其他工具也期望换行符。参见例如:

  • wc如何期待它。
  • 海湾合作委员会警告它。

此外,您可能感兴趣:Vim在文件末尾显示换行符。


因为vim是文本编辑器,所以它有时可以为您"清理"文件。有关如何在没有结尾换行符的情况下编写的详细信息,请参阅http://vimhelp.appspot.com/vim_faq.txt.html#faq-5.4,如下所述:

How do I write a file without the line feed (EOL) at the end of the file?

You can turn off the eol option and turn on the binary option to write a file without the EOL at the end of the file:
   :set binary
   :set noeol
   :w

Alternatively, you can use:
   :set noeol
   :w ++bin


添加换行符是Vim的默认行为。如果您不需要它,请使用此解决方案:VIM在文件末尾禁用自动换行

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

1
set fileformats+=dos


您可以将以下行放入.vimrc中

1
autocmd FileType php setlocal noeol binary

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


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

有趣的是,vim将允许您打开一个新文件,写入该文件,该文件将为零字节。如果您打开一个新文件并使用"o"附加一行,则写入该文件将是两个字符长。如果你打开所述文件并删除第二行'dd'并写入文件,它将是一个字节长。打开文件备份并删除剩余的唯一行并写入文件,它将是零字节。所以只要它完全为空,vim就会让你写一个零字节文件。似乎无视上面的posix定义。我猜...