14

假设我们有两个文本文档:

  1. 我们的第一个文件包含“ hi”作为文本。
  2. 我们的第二个文件包含“ hi”作为文本。

当我们在 gedit、vi 或 vim 中打开这两个文件时,这两个文件在各个方面在视觉上都是相同的。

但是,当我们xxd在文件上运行时,我们会得到以下信息:

  1. 我们第一个文件的十六进制内容如下:6869
  2. 我们的第二个文件的十六进制内容为:6869 0a

啊哈!有一个看不见的换行符。在 vim 中,如果我们足够密切地关注状态栏并且碰巧理解了它的[noeol]含义,那么我们可能会理解这一点,但在 gedit 中,两个文件打开的完全一样!

在一项小型调查中,当我要求人们仅使用 gedit 或 vim 来区分这两个文件时,他们 100% 的时间都失败了。当我要求他们使用 Leafpad 或 emacs 完成相同的任务时,他们 100% 的成功。

我知道 vi 和 gedit 想在他们创建的每个文件中添加一个换行符(我承认这可能有好处)。我不明白为什么 gedit 和 vim 认为在视觉上对用户隐藏这个换行符是有益的?尤其是当这种行为具有潜在的极具破坏性时……

(例如,两个 C 程序员在他们的 vi/gedit 文本编辑器中看到这两个文件的内容相同,然后假设他们看到的是他们得到的,继续将内容写入数组char greeting[2]。第一个编写第一个文件的程序员——尽管他的代码有点草率——继续名利双收,但是编写第二个文件的第二个程序员死于悲惨的贫困中,被这种看不见的(和可预防的)堆栈溢出弄糊涂了。)

所以请告诉我,像 vim 和 gedit 这样的文本编辑器在他们创建的每个文档的末尾添加不可见的换行符有什么好处,然后继续对用户隐藏这些换行符,以便这些文件的真实内容只可见可以使用其他文本编辑器检测到吗?

4

2 回答 2

10

您认为最后一行是“视觉上隐藏的”源于相反的观点。

许多人(尤其是具有 Unix 背景的人)争辩说文本文件应该始终以换行符结尾(例如,请参阅为什么文本文件应该以换行符结尾?),并且任何允许在没有它的情况下创建文件的文本编辑器从根本上被破坏了。从这个角度来看,Vim 中没有额外的空行只是符合这个世界观。该文件出现在编辑器中,就像它被cat编辑到终端时一样。

从 Vim 的角度来看,缺少换行符的文件是异端和有缺陷的;这就是为什么它[noeol]在加载时显示消息(并且在保留缺少的换行符的同时编辑文件非常困难;尽管我已经编写了PreserveNoEOL 插件来帮助解决这个问题)。

于 2013-10-08T06:50:21.137 回答
1

我相信这是一个惯例,它是从 vi 继承而来的。这样做的一个好处是,在连接文件时,您仍然可以区分每个文件的结束位置。

vim_use 邮件列表的这个线程中提供了更多上下文

于 2013-10-08T06:19:38.653 回答