为什么VIM有时会显示 ^m,有时甚至不显示(即使它们在那里)

  • 本文关键字:显示 在那里 VIM vim sed eol
  • 更新时间 :
  • 英文 :


我正在尝试从项目git回购中删除所有CLRF字符。我正在编写一个命令以递归递归以查找实例。但是,在VIM中打开时,有些"命中"非常明确地表明存在 ^m,而其他"命中"没有显示这些字符。

但是,运行

file <filename without visual ^M> 

它说

blah.java ASCII Java program text, with CRLF line terminators

od -cx <filename without visual ^M>

用 r n peperded返回。

我只是感兴趣的,为什么VIM有时会显示它们,有时不显示它们。

编辑:

我创建了一个测试文本文件,并手动添加了 ^m(即ctrl v ctrl m),并显示了这些字符。然后我跑了:

sed -i '' -e 's/r//g' controlm.txt

并用vim打开文件,视觉 ^m消失了,但是od -cx仍然显示 r n,但是我然后ran

sed -i '' -e 's/^M//g' controlm.txt

然后,它不仅删除了vim中的视觉 ^m,而且我确认od -cx显示 r n现在只是n。

这个问题最好在superuser.com上,而不是在这里问,因为它是关于使用vim而不是编程。但是要回答:

打开文件时,VIM试图检测是MS-DOS/Windows还是Unix文件。如果所有行均由rn终止,则可能是一个DOS文件,如果其中一些文件是,则VIM也可以假定UNIX。如果将文件格式设置为DOS,则VIM在读取文件时忽略r,并在阅读文件后直接在状态行中显示[DOS]。

写回文件时,它将用rn终止每一行;如果文件格式为unix,它将用n终止行。您可以使用命令

设置模式
:se fileformat=unix

:se fileformat=dos

尝试在Windows中创建文件x.txt,在VIM中打开它。然后,:se fileformat=unix:w y.txt;然后:se fileformat=dos:w z.txt。用od cx测试Y.TXT和Z.TXT。y.txt将具有rn线结尾,z.txt不会。

当文件中只有某些但不是全部,即r中的行结束时,例如(unix)git添加了一些标头(没有 r)到DOS/Windows在DOS/Windows上创建的文件时,文件格式检测会看到首先,假设Unix,在阅读时不会从文件的其余部分中删除r,并将其显示为^M

@guntram blohm是正确的,但他遗漏了答案的一部分:'fileformats'选项(简短表格'ffs')。如果您

:set ffs=unix
:e dosfile.txt

然后,vim将顽固地拒绝接受CRLF线的结尾,并将明确显示所有^M字符。

:help 'ffs'

相关内容

最新更新