如何使vim自动在文件末尾添加换行符?


Answers:


17

基础信息

Vim不会在缓冲区中显示最新的换行符,但实际上,Vim在编写文件时总是将EOL放在文件末尾,因为它是Unix系统中文本文件的标准配置。您可以在此处找到有关此内容的更多信息。简而言之,您不必担心vim文件末尾缺少新行。

实验1

您可以做一个小实验来检查这种行为。在终端中执行:

$ vim test_test

输入字符1并保存文件:wq

文件中只有一个字符,对吗?实际上没有:)您现在已经在文件1LF字符中了。让我们使用hexdump实用工具进行检查:

$ hexdump test_test
0000000 31 0a
0000002

31是字符的ASCII码1,而0a对于非打印的ASCII码LF这对于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字符显示为$符号。


大。困惑之后,我得出了相同的结论,因为Vim并未真正向我展示这条新线,但保存后就在那里。
kenorb

1
@kenorb,您可以使用此命令显示所有EOL :set listchars=eol:$
角色

“实际上并没有向我展示这条新线”-在Unix中,没有任何一行。将一行定义为“以LF字符结尾的非LF字符数”。如果您认为LF不是“转到下一行”而是“行尾”,那么Vim所做的突然变得更加有意义。
阿玛丹

8

Vim仅会忽略,如果该文件被打开的EOL 'binary' 'endofline'选项复位时(二进制文件打开时没有一个EOL,或者您明确重置选项)。换句话说,Vim只接受二进制文件缺少的EOL。对于文本文件,它总是使用(添加的)EOL进行写入。(这就是为什么您需要诸如PreserveNoEOL插件之类的解决方案来保持文本文件不包含EOL的原因。)您可以在找到所有详细信息:help 'endofline'

因此,您只需要确保以非二进制形式打开文件,即可使Vim自动编写EOL。


5

正如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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.