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)
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为匹配文件的当前状态。