【问题标题】:Why does vim sometimes show ^M and sometimes not (even if they are there)?为什么 vim 有时显示 ^M 而有时不显示(即使它们在那里)?
【发布时间】:2014-01-20 08:07:39
【问题描述】:

我正在尝试从项目 git 存储库中删除所有 CLRF 字符。我正在编写一个命令以递归方式通过 repo grep 以查找实例。但是,在 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 贯穿始终。

我只是对为什么 vim 有时会显示它们而有时不感兴趣。

编辑:

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

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

然后用vim打开文件,视觉上的^M不见了,但是od -cx还是显示\r\n,但是我又跑了

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

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

【问题讨论】:

    标签: vim sed eol


    【解决方案1】:

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

    当打开一个文件时,vim 会尝试检测它是 MS-DOS/Windows 还是 unix 文件。如果所有行都以\r\n 结尾,它可能是一个 DOS 文件,如果只有其中一些是,vim 也可能假设为 unix。如果文件格式设置为DOS,vim读取文件时会忽略\r,读取文件后直接在状态行显示[dos]。

    回写文件时,每行以\r\n 结束;如果文件格式是 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 将有 \r\n 行尾,z.txt 不会。

    当文件中只有部分(而非全部)行以\r 结尾时,例如,如果 (unix) git 在 dos/windows 上创建的文件中添加了一些标头(没有 \r),则该文件格式检测首先查看标题,假定为 unix,在读取时不会从文件的其余部分中删除 \r,并将其显示为 ^M

    【讨论】:

    • 这是很好的信息,谢谢。我仍然不完全明白为什么如果vim看到它是dos格式(来自vim底部的信息栏)并且cli工具'file'说它是一个带有CRLF行终止符的文件,但vim没有显示^M 编辑器打开时。然后在其他文件中显示 ^M。 编辑哦,我明白了,显示 ^M 的文件混合了 dos/unix 行结尾,而那些不显示 ^M(但 od -cx 报告)的文件具有所有 CRLF 结尾所以VI必须决定以'unix'模式显示并主动显示^M
    • 你写错了顺序。 y.txt 将只有 \n,而 z.txt 将有 \r\n
    【解决方案2】:

    @Guntram Blohm 是对的,但他遗漏了部分答案:'fileformats' 选项(缩写 'ffs')。如果你

    :set ffs=unix
    :e dosfile.txt
    

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

    :help 'ffs'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-12-20
      • 1970-01-01
      • 1970-01-01
      • 2019-06-18
      • 2021-09-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多