【问题标题】:What are these ^M's that keep showing up in my files in emacs?这些 ^M 一直出现在我的 emacs 文件中是什么?
【发布时间】:2010-12-21 19:48:58
【问题描述】:

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

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

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

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

【问题讨论】:

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

标签: git emacs newline


【解决方案1】:

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 是行尾,哪个不是。所以它改变了它们。如果角色在那里但不是作为行尾......你只是破坏了你的数据。
【解决方案2】:

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。
【解决方案3】:

要使 ^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来只配置当前的repo。
【解决方案4】:

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

第 1 行^M 第 2 行 ^ M

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

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

第 1 行 ^ M 第 2 行 ^ M

因为回车后没有换行符。

【讨论】:

    【解决方案5】:

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

    在编辑器中打开所需文件转到 文件转到 行分隔符然后 选择最适合您的选项 (对我来说是 LF - Unix and OS X(\n)

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

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

    【讨论】:

      【解决方案6】:

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

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

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

      【讨论】:

      • 在 Emacs 中,这将是 M-: (replace-string "\r" "").
      【解决方案7】:

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

      【讨论】:

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

      在您的~/.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

      【讨论】:

        【解决方案9】:

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

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

        【讨论】:

          【解决方案10】:

          正如大家所提到的。这是不同的行尾样式。 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

          【讨论】:

            【解决方案11】:

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

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

            【讨论】:

              【解决方案12】:

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

                另见:

                Hiding ^M in emacs

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

                【讨论】:

                  【解决方案14】:

                  只用一个 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 等)。

                  【讨论】:

                    【解决方案15】:

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

                    【讨论】:

                      猜你喜欢
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 2021-03-24
                      • 1970-01-01
                      • 1970-01-01
                      • 2019-04-30
                      相关资源
                      最近更新 更多