【发布时间】:2013-10-14 22:13:46
【问题描述】:
假设我们有两个文本文档:
- 我们的第一个文件包含“@987654321@”作为文本。
- 我们的第二个文件包含“@987654322@”作为文本。
当我们在 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 这样的文本编辑器在他们创建的每个文档的末尾添加不可见的换行符有什么好处,然后继续对用户隐藏这些换行符,以便这些文件的真实内容只有使用其他文本编辑器才能明显检测到?
【问题讨论】:
-
如果你想用变量“require-final-newline”,Emacs 会自然地添加一个最终的换行符。我认为也有一种特定于模式的方法。通用编辑器将字节添加到您没有要求的文件中似乎相当冒昧,但是如果 Vim 仅打算在 Unix 系统上用于编写特定类型的文件,那么也许这是不公平的称它为通用编辑器。
标签: vim emacs newline vi gedit