这些^ M持续显示在emacs的文件中是什么?


157

因此,我认为这可能与textmate有关,但是我们在一个小型团队中工作,由于git中几乎相同的文件存在全文件冲突,因此存在一些问题,因为一个分支的每一行都附加了^ M。

这个神秘^M人物应该做什么,它可能从哪里来?

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

有人遇到过其中一个问题吗?


3
对于它的价值:搜索“ ctrl”而不是^
Broam

3
更大的问题是,您将如何处理?Emacs可能没有引入它们。您的团队应该决定文件应为DOS格式(具有^ M)还是Unix格式(没有^ M),并加以实施。
Trey Jackson的

Answers:


111

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

git config --global core.autocrlf true

6
我认为这是最好的答案,因为它在OP的上下文中(即git)回答了问题。
neontapir 2014年

我的“〜/ .gitconfig”文件中已经有“ [core] \ n autocrlf = true”,但是它仍然允许我“ git clone code.google.com/p/pytomtom ”和“ ^ m”字符一起使用??? ??
2015年

11
当您的平台是Windows时,此答案才适用!如果您在Mac / Linux上工作,则“ true”应变为“ input”!见help.github.com/articles/dealing-with-line-endings这里:stackoverflow.com/questions/9225599/...
K.迈克尔埃

警告:当git错误地“猜测”行尾不重要并且需要更改时,此答案会损坏许多其他文件。对于这些字符存在于数据文件中的软件项目来说,这是致命的(是的,我为此感到疲倦,难以中断)。恕我直言,这是一个糟糕的解决方案。
亚当

@Adam什么是行尾的中断更改?处理数据时,您在哪里遇到问题?它不应该影响任何东西,只是标记行尾的另一种方式。我只是好奇。
MBI

97

某人未正确转换其行尾字符

我认为这是Windows人士,因为他们喜欢CRLF。在以Unix方式显示之前,Unix喜欢LF,而Mac喜欢CR。


12
为了澄清起见:Mac在版本10(OS X)之前一直使用CR,现在使用LF。
Mikael S

34
我觉得Windows的方式更合乎逻辑,因为CR和LF术语来自打字机时代。您确实必须完成这两项操作:回车键以使输入点指向行的开头,而换行符则向下滚动一行。打字机上的Mac OS经典方式(CR)只会继续覆盖同一行。打字机上的Unix方式(LF)会输出交错文本,直到您到达页面的整个宽度为止。:)
阿瑟赛德

114
@Otherside:仅在“我们要模仿打字机”的意义上才更具逻辑性。我无法理解为什么它甚至不再有用。
Bryan Oakley'3

29
@Otherside为什么当可以用一个字符表示某个东西时,用两个字符来表示?
马修·G

13
@Matthew G:只要我们都同意,所有内容都可以用一个字符表示。这是否意味着我们应该?我们可以键入所有消息,而无需标点符号,大写字母和换行符,只需每个句子,每个人都可以理解。这是否意味着我们应该?这与“因为我们可以做某事”无关。也就是说,我也更喜欢LF。
jaffog 2014年

33

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

第1 ^ M行
第2 ^ M行

那么该文件必须来自Windows,因为Windows上的标准换行符序列为CR LF0x0d 0x0a),而标准的换行符序列仅由LFUnices组成。

如果该文件来自Mac OS 9或更早的系统,则您将看到

第1 ^ M行2 ^ M

因为回车后将没有换行符。


28

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


1
不会改变任何东西。
Vivex

3
仅当使用git diff时,^ M才会从显示中消失,但它仍然存在
FernandoZ

1
实际上,它仅将^ M显示为空白,但git diff在比较文件时仍将^ M考虑在内。使用git config --global --unset core.whitespace(从此线程中)删除此设置。
miguelmorin

1
您也可以省略--global,仅配置当前存储库。
Derek Veit

8

它们与DOS样式的行尾和Unix样式的区别有关。查阅Wikipedia文章。您也许可以找到一个dos2unix工具来提供帮助,或者只是编写一个小的脚本自己进行修复。

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

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

3
在Emacs中,该名称为<code> M- :(替换字符串“ \ r”“”)</ code>。
怀远

7

我在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

在此处输入图片说明


6

除了查询替换,您还可以使用Mx delete-trailing-space


这对我不起作用...我选择了所有文本并运行了命令。
ᐅdevrimbaris

这对我有用。谢谢。@devrimbaris,您无需选择任何内容,只需运行命令。“ M”是meta键或转义键。因此,Mx先逃逸,然后x。然后输入delete-trailing-space,然后按回车键。
astromax

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 "")))

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


4

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

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


2

正如每个人都提到的。这是不同的行结束样式。MacOSX使用Unix的行尾-即LF(换行)。

Windows使用CR(回车)和LF(换行)作为行尾。由于您同时使用Windows和Mac,多数民众赞成在此问题的根源。

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

如果要删除它们,可以在emacs中轻松完成此操作。只需突出显示并复制^ M字符,然后用QueryM替换^ M就可以了。

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

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


2

我前一段时间遇到了这个问题。^ M表示回车,在上搜索Ctrl-Q Ctrl-M(这将创建文字^ M),您将可以在Emacs中使用此字符。我按照以下原则做了一些事情:

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

2

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

1

也可以看看:

在Emacs中隐藏^ M

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


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.