什么是这些^ M一直出现在我的emacs文件中?

时间:2009-11-30 22:26:30

标签: git emacs newline

所以我认为它可能与textmate有关,但是我们在一个小团队中工作,并且在git中存在几个相同文件的完整文件冲突的问题,因为一个分支的每一行都附加了^ M

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

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

任何人都有这个问题源于其中一个吗?

15 个答案:

答案 0 :(得分:97)

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

git config --global core.autocrlf true

答案 1 :(得分:90)

Someone is not converting their line-ending characters correctly

我认为这是Windows用户,因为他们喜欢他们的CRLF。 Unix喜欢LF,Mac喜欢CR,直到用unix方式显示它。

答案 2 :(得分:28)

^M0x0d,即回车符。如果您的显示器看起来像

line 1^M
line 2^M

然后该文件必须来自Windows,因为Windows上的标准换行序列为CR LF0x0d 0x0a),而标准换行序列仅包含LF的Unices。

如果文件来自Mac OS 9或更早版本的系统,您会将其视为

line 1^Mline 2^M

因为回车后没有换行符。

答案 3 :(得分:13)

要使^ 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/

答案 4 :(得分:8)

它们与DOS风格的行结尾和Unix风格之间的区别有关。查看Wikipedia article。您可以找到dos2unix工具来帮助,或者只是编写一个小脚本来自行修复它们。

修改:我找到了以下Python示例代码here

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

答案 5 :(得分:6)

代替查询替换你也可以使用 M-x delete-trailing-whitespace

答案 6 :(得分:4)

Emacs行末尾的

^M表示回车符(\ r)后跟换行符(\ n)。如果一个人在Windows上编辑文件(行尾是回车符和换行符的组合),你会经常看到这一点,你可以在Unix或Linux中编辑(行尾只是换行符)。

角色组合通常无害。如果您正在使用源代码管理,则可以配置文本文件签入格式,以便为您神奇地调整行。或者,您可以使用签入和签出触发器来自动“修复”文件。或者,您可以使用dos2unix之类的工具手动调整内容。

答案 7 :(得分:4)

~/.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

答案 8 :(得分:4)

我在 Mac OS 上使用 Android Studio (JetBrains IntelliJ IDEA ),我的问题是^ M开始显示在 GitHub 的拉取请求中的某些文件中。 对我有用的是更改文件的行分隔符。

在编辑器中打开所需文件转到 文件转到 行分隔符然后 为您选择最佳选择 (对我来说,它是 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

答案 9 :(得分:2)

正如大家都提到的那样。这是不同的线条结束风格。 MacOSX使用Unix行结尾 - 即LF(换行)。

Windows同时使用CR(回车)和& LF(换行)作为行尾。 因为你使用的是windows和mac那就是问题所在。

如果您在Windows中创建文件然后将其带到Mac上,您可能会在行尾看到这些^ M个字符。

如果要删除它们,可以在emacs中轻松完成。只需突出显示并复制^ M字符,然后执行查询替换^ M,并完成。

编辑: 其他一些可能有帮助的链接。 http://xahlee.org/emacs/emacs_adv_tips.html

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

答案 10 :(得分:1)

我不久前遇到了这个问题。 ^ M表示回车符,并且在Ctrl-Q Ctrl-M上搜索(这会创建一个文字^ M)将允许您在Emacs中获得此角色的句柄。我沿着这些方向做了一些事情:

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

答案 11 :(得分:1)

另见:

Hiding ^M in emacs

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

答案 12 :(得分:1)

如果您的系统上没有安装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

答案 13 :(得分:0)

对我来说,解决方案是使用此Emacs Wiki Article中的以下elisp函数。

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

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

答案 14 :(得分:0)

仅使用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,user-contributed等)。