我正在尝试从项目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'