Vim每行末尾出现^M的问题

150

当我使用Vim和其他编辑器编辑源文件时,有时会在每行末尾出现^M字符。 我认为这与在Windows上编辑文件然后在Linux上编辑有关。 如何自动删除所有这些字符?


19
这是因为Windows使用两个字符(通常写成“\r\n”)表示换行,而UNIX/Linux仅使用第二个字符“\n”表示换行。因此,当你在Linux编辑器上编辑Windows文本文件时,编辑器会看到额外的字符,但它并不认为这些字符属于换行符的一部分,所以它试图呈现它们,结果就是出现了^M。 - David Z
15
David,这还有点需要注意的地方。Vim可以轻松编辑带有DOS换行符的文本文件,而不会显示所有那些“^M”符号。当您在Vim中编辑DOS文本文件时,唯一的指示是如果您的statusline选项值中有%{&ff},则会显示。当行尾样式为混合时,Vim会显示^M。这意味着您使用了一个不像Vim那样聪明的文本编辑器,它没有遵循现有的行尾样式,而Vim默认会这样做。如果您在Windows上使用Vim或类似的软件,您将不会遇到这种破坏行尾的问题。 - Warren Young
3
可能是与此问题将DOS行结尾转换为Linux行结尾在vim中重复。 - cfi
这个回答解决了你的问题吗? 将 ^M (Windows) 的换行符转换为普通的换行符 - Henke
9个回答

138

作为一个命令,输入:

:%s/^M$//

(如果想得到 ^M,按下^V^M。其中^在大多数键盘上是 CTRL 键)


74
为了避免^V^M的麻烦,请执行 :%s/\r$// 命令。同时,注意不要改变原文意思,使翻译更加通俗易懂。 - glenn jackman
11
或者更省略一些::%s/\r$ 可以将回车符号删除。 - sehe
2
@sehe 技术上可以节省2个字符 :) - Chris
@glennjackman,你的提示简单易行,因为我一直在努力获取^V + ^M,但根本没有发生。尽管我反复尝试了不同的策略来获取它们两个,但我只得到了剪贴板中的内容(因为每次^V都有效)。 - itsraghz

101

简单地去除DOS行尾的一种方法是使用ff选项:

:set ff=unix
:wq

现在你的文件回到了好老的Unix方式。

如果你想添加DOS换行符(以便让打印机快乐,或者与没有好工具的Windows朋友传输文件),你可以轻松地走相反的方向:

:set ff=dos
:wq

11
Vim没有发现任何^m、\r或其他行尾符号,但这个方法奏效了。谢谢 :) - SgtPooki
3
Vim无法找到任何^M或\r,但这对我很有效!谢谢@sarnold。 - 7ochem
似乎 Git 太蠢了,无法将这个单字符更改检测出来。我在 Vim 中运行了这个命令,但 git diff 显示每一行都被删除和添加了 :/ - Tommy
汤米,那是“diff”命令的限制,而不是“git”的。 - Spidey

35

您可以这样做:

:set fileformats=dos

它将隐藏^M,而不会影响文件本身。


19
有一个叫做 dos2unix 的程序可以将它们清除。这是因为 Windows 使用不同的换行符导致出现这种情况。

7
这个方法对我在一个所有内容都在一行的文件中起了作用:
首先找到所有匹配项。
:%s/^M//

(要获取^M,请按下大多数键盘上的Ctrl键和V键,然后再按下Enter^M)

然后用换行符替换

:%s//\r/g

组合命令应为:

:%s/^M/\r/g

谢谢,我一直在想如何在搜索替换中输入 Ctrl-M! - Roboprog

2

在重新打开受影响的文件之前,我倾向于使用fromdos进行转换。 fromdostofrodos软件包的一部分。


1
问题的起源可能是通过FTP传输。当您从一个框传输这些文件到另一个框时,请确保使用ASCII传输。使用命令“ASC”。

0
" put this in your ~/.vimrc file and :source ~/.vimrc
" then you can do: Dos2Unix
" dos2unix ^M
fun! Dos2unixFunction()
    let _s=@/
    let l = line(".")
    let c = col(".")
    try
        set ff=unix
        w!
        "%s/\%x0d$//e
    catch /E32:/
        echo "Sorry, first save the file."
    endtry
    let @/=_s
    call cursor(l, c)
endfun
com! Dos2Unix keepjumps call Dos2unixFunction()

0

mcedit:按下Shift+F2,设置Unix格式(LF),确定


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接