为什么 Emacs 在每行末尾插入 ^m

为什么 Emacs 在每行末尾插入 ^m

为什么在我的 Linux 环境中 Emacs 会在每一行末尾插入 ^m?

答案1

Emacs 换行符和 Windows、Unix、Mac 等所有 ^M ^J ^L

问:为什么 emacs 在缓冲区中显示 ^M?

答:“^M”是 ASCII 插入符号,表示不可打印的回车符 (ASCII 13)。如果 emacs 显示该符号,可能是因为您混合了 ^M 和 ^J 字符,emacs 无法一致地将它们解释为换行符。

要修复它,请调用“set-buffer-file-coding-system”,然后提供以下之一:“mac”、“dos”、“unix”。然后保存文件。如果这不能解决问题,您可以使用查找和替换来手动删除它。

答案2

我知道这个问题已经解决了,但我想提一下Dos2Unix是 UNIX/DOS/Mac 机器之间文件操作工具包的一个方便的部分。它是一种基于命令的简单方法,用于添加/删除操作系统首选的行尾。

答案3

这是一个老话题,但让我添加一些额外的信息。

  • 如前所述,Emacs 能够打开文件并正确显示具有 3 个最常见行尾的文件:
    • Unix 风格 LF0x0a
    • DOS 风格: CR LF :0x0d 0x0a
    • 旧 Mac 风格CR0x0d

Emacs 将正确呈现文件并在模式行左角显示以 found 结尾的行。

然而,如果文件中有多行混合,有些行使用一种样式,而其他行使用另一种样式,那么 Emacs 将显示终止符CR^M,代表 Control-M 对应的值,0x0d即 ASCII 回车符:CR

发生这种情况的原因有多种,包括编辑器的误用或 VCS 行尾转换。

检测哪些行与其他行不同的一种快速方法是执行以下操作:

  • 保留原始文件的副本,例如 file-A
  • 使用dos2unixunix2dos实用程序将其从应有的行尾转换回应有的行尾,并将结果存储在文件 B 中
  • 使用 Emacsediff工具比较两个文件。它将显示不正确的行。

如果文件已经在 Git 或 Mercurial 仓库中,只需更改文件,然后使用 Emacs 内置 VCS 支持查看更改C-x v d,选择文件然后输入=

您将看到在文件的旧版本中没有正确结尾的行。

答案4

如果您主要在 DOS/Windows 环境中使用 Emacs,Emacs 应该能够正确识别行尾系统并以透明的方式处理它。

您可能会看到文件中突然出现 ^M,因为该文件已被编辑,可能是使用脚本添加了带有 UNIX 行尾的行,现在行尾混合了。

您可以通过将 ^M 重新添加到这些行来修复这些行,保存文件,关闭缓冲区,然后重新打开它。现在它应该看起来正常,并且状态行上显示 (DOS) 作为编码标记。

要查找的正则表达式是 \([^^M]\)$ 并将其替换为 \1^M。请记住使用 Ctrl-Q 来“引用”Ctrl-M 字符。

相关内容