为什么我需要vim以二进制模式运行'noeol'?

gcb*_*gcb 41 vim newline

这个问题是我用于"在vim中保存文件而没有在文件末尾强行添加换行符"的烦恼的后续工作.

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

如果我以二进制模式编辑文件,它会执行它应该执行的操作.(vim -b file而不是vim file)

这是为什么?

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

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

rom*_*inl 94

Vim"添加"到文件最后一行末尾的是"换行符"字符,不应与"新行"混淆.

"换行符"字符或更准确地说"行尾"字符(<EOL>)表示"在此点之后的任何内容都必须被视为在另一行上".有了这种解释 - <EOL>是行终止符 - 文件的最后一行实际上是最后一行的<EOL>.

问题是大多数编辑器和IDE都有不同的解释 - <EOL>是一个行分隔符 - 从逻辑上讲,默认情况下不会<EOL>在新文件的最后一行的末尾添加一个,当他们遇到一个时<EOL>,添加一个多余的"new"线"在真正的最后一行之后.

简而言之,Vim没有添加"新线":其他编辑将("错误")其"新线"解释为"新线".

但是你可以通过执行以下操作来解决这个问题:在你编写文件之前,:set binary noeol如果你希望它保持" <EOL>-free".

然而,: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
Run Code Online (Sandbox Code Playgroud)

当你尝试连接两个文件而没有<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
Run Code Online (Sandbox Code Playgroud)

第一种行为是以某种方式预期的行为以及Vim和许多(如果不是大多数)UNIX-y程序默认为终结符解释以及<EOL>在最后一行末尾添加字符的原因.

下图显示了一个<EOL>创建的简单文件nano(它与Vim相同),并在Eclipse,TextMate,Sublime Text,Vim,XCode和TextEdit中打开.

<EOL>

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

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

没有<EOL>

  • 并且对EOL的优秀解释提出了建议.但问题是控制它.我想决定,不要把它留给vim. (4认同)
  • 是否有任何问题提出相反的问题:为什么某些编辑器在文件末尾显示空行? (3认同)
  • 我坚定地支持 EOL 被要求作为行终止符,即使在 EOF(Vim 经常用户)也是如此。然而,唱反调:如果其他编辑器在最终 EOL 之后没有显示空行,那么用户如何将光标放置在那里以便在该 EOL 之后添加一行?对于文本编辑尤其如此。对于 TextMate,如果文件只有 3 行,则“3”下方可能会出现一个灰色方块,直到用户开始键入,此时它会变成“4”,并自动添加第 4 个 EOL。 (3认同)
  • 我认为你只需要编写一个暂时`设置二进制noeol`并将其绑定到`BufWritePre`事件的小函数. (2认同)
  • 甚至比“set binary noeol”更好的是“setl binary noeol”。 (2认同)
  • 优秀的解释和插图。希望我可以 vimlove+2 用于 `$ cat file1 ` 部分中的列文本格式。顺便说一下,Atom 在“Shows line #4”俱乐部。 (2认同)
  • 我不同意你的解释,@romainl。典型的文本编辑器将换行符呈现为换行符——移动到下一行。Vim 根本不渲染它。因此,在连接文件时,您会得到与典型文本编辑器匹配但与 Vim 不同的行为。 (2认同)
  • @NathanHinchey我很想根据上下文将其视为某种流或格式错误的文件。 (2认同)

mra*_*ner 16

从版本7.4.785 vim有fixendofline设置.你可以避免binary(有一些副作用)并简单地设置

set noendofline
set nofixendofline
Run Code Online (Sandbox Code Playgroud)


FDi*_*off 6

根据 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.
Run Code Online (Sandbox Code Playgroud)