47

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

1724c1724
< }
\ No newline at end of file
---
> }

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

4

5 回答 5

54

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

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

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

因此,它们都需要以换行符结尾。这就是为什么 Vim 默认总是添加一个换行符(因为根据 POSIX,它应该一直存在)。

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


编辑

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

此外,您可能对以下内容感兴趣:Vim 在文件末尾显示换行符

于 2015-07-15T09:28:08.643 回答
17

Because vim is a text editor, it can sometimes "clean up" files for you. See http://vimhelp.appspot.com/vim_faq.txt.html#faq-5.4 for details on how to write without the ending newline, paraphrased below:

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

于 2013-01-05T11:26:48.143 回答
6

Adding a newline is the default behavior for Vim. If you don't need it, then use this solution: VIM Disable Automatic Newline At End Of File

To disable, add this to your .vimrc

set fileformats+=dos
于 2013-01-05T11:25:27.060 回答
4

You can put the following line into your .vimrc

autocmd FileType php setlocal noeol binary

Which should do the trick, but actually your approach is somewhat wrong. First of all php won't mind that ending at all and secondly if you don't want to save your changes don't press u or worse manually try to recreate the state of the file, but just quit without saving q!. If you left the editor and saved for some reason, try git checkout <file>

于 2013-01-05T11:25:43.903 回答
0

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

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

于 2017-01-19T18:40:43.413 回答