Vim通常<EOL>
只在原始文件中有最后一行时才写最后一行。
如何使vim始终在文件末尾写入新行(当文件不是二进制文件并且还没有二进制文件时)?
我已经测试了eol
选项,但是没有按预期工作。
另请参阅:保留文本文件末尾缺少的行尾,但相反。并且:为什么文件应该以换行符结尾?
Vim通常<EOL>
只在原始文件中有最后一行时才写最后一行。
如何使vim始终在文件末尾写入新行(当文件不是二进制文件并且还没有二进制文件时)?
我已经测试了eol
选项,但是没有按预期工作。
另请参阅:保留文本文件末尾缺少的行尾,但相反。并且:为什么文件应该以换行符结尾?
Answers:
Vim不会在缓冲区中显示最新的换行符,但实际上,Vim在编写文件时总是将EOL放在文件末尾,因为它是Unix系统中文本文件的标准配置。您可以在此处找到有关此内容的更多信息。简而言之,您不必担心vim文件末尾缺少新行。
您可以做一个小实验来检查这种行为。在终端中执行:
$ vim test_test
输入字符1
并保存文件:wq。
文件中只有一个字符,对吗?实际上没有:)您现在已经在文件1
和LF
字符中了。让我们使用hexdump实用工具进行检查:
$ hexdump test_test
0000000 31 0a
0000002
31
是字符的ASCII码1
,而0a
对于非打印的ASCII码LF
这对于UNIX,因为你可能已经知道行尾码字符。
但是,如果我们打开文件eol
末尾没有符号的文件,该怎么办?我们也检查一下。让我们最后创建不带eol的文件,例如:
$ echo -n "1" > test_without_eol
然后再次让我们用hexdump查看它的内部:
$ hexdump test_without_eol
000000 31
0000001
因此,这里没有任何eol
字符。让我们在vim中打开该文件:
$ vim test_without_eol
在编辑器的底部,您将看到:
"test_without_eol" [noeol] 1L, 1C
并且,如果您要保存此文件,eol
字符将自动放入。
如果确实需要查看文件结尾。尝试使用此命令:
:set listchars=eol:$
它将所有eol
字符显示为$
符号。
:set listchars=eol:$
Vim仅会忽略,如果该文件被打开的EOL 'binary'
和该'endofline'
选项复位时(二进制文件打开时没有一个EOL,或者您明确重置选项)。换句话说,Vim只接受二进制文件缺少的EOL。对于文本文件,它总是使用(添加的)EOL进行写入。(这就是为什么您需要诸如PreserveNoEOL插件之类的解决方案来保持文本文件不包含EOL的原因。)您可以在找到所有详细信息:help 'endofline'
。
因此,您只需要确保以非二进制形式打开文件,即可使Vim自动编写EOL。
正如Alexander所提到的,Vim在EOF上没有显示EOL,这就是为什么它是如此混乱(尤其是空/空白换行这是另一回事)的原因,因此它实际上每次都在文件保存时写入。
这是简单的测试,如何测试是否有效:
$ printf foo > foo.txt
$ cat foo.txt
foo$ wc foo.txt
0 1 3 foo.txt
$ vim -cwq foo.txt
$ cat foo.txt
foo
$ wc foo.txt
1 1 4 foo.txt
注意没有EOL时,shell提示的行为(它与下一行混合在一起)。用Vim重新保存文件时,它会添加它。
使用wc
我们可以在保存之前和之后计算行,单词和字符,因此我们可以看到它实际上发生了变化。
为什么这如此重要?为了使我们的文件符合POSIX。