为什么在vim的插入模式下看不到两个不同文件之间的区别?


8

让我们创建两个文件:

$ echo -n 'test' > test.txt
$ wc test.txt 
0 1 4 test.txt

该文件test.txt不包含尾随换行符。

$ echo 'test' > test_n.txt
$ wc test_n.txt 
1 1 5 test_n.txt

该文件test_n.txt包含尾随换行符。

上面两个文件明显不同,但是vim插入模式下两个文件的预览没有任何区别:

$ vim test.txt

在此处输入图片说明

$ vim test_n.txt

在此处输入图片说明

为什么没有区别(换行或某些特殊区别)?

vim插入模式下如何添加或删除这样的附加字符?


4
“:set list”将显示差异,并且您可以检查一种模式。两者都在帮助文件中。
Thomas Dickey

谢谢@ThomasDickey我以前不知道这个选项。
simhumileco

1
@ThomasDickey如果要添加答案,则可能是已接受的答案。谢谢。
simhumileco

2
@filbranden,请不要在评论中发表答案。评论中的答案不能由社区投票,也不能将问题标记为已回答。
terdon

2
@ThomasDickey参见上面。请发布答案。
terdon

Answers:


12

vim的模式为 “ eol”(用于行尾),以判断文件的最后一行缺少换行符该怎么办。您可以通过以下方式查看vim(或任何类似vi的程序)中的所有模式设置:

:set all

POSIX vi没有为此提供的功能:文件长度为零,或带有换行符。这是因为POSIX vi仅处理文本文件,根据定义,这些文本是以换行符结尾的行。快速检查中,nvi和elvis没有此模式。在我的评论中,我忘记了vim的详细信息:与vile不同,“:set list”不会轻易显示缺少的换行符。这是我在vim中看到的内容:

ssss$
test$
~
~

卑鄙的时候:

ssss^J
test
~
~

对于任一编辑器,您都可以读取文件,更改模式,例如,

:set noeol

并写出文件,以在更新的文件上换行。您可以修改vim 的状态行以显示此信息,而不是直接显示它。默认情况下,似乎没有执行此操作,但是某些打包程序已对此进行了自定义,例如,

"foo" [noeol] 2L, 9C                                          1,1           All

评论之一建议使用“?” 改性剂的的set命令,例如

:set eol?

可能显示如下内容:

noendofline                                                   2,1           All

但在插入模式下,被替换为

-- INSERT --                                                  2,1           All

因此状态行似乎是维护此信息的正确位置。

这些功能已经存在了一段时间:

  • eol根据其源代码中的注释,该功能首次出现在vim 2.4(1994年7月)中。

  • vile的newline模式出现在19937月

(除POSIX vi的文本文件外,nvi,elvis,vim和vile都处理二进制文件)。


2
使用vim已有近20年的时间,我仍在学习有关它的新知识。而且我仍然害怕emacs。:D
蒂姆·肯尼迪

1
在vim中,您还:set eol?可以查看eol是打开还是关闭,因此您不必查看的所有输出:set all
凯文(Kevin)

一种比较混乱的说法是“文件长度为零,或者末尾有换行符”是“所有行都以换行符结尾,而文本文件是零行或更多行的序列”。
R .. GitHub停止帮助ICE,
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.