为什么 Vim 要添加换行符?这是公约吗?

dot*_*hen 24 linux vim newlines

如果我打开 Vim 并输入,itest<Esc>:wq那么我会得到一个在 Vim 中没有换行符但在代码中似乎有一个换行符的文件:

$ vim -u NONE test.txt
$ cat test.txt | hd
00000000  74 65 73 74 0a                    |test.|
00000005
Run Code Online (Sandbox Code Playgroud)

如果我打开 Vim 并输入,itest<Return><Esc>:wq那么我会得到一个在 Vim中有一个换行符但在代码中有两个换行符的文件:

$ rm test.txt
$ vim -u NONE test.txt
$ cat test.txt | hd
00000000  74 65 73 74 0a 0a                 |test..|
00000006
Run Code Online (Sandbox Code Playgroud)

请注意,我正在打开 Vim,-u NONE因此没有使用本地配置。另请注意,这可能与我之前的一个问题有关

这是我的系统信息:

$ uname -a
Linux awsAlpha 3.2.0-60-virtual #91-Ubuntu SMP Wed Feb 19 04:13:28 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux
$ vim --version
VIM - Vi IMproved 7.3 (2010 Aug 15, compiled May  4 2012 04:25:35)
Included patches: 1-429
Modified by pkg-vim-maintainers@lists.alioth.debian.org
Compiled by buildd@
Run Code Online (Sandbox Code Playgroud)

我也可以在这个系统上确认完全相同的行为:

$ uname -a
Linux bruno 3.5.0-48-generic #72-Ubuntu SMP Mon Mar 10 23:18:29 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux
$ vim --version
VIM - Vi IMproved 7.3 (2010 Aug 15, compiled Oct 26 2012 16:45:33)
Included patches: 1-547
Modified by pkg-vim-maintainers@lists.alioth.debian.org
Compiled by buildd@
Run Code Online (Sandbox Code Playgroud)

为什么 Vim 要添加换行符?这是公约吗?

以下是有关hd安装在 Ubuntu Server 上的命令的一些说明:

$ man hd | head -4
HEXDUMP(1)            BSD General Commands Manual            HEXDUMP(1)

NAME
     hexdump, hd — ASCII, decimal, hexadecimal, octal dump
Run Code Online (Sandbox Code Playgroud)

gar*_*ohn 30

Unix 文本文件的约定是每一行都以换行符结尾,并且换行符是行终止符,而不是行分隔符。

当 Vim 将缓冲区保存为文件时,它会以该文件格式的行尾序列终止每一行,在 Unix 中是换行符。看

:help 'fileformat'
Run Code Online (Sandbox Code Playgroud)

如果您使用 Unix 文本处理工具,最好坚持这个约定。但是,如果您需要不在文件的最后一行末尾放置换行符,则可以这样做。Vim 认为这样的文件是“二进制的”。看

:help 'binary'
:help edit-binary
Run Code Online (Sandbox Code Playgroud)

  • 哦,这很有趣。那么除了著名的 \r\n 与 \n 之外。 Windows 使用行分隔符,unix 使用行终止符?这有记录在任何地方吗?我知道它在这里定义大概适用于unix“ISO/IEC 9899:2011,第§7.21.2流说:文本流是组成行的有序字符序列,每行由零个或多个字符加上终止新字符组成- 行字符” (2认同)

Smy*_*ers 5

Vim 8.0 现在提供了这个选项fixeol。具体来说,如果您这样做:

:set nofixeol
Run Code Online (Sandbox Code Playgroud)

那么如果文件中还没有换行符,Vim就不会在最后一行的末尾添加换行符。

这可能会出现在文件类型插件中,甚至可能出现在您的.vimrc.

(这是一个改进,:set binary因为它只影响最后的换行符,同时binary还改变了许多其他行为,除非您实际上正在编辑二进制文件,否则您可能不想要这些行为。)

默认情况下,新创建的文件仍将有一个尾随换行符。您可以通过另外执行以下操作来更改这一点(并将已经具有最终换行符的文件切换为没有换行符):

:set noeol
Run Code Online (Sandbox Code Playgroud)

必须为您想要更改的每个文件专门设置:将文件加载到缓冲区中将始终设置eol为匹配文件的当前状态。