vim每行末尾的^ M


132

当我使用vim和其他编辑器编辑源文件时,有时在该行的末尾,我在每行的末尾获得了这些^ M字符。我认为这与先在Windows中然后在Linux中编辑文件有关。如何自动删除所有这些?


18
这是因为Windows使用两个字符的序列(通常写为“ \ r \ n”)来表示换行符,但是UNIX / Linux仅使用第二个字符“ \ n”来表示换行符。因此,当您在Linux编辑器上编辑Windows文本文件时,编辑器会看到多余的字符,它不认为是换行符的一部分,因此它将尝试呈现它们,结果是^ M。
David Z

13
不仅如此,大卫。Vim会愉快地编辑一个以DOS行结尾的文本文件,而不会显示所有这些^M。在Vim中编辑DOS文本文件时,唯一的指示就是%{&ff}您的statusline选项值是否包含。Vim显示^M何时混合行尾样式。这意味着您使用的文本编辑器不像Vim那样精明,它没有遵循现有的行尾样式,因为Vim默认情况下会如此。如果您在Windows上使用Vim或其他类似功能,则不会出现像这样的残破行尾。
沃伦·杨

Answers:


128

作为命令,键入

:%s/^M$//

(要获取^ M,请按^ V ^ M,其中^是大多数键盘上的CTRL)


62
同样,:%s / \ r $ //以避免^ V ^ M麻烦
格伦·杰克曼

8
或者,保存角色::%s/\r$
sehe 2011年

2
@sehe从技术上节省了2个字符:)
克里斯(Chris

@glennjackman,您的提示要容易得多,因为我一直在努力获取^ V + ^ M(如果它根本没有发生)。我所得到的只是剪贴板中的内容(因为^ V每次都有效,尽管我反复尝试使用不同的策略来使它们同时获得)。
itsraghz,

86

剥离DOS行尾的一种简单方法是使用以下ff选项:

:set ff=unix
:wq

现在,您的文件又回到了旧的Unix方式。

如果要添加 DOS行尾(以使打印机满意,或与没有好的工具的Windows朋友一起传输文件),则可以轻松地执行相反的操作:

:set ff=dos
:wq

8
vim找不到任何^ m或\ r或其他任何行尾,但这确实可行。谢谢:)
SgtPooki 2014年

2
Vim找不到任何^ M或\ r,但这确实对我有用!感谢@sarnold
7ochem

git似乎太笨了,无法将其检测为单个字符更改。我在Vim中运行了该程序,并git diff显示了删除的每一行和添加的每一行:/
Tommy

汤米,那是一个限制diff,而不是git
Spidey

34

你可以这样做:

:set fileformats=dos

它将隐藏^M,而无需触摸文件。



6

这对我有用,在一个文件中,所有内容都在一行上:

首先找到所有匹配项

:%s/^M//

(要获取^M,请按^ V ^ M,其中^是Ctrl大多数键盘上的)

然后换行

:%s//\r/g

组合命令为:

:%s/^M/\r/g

谢谢,想知道如何在搜索替换中实际输入Ctrl-M!
Roboprog


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()

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.