2011-04-30 166 views
370

我在我的vimrc中不断收到^M字符,它破坏了我的配置。^M字符在Vim中的含义是什么?

+27

BTW [这](http://vimdoc.sourceforge.net/htmldoc/digraph.html#digraph -table)是一个很好的资源。 – 2011-04-30 18:05:27

+0

@LightnessRacesinOrbit - 嗯,它现在也可以工作。我收回了我的评论,说链接已经死了。 – ArtOfWarfare 2015-07-23 11:27:17

+2

针对@LightnessRacesinOrbit链接的镜像,此时关闭:http://www.fifi.org/doc/vim/html/digraph.html#digraph-table – alexpls 2015-09-04 03:23:40

回答

408

Unix对换行符使用0xA。 Windows使用两个字符的组合:0xD 0xA。 0xD是回车符。 ^M恰好是vim显示0xD的方式(0x0D = 13,M是英文字母中的第13个字母)。

:%s/^M//g 

凡通过按住Ctrl键并键入v其次,并进入^M然后释放按Ctrl

您可以通过运行以下删除所有^M字符。有时缩写为^V^M,但请注意,您必须按照上一句中所述输入它,而不是按字面输入。

该表达式将用空字符串替换所有出现的^M(即没有)。我使用它来摆脱从Windows复制到Unix(Solaris,Linux,OSX)的文件中的^M

+8

如果你在Windows上,Ctrl + V可能会被映射为粘贴。如果是这种情况,则默认值将“特殊字符转义”键重新映射到Ctrl + Q。 – 2011-05-01 17:45:25

+5

真正的问题是为什么Vim有时会自动检测行结束并正确显示,有时不会。 – Scott 2013-02-24 17:30:29

+9

如果文件有不匹配的行结束符,你会看到'^ M'字符。使用Tomasz提供的命令,然后输入':fileformat = {unix | dos | mac}',具体取决于您定位的操作系统。如果只有几行没有'^ M'字符,你可能需要':fileformat = dos'。如果你使用vim以外的编辑器编辑文件,请确保它被配置为匹配行尾(记事本不会这样做,但是任何有信誉的编辑器,如Notepad ++或TextMate都会这样)。 – 2013-05-27 19:17:52

31

这可能意味着你已经得到回车(不同的操作系统使用不同的方式表示行结束)。

使用dos2unix修复的文件或在vim设置fileformats:

set ffs=unix,dos 
4

您可以用VIM

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

其中^是控制字符解决这个问题。

+2

这并不能解释'^ M'是什么。 – 2011-04-30 18:01:23

+2

他并不真正在问它是什么,他在问如何解决这个问题。它是从DOS返回的字符。 – 2011-04-30 18:03:16

+3

_I_知道它是什么。问题的标题是“^ V字符在Vim中的含义”。 – 2011-04-30 18:04:38

2

如果它打破了你的配置,以及^ M字符被映射需要,你可以简单地通过<Enter>甚至<C-m>(包括类型为简单的字符序列,所以7首5个字符,分别)替换^ M字符。

这是在映射

98
:%s/\r//g 

今天为我工作的特殊存储键码的单推荐,可移植的方式。但是我的情况可能略有不同。

+0

g选项不是必需的,每行只有一个新行。 ':%s/\ r //'就足够了。 – frogcoder 2015-12-17 03:39:50

+4

g选项可能非常需要,因为回车不一定是换行符。在Unix模式下打开时,回车符只是另一个字符,并且在Windows模式下打开时,回车符只是紧跟在换行符之后。 – 2016-04-14 02:48:54

2

在FreeBSD中,您可以手动键入以下清除^M

:%s/按Ctrl + V,然后按Ctrl + 中号,然后按Ctrl + 中号一次。

47

要转换新的生产线,而不是将其取出:

:%s/\r/\r/g 
+1

这实际上应该做什么?对我来说,它看起来像在做一个像like一样的替代,我无法想象会改变任何事情。我是否错过了关于语法在这里的工作原理的特别之处? – 2014-10-20 14:02:24

+20

这伏都教实际上工作 – Andre 2015-03-29 21:09:55

+8

@PlatinumAzure我不知道为什么没有人想过要回答你的问题。 '\ r'在搜索部分与替换部分有不同的行为。例如,请参阅http://stackoverflow.com/a/3834303/。 – 2015-11-17 22:09:25

4

我用的是Mac用户的方式在Windows计算机上最初生成和使用将其导入到一个Linux的MySQL数据库需要一个文本文件load data命令。

虽然VIM显示'^ M'字符,但以上都不适用于我的特定问题,数据将导入但始终以某种方式损坏。最终解决方案非常容易(经过多次挫折之后)。

解决方案: 执行dos2unixTWICE在同一个文件上做的伎俩!使用file命令可显示沿途发生的情况。

$ file 'file.txt' 
file.txt: ASCII text, with CRLF, CR line terminators 

$ dos2unix 'file.txt' 
dos2unix: converting file file.txt to UNIX format ... 
$ file 'file.txt' 
file.txt: ASCII text, with CRLF line terminators 

$ dos2unix 'file.txt' 
dos2unix: converting file file.txt to UNIX format ... 
$ file 'file.txt' 
file.txt: ASCII text 

而且文件的最终版本完全导入到数据库中。

4

我删除了他们所有SED:

sed -i -e 's/\r//g'

也可以使用不同的字符串或字符替换:

sed -i -e 's/\r/string/g'

5

在Unix中它可能是更容易使用 'TR'命令。

cat file1.txt | tr "\r" "\n" > file2.txt 
13

比方说,你的文本文件 - file.txt的,然后运行该命令 -

dos2unix file.txt 

它的文本文件,从DOS到UNIX格式转换。

0

我发现,由于我的Homebrew Mvim实例被设置为使用filetype = dos,我一直在污染文件数周。在.vimrc中做了必要的更改....

0

尝试:%s/\^M//至少这对我有效。

0

如果您没有特意指定不同fileformat(例如,对于Windows文件,说明为:e ++ff=unix),则目标文件可能具有混合EOL。

例如,如果一个文件有<CR><NL>结尾部分线路和其他人 <NL>的结局,并fileformat是Vim阅读时,会自动设置为unix^M (<CR>)将出现。 在这种情况下,fileformats发挥作用。详情请参阅:help ffs

1

这只是在我的情况下工作的事情:

:e ++ff=dos

:wq