繁体   English   中英

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

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

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

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

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

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

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

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

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

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


编辑

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

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

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

如何在文件末尾写入没有换行符 (EOL) 的文件?

可以关闭eol选项,打开binary选项,写入文件末尾不带EOL的文件:
:set binary
:set noeol
:w

或者,您可以使用:
:set noeol
:w ++bin

添加换行符是 Vim 的默认行为。 如果您不需要它,请使用此解决方案: VIM Disable Automatic Newline At End Of File

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

set fileformats+=dos

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

autocmd FileType php setlocal noeol binary

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM