<EOL>
。如何使vim始终在文件末尾写入新行(当文件不是二进制文件,并且还没有一个)?
我已经测试过
eol
选项,但它没有按预期工作。另请参阅:保留缺少的末尾文本文件末尾的行,但相反。并且:为什么文件应该以换行符结尾?
#1 楼
基本信息Vim不会在缓冲区中显示最新的换行符,但实际上vim在编写文件时总是将EOL放在文件的末尾,因为它是Unix系统中文本文件的标准配置。您可以在此处找到有关此的更多信息。简而言之,您不必担心在vim中文件末尾缺少新行。
实验1
您可以做一个小实验来检查这种行为。在终端中执行:
$ vim test_test
输入字符
1
并保存文件:wq。文件中只有一个字符,对吗?实际上没有:)您的文件中现在包含
1
和LF
字符。让我们使用hexdump实用程序进行检查:$ hexdump test_test
0000000 31 0a
0000002
31
是字符1
的ASCII代码,而0a
是非打印LF
字符的ASCII代码,对于UNIX,您可能已经知道行尾代码。实验2
但是,如果我们打开文件末尾没有
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
字符显示为$
符号。#2 楼
仅当以'binary'
打开文件并且重置'endofline'
选项时(当二进制文件在打开时没有EOL或显式重置该选项时),Vim才会忽略EOL。换句话说,Vim只接受二进制文件缺少的EOL。对于文本文件,它总是使用(添加的)EOL进行写入。 (这就是为什么您需要诸如PreserveNoEOL插件之类的解决方案来保持文本文件不包含EOL的原因。)您可以在:help 'endofline'
处找到所有详细信息。因此,您只需要确保以非二进制文件形式打开文件即可。为了让Vim自动编写EOL。
#3 楼
正如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。
评论
大。困惑之后,我得出了相同的结论,因为Vim并未真正向我展示这条新线,但保存后就在那里。
– Kenorb
15年5月16日在11:33
@kenorb可以使用此命令显示所有EOL角色:set listchars = eol:$
–亚历山大·米肖夫(Alexander Myshov)
15年5月16日在11:41
“实际上并没有向我展示这条新线”-在Unix中,没有任何一行。将一行定义为“以LF字符结尾的非LF字符数”。如果您认为LF不是“转到下一行”而是“行尾”,那么Vim所做的突然变得更加有意义。
–阿玛丹
16 Mar 10 '16 at 4:56