gVim明确设置文件模式为DOS,但仍显示回车符(^M)

82

我在Windows上使用gVim。我的代码末尾显示了^M字符。我使用:set ff=dos,但没有用。现有行中的^M字符仍然存在,但是我输入的新行不会显示出来。我已经切换到mac模式(显示^J字符)和unix模式(同样显示^M字符),然后又切换回dos模式。有其他人也遇到这个问题吗?


请参考 http://vim.wikia.com/wiki/File_format 了解 vim/gvim 中的行尾符问题的全面解释。该链接还说明了如何解决这个问题。 - axiopisty
这个问题不是以下三个问题中的任何一个的重复,但我认为它值得与它们链接。 https://dev59.com/a2025IYBdhLWcg3wtoVA * https://dev59.com/eXRA5IYBdhLWcg3w0xjk * https://dev59.com/U3VD5IYBdhLWcg3wHnwX - Henke
10个回答

144
当Windows和Unix的换行符混合使用时会出现这种情况。例如,如果你有100行代码,99行是\r\n换行符,而只有一行是\n换行符,那么你会看到99个^M字符。解决方法是找到那一行并进行替换,或者在文件上运行dos2unix命令。你可以用以下命令将Windows的换行符替换为Unix的换行符: :%s/\r\(\n\)/\1/g

1
呵呵,典型的选择。Vim很棒,所以坚持使用它吧! :-) - richq
2
我希望我能为此给你 +1000。 - erik
3
我通常只需使用命令“:%s/^M//”将其删除。 - TMN
1
如果您希望它在完成时成为dos格式,可以添加到:set ff=dos,就像Evan的回答一样。 - Merlyn Morgan-Graham
请参阅vim行尾的全面解释中的“转换混合文件”部分,网址为http://vim.wikia.com/wiki/File_format。 - axiopisty
显示剩余3条评论

45

4
这正是我正在寻找的,并且是确切的正确答案。谢谢。 - Jay Taylor
这个命令行也可以很好地工作:vim -R -c ":e ++ff=dos" 文件名 - undefined

19

我通常使用以下方法清除我的行尾:

:g/^M$/s///

通常我会按下ctrl-Q,然后按下ctrl-M来得到ctrl-M。在某些环境中可能需要按下ctrl-V,然后按下ctrl-M。我不知道为什么,但我发现这个方法比rq更容易记住。
别忘了执行:set ff=dos,否则你最终保存的文件仍将使用UNIX换行符。

是的,我通常使用带有Ctrl-Q和所有这些的^M版本。但是它更难解释;-)并且组匹配版本更适合复制粘贴。 - richq

15

我知道这个问题已经有了答案,但是我使用的一个技巧是

:%s/\r/\r/g

这将把Unix换行符替换为Windows换行符CRLF。加上这句话,以防其他人遇到问题。


6

你可以忽略这些字符!

将以下内容添加到您的vimrc中:

匹配 Ignore /\r$/


1
很高兴知道这个存在,但是文件中留下不匹配的行结尾有什么好处吗?看起来会引起麻烦。 - Jerph
1
这正是我所需要的(当更改文件会导致某些版本控制系统中出现大量更改时,更改文件并不总是明智的选择)。 - RunHolt
很不幸,一旦你保存文件,它就会改变行尾。因此,它会产生完全不想要的大量空格变化,只是没有显示给你看。至少对我来说是这样的。 :( - peschü

4

实际上,在我这里(64位Windows,gVIM: 7.2),有效的方法是:

:set ffs=dos

not just: ff


4
在Windows 7上运行Vim 7.3,我使用了以下命令:
:%s/^M/\r/g

为了创建 ^M,我按下 CTRL+Q 然后按下 CTRL+M。

2

这可能对你们中的许多人来说有点简单,但如果有用的话就试试吧。

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

function! D2u()
    execute '%s/\r\(\n\)/\1/g'
endfunction
"map d2u :%s/\r\(\n\)/\1/g

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


2

尝试了很多方法,但以下方法起作用:

:%s/\r/\r/g

注意:如果您想在整个文件上产生影响,请使用

2

这些是额外的CR行结尾,通常是由于在混合UNIX / DOS系统上使用文件引起的。

可能最简单的方法是从每行末尾删除单个^M,我使用的方法是:

:%s/\r

这与以下代码等效:

:%s/\r//

但是末尾的斜杠并非必需(它们被默认为存在)。

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