为什么gedit和vim会隐藏用户的最终换行符?

时间:2013-10-08 05:53:04

标签: vim emacs newline vi gedit

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

  1. 我们的第一个文件包含“hi”作为文字。
  2. 我们的第二个文件包含“hi”作为文字。
  3. 当我们在gedit,vi或vim中打开这两个文件时,这两个文件在各方面都在视觉上相同。

    但是,当我们对文件运行xxd时,我们会得到以下结果:

    1. 我们的第一个文件的十六进制内容为:6869
    2. 我们的第二个文件的十六进制内容为:6869 0a
    3. 啊哈!有一个看不见的换行符。在vim中,如果我们对状态栏给予足够的关注并且碰巧理解[noeol]意味着什么,那么我们可能接受这个,但在gedit中,这两个文件准确打开一样!

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

      据我所知,vi和gedit想为他们创建的每个文件添加换行符(我承认这可能有优势)。我不明白为什么gedit和vim认为从用户那里直观地隐藏这条换行符是有益的?特别是当这种行为可能非常破坏性......

        

      (例如,两个C程序员在他们的vi / gedit文本编辑器中看到这两个文件的内容相同,然后假设他们看到的是他们得到的内容,继续将内容写入数组char greeting[2]。编写第一个文件的第一个程序员 - 虽然他的代码有点草率 - 继续名声和财富,但第二个编写第二个文件的程序员死于悲惨的贫困,这个看不见的混淆和困惑(并且可以预防)堆栈溢出。)

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

2 个答案:

答案 0 :(得分:10)

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

许多人(特别是Unix背景)认为文本文件应始终以换行符结尾(例如,请参阅Why should text files end with a newline?),并且任何允许创建没有它的文件的文本编辑器都会从根本上被破坏。从这个角度来看,Vim中没有额外的空行只与这个世界观一致。该文件在cat进入终端时显示在编辑器中。

从Vim的角度来看,缺少换行的文件是异端的,有缺陷的;这就是为什么在加载[noeol]消息时表示它的原因(并且在保留缺少的换行符的同时编辑文件非常困难;虽然我已经写了PreserveNoEOL plugin来帮助它。)

答案 1 :(得分:1)

我相信这是一个惯例,是从vi延续下来的。这样做的一个优点是,在连接文件时,您仍然可以区分每个文件的结束位置。

提供了更多上下文in this thread on the vim_use mailinglist