关于newline:为什么我需要Vim在二进制模式下”noeol”才能工作?

Why do I need vim in binary mode for 'noeol' to work?

这个问题是我使用"在VIM中保存文件,而不在文件末尾使用换行符"的后续工作。

基本上我不能在我的.vimrc中使用set noeol,因为它什么都不做!

如果我以二进制模式编辑文件,它会做它应该做的。(用vim -b file代替vim file)

为什么会这样?

不管怎样,在.vimrc中有一个简单的偏好,不在我编辑的每个文件中添加换行符?

另外,如果我开始以二进制模式编辑每个文件,会遇到什么样的问题?到目前为止,我没有看到任何不同。


Vim在文件最后一行末尾添加的是"new line"字符,不应该与"new line"混淆。

"换行"字符或更准确的"行尾"字符(表示"在这一点之后发生的任何事情都必须被视为在另一行上"。根据这种解释,是一个行终止符,文件的最后一行实际上是的最后一行。

问题是,大多数编辑器和IDE都有不同的解释——是一个行分隔符——并且,在逻辑上,默认不在新文件的最后一行末尾添加,当遇到时,在实际的最后一行后面添加多余的"新行"。

简而言之,vim没有添加"新行":其他编辑将它的"新行"错误地解释为"新行"。

但你可以通过以下方式来解决这个问题:在你写文件之前,如果你想让它保持""的自由,就做:set binary noeol

但是,对于:set binary的危险,:h 'binary'有很多话要说,所以我想说,一直打开它听起来是个坏主意。

为了说明不同的行为,当您尝试将两个文件与连接时会发生这种情况:

1
2
3
4
5
6
7
8
$ cat file1    $ cat file2         $ cat file1 file2

lorem ipsum    Le tramway jaune    lorem ipsum
dolor sit      avance lentement    dolor sit
amet           dans le             amet
                                   Le tramway jaune
                                   avance lentement
                                   dans le

当您尝试连接两个不带的文件时会发生这种情况:

1
2
3
4
5
6
7
$ cat file1    $ cat file2         $ cat file1 file2

lorem ipsum    Le tramway jaune    lorem ipsum
dolor sit      avance lentement    dolor sit
amet           dans le             ametLe tramway jaune
                                   avance lentement
                                   dans le

第一种行为不知何故是预期行为,也是Vim和许多(如果不是大多数)Unix-Y程序默认使用终止符解释和在最后一行末尾添加字符的原因。

下图显示了一个使用nano创建的简单文件(与vim相同),并在eclipse、textmate、sublime text、vim、xcode和textedit中打开。

<EOL>>></P><P>(edit)此文件中没有第4行,正确显示文件的束的唯一编辑器是vim。行号列的唯一目的是提供有关缓冲区的信息。显示只有3行的4行是一个严重错误。(恩迪特)</P><P>这张图片显示了另一个没有<wyn><EOL></wyn>的简单文件,它是用崇高的文本创建的,并在同一个编辑器/ides中打开。</P><P><img src=


从7.4.785版开始,VIM具有fixendofline设置。您可以避免binary(它有一些副作用),只需设置

1
2
set noendofline
set nofixendofline


have a simple preference in .vimrc to NOT add newlines at every single file i edit

你可以使用我的PreserveNoeol插件。通过这个简单的设置,您就完成了;或者,您还可以对每个缓冲区进行影响:

1
:let g:PreserveNoEOL = 1


根据Vimdoc,除非binary模式打开,否则noeol不起作用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
            *'endofline'* *'eol'* *'noendofline'* *'noeol'*
'endofline' 'eol'   boolean (default on)
            local to buffer
            {not in Vi}
    When writing a file and this option is off and the 'binary' option
    is on, no <EOL> will be written for the last line in the file.  This
    option is automatically set when starting to edit a new file, unless
    the file does not have an <EOL> for the last line in the file, in
    which case it is reset.  Normally you don't have to set or reset this
    voption.  When '
binary' is off the value is not used when writing the
    file.  When '
binary' is on it is used to remember the presence of a
    <EOL> for the last line in the file, so that when you write the file
    the situation from the original file can be kept.  But you can change
    it if you want to.