gVim即使在文件模式显式为DOS时也显示回车符(^ M)


78

我在Windows上使用gVim。我的代码^M在行尾显示了字符。我曾经:set ff=dos无济于事。这些^M字符将保留在现有行中,但不会出现在我输入的换行符中。我将模式切换为mac(显示^J字符)和unix(也显示^M字符),然后又回到了dos。其他人看到了吗?


有关vim / gvim中行尾的全面说明,请参见vim.wikia.com/wiki/File_format。此链接还说明了解决问题的方法。
axiopisty

Answers:


139

当您混合使用Windows行尾和Unix行尾时,会发生这种情况。如果您有100行,其中99是\ r \ n,而其中一是\ n,则会看到99 ^ M个字符。解决的办法是找到那一行并替换它。或在文件上运行dos2unix。您可以将Windows行尾替换为:

:%s/\r\(\n\)/\1/g


在您写这篇文章之前,我发现其中一行。:) 谢谢!
耶夫2009年

1
嘿,典型。Vim很棒,所以坚持下去!:-)
richq

2
我希望我能给你+1000
the_e 2010年

3
我通常只是捶“时间与:%s/^M//
TMN

1
:set ff=dos如果您希望完成后要做的事情应该添加到此,ala Evan的答案。
Merlyn Morgan-Graham


19

我通常使用以下内容来清理行尾:

:g/^M$/s///

要获取ctrl-M,我通常先键入ctrl-Q,然后键入ctrl-M,然后将其放入。(在某些环境中,可能是ctrl-V,然后是ctrl-M。)我不知道为什么,但是我发现比rq更容易记住。

别忘了:set ff=dos做得好,否则您最终仍将保留UNIX行尾。


是的,我通常将^ M版本与Ctrl-Q结合使用。但是,解释起来比较困难;-)并且组匹配版本是可复制粘贴的。
richq

15

我知道已经回答了,但是我使用的一个技巧是

:%s/\r/\r/g

这将用窗口CRLF替换unix回车。只是添加,以防其他人遇到问题。


6

您可以忽略这些字符!

将此放入您的vimrc

匹配忽略/ \ r $ /


1
很高兴知道这里是否存在,但是是否存在将不匹配的行尾保留在文件中的好用例?好像是自找麻烦。
耶夫2013年

1
这是我所需要的(在某些版本控制系统中对文件造成大量更改时,更改文件并不总是明智的)
RunHolt 2014年

不幸的是,保存文件后,这会立即更改行尾。因此,它仅在不向您显示的情况下,在空白中产生了这些不必要的大变化。至少对于我来说。:(
peschü

4

实际上,对我有用的(在64位Windows上,gVIM:7.2)是:

:set ffs=dos

不只是:ff


4

在Windows 7上运行Vim 7.3。我使用以下命令:

:%s/^M/\r/g

若要创建^ MI,请先按CTRL + Q,然后按CTRL + M。


2

对于您中的许多人来说,这可能有点简单,但是很有用。

根据richq的回答,我发现这些在我的vimrc中很有用。注意,第二个通常被注释掉,因为它会使dd有点混乱,因为如果Vim是映射的ex命令,它将等待另一个按键来确定。

功能!D2u()
    执行'%s / \ r \(\ n \)/ \ 1 / g'
终端功能
“ map d2u:%s / \ r \(\ n \)/ \ 1 / g

第一个通过键入call D2u()ex来运行,第二个通过D2u在编辑模式下按来运行。


2

这些是多余的CR行尾,通常是因为在UNIX / DOS混合系统上使用了文件。

从每行末尾删除单个^ M的最短答案可能是,我使用的是:

:%s/\r

等效于:

:%s/\r//

但不需要使用斜杠(假定为斜杠)。


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.