在我的 Emacs 文件中出现的 ^ M 是什么?

我认为这可能与 TextMate 有关,但是我们在一个小团队中工作,在 git 中几乎相同的文件的完整文件冲突有一些问题-在一个分支中,文件在每一行后面都有 ^ M。

这个神秘的 ^M字符应该做什么,它可能来自哪里?

我们的开发人员在 Windows/Mac 上使用 emacs,在 Mac 上使用 TextMate,在 Mac 上使用 coda,偶尔使用 wp-admin 文本编辑器。

有人曾经因为这些事情有过这样的问题吗?

126354 次浏览

它们与 DOS 风格的行尾和 Unix 风格的不同有关。看看 维基百科文章。您可以找到 dos2unix 工具来帮助解决这个问题,或者自己编写一个小脚本来修复它们。

编辑 : 我发现了以下 Python 示例代码 给你:

string.replace( str, '\r', '' )

有人没有正确地转换行结束字符

我猜是 Windows 的人,因为他们喜欢他们的 CRLF。Unix 喜欢 LF,Mac 喜欢 CR,直到它被展示出 Unix 的风格。

Git-config中,将 core.autocrlf设置为 true,使 git 自动为您的平台正确地转换行结尾,例如,为全局设置运行以下命令:

git config --global core.autocrlf true

^M0x0d,即回车返回字符。如果显示类似于

line 1^M
line 2^M

那么文件必须来自 Windows,因为 Windows 上的标准换行序列是 CR LF(0x0d 0x0a) ,而 Unices 上的标准换行序列仅由 LF组成。

如果该文件来自 MacOS9或更早的系统,则可以将其视为

line 1^Mline 2^M

因为在回车之后不会有换行。

在 Emacs 中,行尾的 ^M表示回车(r)后跟换行符(n)。如果有人在 Windows 上编辑文件(行尾是回车符和换行符的组合) ,而你在 Unix 或 Linux 上编辑(行尾只是换行符) ,你经常会看到这种情况。

字符的组合通常是无害的。如果使用源代码管理,则可以配置文本文件签入格式,以便神奇地为您调整行。或者,您也可以使用 checkin 和 checkout 触发器来自动“修复”文件。或者,您可以使用像 Dos2unix这样的工具来手动调整事物。

正如大家所说,这是不同的结尾风格。 MacOSX 使用 Unix 行结束符——即 LF (换行符)。

Windows 同时使用 CR (回车)和 LF (换行)作为换行结束。 因为你同时使用了 windows 和 mac,这就是问题的根源所在。

如果您在 windows 中创建一个文件,然后将其放到 mac 上,您可能会在行的末尾看到这些 ^ M 字符。

如果你想删除他们,你可以很容易做到这一点,在 emacs。只需突出显示并复制 ^ M 字符,然后执行查询-替换 ^ M,就可以完成了。

编辑: 其他一些可能有帮助的链接。 林克

这个工具可以帮助您配置 emacs 以使用特定类型的行结束样式。 Http://www.emacswiki.org/emacs/endoflinetips

代替查询替换,您还可以使用 M-x 删除尾随空格

在你的 ~/.emacs(或等价物)中放入以下内容

(defun dos2unix ()
"Replace DOS eolns CR LF with Unix eolns CR"
(interactive)
(goto-char (point-min))
(while (search-forward "\r" nil t) (replace-match "")))

然后你就可以简单地使用 M-x dos2unix

我之前碰到过这个问题。^ M 表示回车,在 Ctrl-Q Ctrl-M上搜索(这创建了一个文字 ^ M)将允许您在 Emacs 中获得这个字符的句柄。我做了一些类似的事情:

M-x replace-string [ENTER] C-q C-m [ENTER] \n [ENTER]

参见:

在 emacs 中隐藏 ^ M

如果您选择删除 ^ M 字符并重新提交给您的团队,请小心。他们可能会看到一个没有马车返回后文件。

我正在 Mac OS上使用 安卓工作室(JetBrains IntelliJ IDEA) ,我的问题是,在 GitHub上的拉请求中,^ M 开始出现在一些文件中。 对我有效的方法是为一个文件更改行分隔符。

在编辑器 中打开所需的文件 文件 转到 那么分线器 为你选择最好的选择 (对我来说是 LF-Unix 及 OS X (n))

根据下一篇文章,这个问题是操作系统之间行尾混淆的结果: Http://jonathonstaff.com/blog/issues-with-line-endings/

你可以在这里找到更多信息: Https://www.jetbrains.com/help/idea/configuring-line-separators.html#d84378e48

enter image description here

要使 ^ M 在 git 中消失,输入:

git config --global core.whitespace cr-at-eol

图片来源: Https://lostechies.com/keithdahlby/2011/04/06/windows-git-tip-hide-carriage-return-in-diff/

如果你没有在你的系统上安装 dos2unix 工具,你可以创建你自己的来去除 Windows 结尾字符:

vi ~/dos2unix.bash:

内容如下

#!/bin/bash
tr -d '\r' < $1 > repl.tmp
mv -f repl.tmp $1

在您的 ~/. bashrc 中,添加以下行:

alias 'dos2unix=~/dos2unix.bash'

申请

dos2unix file_from_PC.txt

将删除 file _ from _ PC.txt 中行尾的 ^ M 字符。你可以通过使用 cat 来检查你是否有这些东西:

cat -v file_from_PC.txt

我的解决方案是使用这个 Emacs 维基文章中的如下省略函数。

 (defun dos2unix ()
"Not exactly but it's easier to remember"
(interactive)
(set-buffer-file-coding-system 'unix 't) )

在缓冲区上执行函数 M-x dos2unix并保存文件,所有的 ^M都将消失。

使用 emacs 命令一行程序去除 ^ Ms 最简单的方法之一:

    C-x h C-u M-| dos2unix

分析:

    C-x h: select current buffer
C-u: apply following command as a filter, redirecting its output to replace current buffer
M-| dos2unix: performs `dos2unix` [current buffer]

* nix 平台具有开箱即用的 dos2unix实用程序,包括 Mac (带有 brew)。在 Windows 系统下,它也被广泛使用(MSys2,Cygwin,abc2等等)。