如果我打开 Vim 并输入itest<Esc>:wq
,我会得到一个没有换行符的文件在 Vim 中但代码中似乎有一个换行符:
$ vim -u NONE test.txt
$ cat test.txt | hd
00000000 74 65 73 74 0a |test.|
00000005
如果我打开 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
请注意,我使用 打开 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 [email protected]
Compiled by buildd@
我也可以确认这个系统上存在完全相同的行为:
$ 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 [email protected]
Compiled by buildd@
为什么 Vim 要添加换行符?这是一个惯例吗?
以下是有关hd
在 Ubuntu Server 上安装的命令的一些说明:
$ man hd | head -4
HEXDUMP(1) BSD General Commands Manual HEXDUMP(1)
NAME
hexdump, hd — ASCII, decimal, hexadecimal, octal dump
答案1
Unix 文本文件的约定是每一行都以换行符结束,并且换行符是行终止符,而不是行分隔符。
当 Vim 将缓冲区保存为文件时,它会以该文件格式的行尾序列来终止每一行,对于 Unix 来说,这是一个换行符。请参阅
:help 'fileformat'
如果您使用的是 Unix 文本处理工具,最好遵循此惯例。但是,如果您需要不在文件最后一行末尾添加换行符,则可以这样做。Vim 将此类文件视为“二进制”。请参阅
:help 'binary'
:help edit-binary
答案2
Vim 8.0 现在提供了这个fixeol
选项。具体来说,如果你这样做:
:set nofixeol
然后是 Vim惯于如果文件尚未有换行符,则在最后一行末尾添加一个换行符。
这可能进入文件类型插件,或者甚至可能是你的.vimrc
。
(这是一个改进,:set binary
因为它只影响最后的换行符,同时binary
还改变了一堆其他行为,除非您实际上正在编辑二进制文件,否则您可能不想要这些行为。)
默认情况下,新创建的文件仍会带有尾部换行符。您可以通过以下方式更改此设置(并将已经有尾部换行符的文件切换为没有换行符):
:set noeol
必须为您想要更改的每个文件专门设置:将文件加载到缓冲区中将始终设置eol
为匹配文件的当前状态。
答案3
Vim 不会添加任何您自己没有添加的内容。
“换行符”不是一个“新行”,并且两个例子都是完全正常的:
- 在第一个文件中,文件只包含一行,因此你会得到一个“换行符”,
- 在第二个文件中,文件包含两行,因此您会得到两个“换行符”。
答案4
使用‘j’命令可以将所有行合并为一行。
如果您还想删除最后一行的 LF 或 CRLF,请在 vi 中执行以下操作。
$ vi file
:set binary
:set noeol
:w!
:f look for [noeol] on the status line
:q