ChatGPT解决这个技术问题 Extra ChatGPT

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

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

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

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

有人曾经因为其中一个问题而遇到过这个问题吗?

对于它的价值:搜索“ctrl”而不是 ^
更大的问题是,你打算怎么办?很有可能,Emacs 并没有引入它们。你的团队应该决定文件应该是 DOS 格式(有 ^M)还是 Unix 格式(没有 ^M),并强制执行。

m
miguelmorin

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

git config --global core.autocrlf true

我认为这是最好的答案,因为它回答了 OP 上下文中的问题,即 git。
我的 '~/.gitconfig' 文件中已经有“[core]\n autocrlf = true”,但它仍然让我用 '^m' 字符'git clone code.google.com/p/pytomtom'??????
如果您的平台是 Windows,则此答案适用!如果你在 Mac/Linux 上工作,“true”应该变成“input”!请参阅 help.github.com/articles/dealing-with-line-endings 和此处:stackoverflow.com/questions/9225599/…
警告:当 git 错误地“猜测”行尾不重要并且需要更改时,此答案会损坏许多其他文件。这对于这些字符存在于数据文件中的软件项目来说是致命的(是的,我被这个烧死了,很难破解)。恕我直言,这是一个糟糕的解决方案。
@MBI 想一想;计算机不会“神奇地”知道哪个 CRLF / LF 是行尾,哪个不是。所以它改变了它们。如果角色在那里但不是行尾......你只是破坏了你的数据。
B
Broam

Someone is not converting their line-ending characters correctly

我认为是 Windows 用户,因为他们喜欢他们的 CRLF。 Unix 喜欢 LF,Mac 喜欢 CR,直到它以 Unix 的方式出现。


澄清一下:Mac 使用 CR 直到版本 10 (OS X),现在它使用 LF。
我觉得 Windows 的方式更合乎逻辑,因为 CR 和 LF 这两个术语来自打字机时代。您确实必须同时执行这两项操作:回车将输入点置于行首,换行以向下滚动一行。打字机上的 Mac OS 经典方式 (CR) 只会不断覆盖同一行。打字机上的 Unix 方式 (LF) 会输出交错的文本,直到达到页面的全宽。 :)
@Otherside:仅在“我们想模仿打字机”的意义上更合乎逻辑。我无法开始理解为什么这甚至不再有用了。
@Otherside 当可以用一个字符表示时,为什么要用两个字符表示?
@Matthew G:只要我们很多人都同意,一切都可以用一个字符来表示。这是否意味着我们应该?我们可以在没有标点符号、大写字母的情况下键入所有信息,并且只需将每个句子换行,每个人都会理解它。这是否意味着我们应该?这不是“因为我们可以做某事”。也就是说,我也更喜欢LF。
b
bonif

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


不会改变任何东西。
使用 git diff 时只会使 ^M 从显示屏上消失,但它仍然存在
实际上,它仅将 ^M 显示为空格,但 git diff 在比较文件时仍将 ^M 考虑在内。使用 git config --global --unset core.whitespace 删除此设置(来自 this thread)。
您也可以省略 --global 以仅配置当前存储库。
这是不对的,因为 git 命令没有显示,但 ^M 仍在代码库中。
S
Sinan Ünür

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

line 1^M
line 2^M

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

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

line 1^Mline 2^M

因为回车后没有换行符。


C
CookieMonster

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

https://i.stack.imgur.com/XbPMY.png


P
Parappa

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

编辑:我找到了以下 Python 示例代码 here

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

在 Emacs 中,这将是 M-: (replace-string "\r" "")
k
kaineer

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


这对我不起作用...我选择了所有文本并运行了命令。
这对我有用。谢谢。 @devrimbaris,你不需要选择任何东西,你只需运行命令。 “M”是元键或转义键。所以 Mx 是逃逸然后是 x。然后你输入 delete-trailing-whitespace,然后按回车键。
u
uberhitzt

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

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


J
Jakub Narębski

将以下内容放入您的 ~/.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


n
nedblorf

我不久前遇到了这个问题。 ^M 代表回车,在 Ctrl-Q Ctrl-M 上搜索(这将创建一个文字 ^M)将允许您在 Emacs 中获得该字符的句柄。我按照这些思路做了一些事情:

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

g
grapesh

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

G
Glorfindel

正如大家所提到的。这是不同的行尾样式。 MacOSX 使用 Unix 换行符 - 即 LF(换行)。

Windows 使用 CR(回车)和 LF(换行)作为行尾。由于您同时使用Windows和Mac,这就是问题的根源。

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

如果你想删除它们,你可以在 emacs 中很容易地做到这一点。只需突出显示并复制 ^M 字符并使用查询替换 ^M 即可完成。

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

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


C
Community

也可以看看:

Hiding ^M in emacs

如果您选择删除 ^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、user-contributed 等)。


C
Carlo Espino

我的解决方案是使用此 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都会消失。