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

Nei*_*kar 143 git emacs newline

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

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

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

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

Jos*_*Lee 101

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

git config --global core.autocrlf true
Run Code Online (Sandbox Code Playgroud)

  • 如果你的平台是Windows,这个答案**仅适用**!如果你在Mac/Linux上工作,"true"应该成为"输入"!请参阅https://help.github.com/articles/dealing-with-line-endings和此处:http://stackoverflow.com/questions/9225599/should-git-change-the-ending-of-line-controlm -or-M-在最端部的最第一-1- (9认同)
  • 我认为这是最好的答案,因为它在OP的背景下回答了问题,即git. (6认同)
  • 警告:当 git 错误地“猜测”行结尾不重要并且需要更改时,此答案会破坏许多其他文件。这对于数据文件中存在这些字符的软件项目来说是致命的(是的,我已经被这个烧毁了,很难破解)。恕我直言,这是一个糟糕的解决方案。 (3认同)

Bro*_*oam 93

有人没有正确转换他们的行尾字符.

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

  • @Otherside:仅在"我们想模仿打字机"的意义上更合乎逻辑.我无法理解为什么它甚至更加有用. (107认同)
  • 我认为Windows方式更符合逻辑,因为术语CR和LF来自打字机的时代.您必须同时执行这两项操作:a Carriage返回以获取行的开头的输入点,并使用换行符向下滚动一行.打字机上的Mac OS Classic方式(CR)只会覆盖同一条线.打字机上的Unix方式(LF)会输出交错的文本,直到达到页面的整个宽度.:) (33认同)
  • @Otherside为什么当用一个字符表示时,你能代表两个字符? (27认同)
  • 为了澄清:Mac使用CR直到版本10(OS X),现在它使用LF. (12认同)
  • @Matthew G:只要我们很多人同意,一切都可以用一个角色来表示.这是否意味着我们应该?我们可以在没有标点符号,大写字母和新行的每个句子的情况下输入我们所有的消息,每个人都会理解它.这是否意味着我们应该?这不是"因为我们可以做某事".也就是说,我也更喜欢LF. (12认同)
  • @Otherside在1958年更合乎逻辑.它不是1958年. (5认同)

Sin*_*nür 30

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

line 1^M
line 2^M

然后该文件必须来自Windows,因为Windows上的标准换行序列是CR LF(0x0d 0x0a)而标准换行序列仅由LFUnices组成.

如果文件来自Mac OS 9或更早版本的系统,您会看到它

line 1^Mline 2^M

因为回车后没有换行.


小智 20

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

git config --global core.whitespace cr-at-eol
Run Code Online (Sandbox Code Playgroud)

致谢:https: //lostechies.com/keithdahlby/2011/04/06/windows-git-tip-hide-carriage-return-in-diff/

  • 这只会让^ M在使用git diff时从显示中消失,但它仍然存在 (3认同)

Par*_*ppa 8

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

编辑:我在这里找到了以下Python示例代码:

string.replace( str, '\r', '' )
Run Code Online (Sandbox Code Playgroud)

  • 在Emacs中,这将是<code> M- :( replace-string"\ r""")</ code>. (3认同)

atk*_*atk 6

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

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


小智 6

而不是查询替换你也可以使用Mx delete-trailing-whitespace


Coo*_*ter 6

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

在编辑器中打开所需的文件,然后依次转到“ 文件”和“ 行分隔符”,然后 为您选择最佳选项 (对我而言,这是LF-Unix和OS X(\ n)

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

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

在此处输入图片说明


Jak*_*ski 5

将以下~/.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 "")))
Run Code Online (Sandbox Code Playgroud)

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