当我将一行复制到另一个文件时,为什么vim会剥离回车?

时间:2016-01-22 05:14:58

标签: vim

我将文件a.csv整理为b.csv

我注意到文件的大小不同,并且注意到b.csv正好n个字节更小(其中na.csv中的行数) ,我立即怀疑a.csv包含那些讨厌的\r

用于排序的.py脚本包含删除回车符的行line.strip(),然后写入换行符但没有回车符的afile.write(line2 + '\n')

确定。有道理。

奇怪的是,当我vim' d a.csv时,我没有像往常一样看到^M(可能原因在于配置文件),所以我只是在十六进制编辑器中打开文件时发现了\r

更有趣的一点是,我会将一小部分a.csv3y)并将其粘贴到测试文件(p)。

对测试文件进行排序会生成与原始文件大小完全相同的文件。

xxd开始,我看到新测试文件中没有\r

当我抽出一个包含回车符的行并将其粘贴到另一个文件中时,粘贴的行不包含回车符。为什么?

我在Windows(Cygwin)上对此进行了测试,看起来确实复制了\r。但是在我使用的Linux机器上,它并没有。

怎么回事?

修改

我尝试在另一台Linux机器上重现这个问题,但我无法做到。它似乎是一个配置的东西 - 某个文件告诉vim这样做。

2 个答案:

答案 0 :(得分:3)

打开文件时(根据'fileformats'选项),Vim检测换行样式(Windows CR-LF与Unix LF),并使用检测到的'fileformat'所有后续保存的值。因此,换行样式是Vim缓冲区/打开文件的属性。当您从一个缓冲区中拉出行并将其粘贴到另一个缓冲区时,不会保留换行符样式;相反,使用目标缓冲区的换行符样式,因为这更有意义。

答案 1 :(得分:3)

Vim的加载文件模型是一系列行,每行包含一系列字符。在此模型中,换行符本身不是字符。因此,当您复制文本行时,您不会复制CR或LF。 Vim还存储了许多其他信息,用于再次将文件写回来,主要是:

fileformat可以是unixdosmac。这决定了在每行末尾写入的行尾字符。

endofline可以开启或关闭。这确定文件的最后一行是否具有行尾字符。

bomb可以开启或关闭。这确定是否在第一行的开头写入了字节顺序标记。

fileencoding指定用于存储文件的字符编码,例如utf-8

通常这些都是在加载文件时自动检测到的。特别是,fileformat将根据fileformats选项中的设置自动检测,^M选项可能在不同平台上配置不同。但是,有时事情可能会出错。最常见的问题是文件可能具有混合的行结尾,而当您开始看到:set fileformat?浮动时。在这种情况下,Vim将文件加载为unix格式 - 它将LF视为行分隔符,将CR视为普通字符。您可以通过输入set ff?或仅{{1}}来查看Vim打开文件的模式。