为什么我需要二进制模式下的'noeol'工作?

这个问题跟随我使用“在vim中保存文件而没有强制添加文件末尾的换行符”的烦恼。

基本上我不能在我的.vimrc使用set noeol ,因为它没有任何功能!

它做它应该做的事情,但是如果我以二进制模式编辑文件。 ( vim -b file而不是vim file

这是为什么?

无论如何,在.vimrc有一个简单的首选项不会在我编辑的每个文件中添加换行符?

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


Vim在文件最后一行的末尾添加了“新行”字符,不应该将它与“新行”混淆。

“换行符”或更准确地说,“换行符”( <EOL> )意味着“在此点之后必须考虑在另一行上”。 有了这个解释 - <EOL>是行结束符 - 文件的最后一行实际上是具有<EOL>的最后一行。

问题是大多数编辑器和IDE有不同的解释 - <EOL>是行分隔符 - 并且在逻辑上,默认情况下不在新文件最后一行的末尾添加<EOL> ,并且当它们遇到<EOL> ,在真正的最后一行之后添加一个多余的“新行”。

简而言之,Vim不会添加一个“新行”:其他编辑将它的“新行”解释为“新行”。

但是,通过执行以下操作,您可以解决该问题:在写入文件之前,请执行以下操作:set binary noeol如果希望保留“ <EOL> -free”,请:set binary noeol

然而, :h 'binary'有很多值得关于危险的说法:set binary所以我认为把它“开启”总是听起来像个坏主意。

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

$ 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

这是当您尝试连接两个没有<EOL>文件时会发生的情况:

$ 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程序默认为终结符解释并在最后一行末尾添加<EOL>字符的原因。

下面的图片显示了一个简单的文件,其中包含使用nano创建的<EOL> (它将与Vim相同),并在Eclipse,TextMate,Sublime Text,Vim,XCode和TextEdit中打开。

<EOL>

(编辑) 该文件中没有第4行,并且正确显示该文件的唯一编辑器是Vim。 行号列的唯一目的是提供有关缓冲区的信息。 显示4行只有3行是一个严重的错误。 (EndEdit中)

这张图片显示了另一个没有使用Sublime Text创建并在相同编辑器/ IDE中打开的<EOL>简单文件。

没有<EOL>


从版本7.4.785 vim有fixendofline设置。 你可以避免有一些副作用的binary ,只需设置

set noendofline
set nofixendofline

根据vimdoc noeol什么都不做,除非binary模式打开。

            *'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.
链接地址: http://www.djcxy.com/p/77235.html

上一篇: Why do I need vim in binary mode for 'noeol' to work?

下一篇: How do I remove a substring from the end of a string in Python?