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

为什么gedit和vim对用户隐藏最后的换行符?,vim,emacs,newline,vi,gedit,Vim,Emacs,Newline,Vi,Gedit,假设我们有两个文本文档: 我们的第一个文件包含“hi”作为文本 我们的第二个文件包含“hi”作为文本 当我们在gedit、vi或vim中打开这两个文件时,这两个文件在视觉上完全相同 但是,当我们对文件运行xxd时,我们会得到以下结果: 第一个文件的十六进制内容为:6869 第二个文件的十六进制内容为:6869 0a 啊哈!有一条看不见的新线。在vim中,如果我们足够关注状态栏,并且碰巧理解了[noeol]的含义,那么我们可能会了解这一点,但在gedit中,这两个文件的打开方式完全相同 在一项小型

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

  • 我们的第一个文件包含“
    hi
    ”作为文本
  • 我们的第二个文件包含“
    hi
    ”作为文本
  • 当我们在gedit、vi或vim中打开这两个文件时,这两个文件在视觉上完全相同

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

  • 第一个文件的十六进制内容为:
    6869
  • 第二个文件的十六进制内容为:
    6869 0a
  • 啊哈!有一条看不见的新线。在vim中,如果我们足够关注状态栏,并且碰巧理解了
    [noeol]
    的含义,那么我们可能会了解这一点,但在gedit中,这两个文件的打开方式完全相同

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

    我知道vi和gedit希望为他们创建的每个文件添加一个换行符(我承认这可能有好处)。我不明白的是为什么gedit和vim认为可视化地向用户隐藏这条新行是有益的?特别是当这种行为具有潜在的极大破坏性时

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


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

    我相信这是一种惯例,这样做的一个好处是,在连接文件时,您仍然可以区分每个文件的结束位置


    提供了更多的上下文

    ,您认为最后一行“视觉隐藏”来自相反的视点

    许多人(特别是有Unix背景的人)认为文本文件应始终以换行符结尾(例如,请参见),并且任何允许在没有换行符的情况下创建文件的文本编辑器都从根本上被破坏了。从这个角度来看,Vim中没有额外的空行,这与这个世界观是一致的。该文件在编辑器中显示,就像它被
    cat
    插入终端时一样


    从Vim的观点来看,一个缺少换行符的文件是异端和有缺陷的;这就是为什么加载时会显示
    [noeol]
    消息的原因(在保留丢失的换行符的同时编辑文件是相当困难的;尽管我已经编写了相应的代码来帮助它)。

    我理解(并承认)结束换行符有好处。我不明白的是,为什么这在视觉上对用户隐藏?(即,在vim中,最后一个换行符没有视觉表示,而是出现一个~,好像文件中没有任何内容。然而,实际上vim中的每一个其他换行符都有一个空行来表示它的存在,为什么不是最后一个?@schulwitz,因为它不存在,所以不显示该空行。)。EOL字符通常有两种解释:“在我之后的任何东西都必须被视为在新的行上”和“在我之后出现新的行”。大多数GUI文本编辑器/IDE,无论是否具有UNIX背景,都遵循第一个(错误的一个):EOL之后的内容被认为是一行,并且编辑器显示它,即使不符合“行”的逻辑定义。大多数UNIX文本编辑器遵循第二种方法:因为在最后一次EOL之后没有任何内容可以显示。我认为这只是对概念的不同看法。在UNIX世界中,最后一个新行被认为是一个行终止符,而在Windows世界中,人们似乎认为它是一个行分隔符,因此从行终止符的观点来看,根本没有从用户隐藏的最终新行。我将其改写为:在Vim对EOL字符的概念视图中,当文件末尾没有EOL时,只有一行不完整,因为它没有EOL。对于下线,仍然只有一条线,并且它被正确终止。在其他编辑器的视图中,当文件末尾没有EOL时,文件中就有一行,这一行没有什么特别之处。如果文件末尾有EOL,则有两行由EOL分隔,最后一行为空。来自Windows背景,您的回答有助于澄清unix文本编辑器/文本文件的期望,谢谢。然而,我不认为“视觉隐藏”仅仅是一个视点(即,如果两个不同的文本文件在用户眼中显示相同,那么客观地说,“视觉隐藏”是存在的)。如果vi在它创建的每个文件的末尾显示一个不可修改的空行,它将满足您的unix文本文件/文本编辑器的期望,同时也为遇到没有最后换行符的文本文件的用户提供一个对比的视觉表示。@schulwitz,为什么Vim要显示一个不存在的行,就像它没有一样?改为修复EOL字符的所有错误解释怎么样?用户可以很好地看到最后一行是否没有以状态行中带有
    [noeol]
    的下线结束。谢谢。从“Unix透视图”来看,这两个文件实际上是相同的(并且