如何在VIM中隐藏文档结尾的换行符^M

41
在windows上的gvim中,如果文本采用CRLF eol格式,则每行文本末尾会显示^M。如何“隐藏”该特殊字符?:set nolist命令无法消除它。 更新:我将fileformats设置为unix,dos列表格式。一开始没有生效,但是我关闭了文件并重新打开它,然后它就起作用了。默认情况下我只设置fileformats为unix值。感谢回答。
8个回答

40

你可能想要将fileformat设置为dos

:ed ++ff=dos %

2
这似乎“修复”文件,添加 DOS 换行符到缺失的位置,这可能是导致 vim 显示 ^M 标记的原因(在我的情况下)。 - numerodix
4
这个答案和@jqno的答案都是“正确”的,但方式不同。:e ++ff=dos %会在DOS/Windows模式下重新打开当前文件。:set fileformats=dos将导致任何随后打开的文件以DOS/Windows模式打开。有关所有细节的良好解释可在http://vim.wikia.com/wiki/File_format找到。 - Kristopher Johnson

28
为了将它们隐藏起来:
:set fileformats=dos

要删除它们(这样您稍后就可以将文件保存为Unix文件):

:%s/\r//g

6
在我的情况下,执行 :set fileformats=dos 后,我需要通过 :e % 重新加载文件。然后所有的 ^M 字符都消失了。 - arr_sea
如果我使用:set fileformats=dos,我假设我添加的任何新行分隔符也将是dos格式。例如,在“normal”模式下按下<CR>将添加\r\n。这就是我期望的,但如果是这种情况,“隐藏”可能是一种误导性的描述方式。具体来说,它们之所以被“隐藏”,是因为vim现在将换行符表示为\r\n。如果这个假设是正确的,那么答案可以更新以使这更明显吗? - gbromios

15

虽然一次性确定文件格式(DOS或Unix)当然是更可取的方式,但有时候一些同事可能并不太关心源代码管理的规范,不愿意让他们的编辑器符合标准。

在那种情况下,而不是完全转换文件(这会导致根据源代码管理系统完全重写的文件,使“blame”功能无效),我发现假装问题不存在是更好的选择。如果编译器可以容忍,而PHP肯定可以,你可以使用以下命令使混合EOL文件看起来完美无缺:

:match Invisible /\r$/

或者在更新版本的VIM 7.4+中

:match Ignore /\r$/
为了让事情变得更糟,大多数GUI编辑器在文本文件结尾没有加上换行符,并且当文件以换行符结尾时,它们会在底部显示一个空行。由于这有点烦人,大多数人会删除该空行,导致混合EOL文件(并在DOS文件格式中显示可怕的^Ms,如Vim所示)。如果有人知道如何使Eclipse或NetBeans遵守换行符终止而不显示最后一个空行(就像Vim一样聪明),请分享您的知识,您将使一名程序员感到高兴。;-)

当我在运行在Windows上的gvim 7.4上尝试这个命令时,会出现“E28:没有这样的高亮组名称:Invisible”的错误。我需要先做些什么吗? - monojohnny
有趣的是,我已经有一段时间没有使用这个技巧了(因为新工作和更谨慎的同事),现在我在OSX上使用Vim 7.4尝试它时,我得到了相同的错误。我猜Invisible的定义从分发的语法文件中消失了,所以我们可能需要在自己的.vimrc中重新实现它。不幸的是,我不知道它最初是如何编码的。 - wiz
1
我认为更新的语法是 :match Ignore /\r$/ - Kevin Seifert
@KevinSeifert 两者都对我没用,但请参考 https://vi.stackexchange.com/a/39303/2380 - Keith Thompson

1
文件格式通常会自动检测。您的文件中可能混合了Unix和DOS/Windows行。

尝试使用以下方法进行清理(其中“清理”= Unix格式):

% tr -d '\015' < old.file > new.file

额,你说过“在Windows上”。哎呀。那么就受苦吧?每个人都有Cygwin,对吧?我想Windows程序员比*nix程序员多得多,但我往往会忘记这一点(尽管在80年代开始使用MS-DOS)。我自己无法忍受这个东西... - Roboprog

0

我想指出,如果你使用的是完整版的VIM(至少在我的ubuntu 9.10上),它会“按你所需”并自动隐藏它,但是标准的vi(和vim-tiny)不会自动隐藏^M。如果你进行最小安装(或服务器安装),你只会得到vi和vim-tiny。我找到的解决方法是在我的ubuntu上安装适当的vim(apt-get install vim)。希望这能帮助到因同样原因而遇到此问题的人们 :-D


0
:0,$ s/<ctrl-v><ctrl-m>//g
:set ff=dos

0

使用以下命令:

:1,$ s/^v^M/ /g

我也错过了那个细节(不过我确实复制了一份,而不是直接修改原始文件)。 - Roboprog

0
当我的neovim在一些来自node_modules的文件中显示这些丑陋的^M时,我通过添加以下代码到BufWinEnter来解决这个问题:
  if char2nr(getline(1)[-1:-1]) == 13
    e ++ff=dos
  endif


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