为什么在我的 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 风格
LF
:0x0a
- DOS 风格:
CR
LF
:0x0d 0x0a
- 旧 Mac 风格
CR
:0x0d
- Unix 风格
Emacs 将正确呈现文件并在模式行左角显示以 found 结尾的行。
然而,如果文件中有多行混合,有些行使用一种样式,而其他行使用另一种样式,那么 Emacs 将显示终止符CR
为^M
,代表 Control-M 对应的值,0x0d
即 ASCII 回车符:CR
。
发生这种情况的原因有多种,包括编辑器的误用或 VCS 行尾转换。
检测哪些行与其他行不同的一种快速方法是执行以下操作:
- 保留原始文件的副本,例如 file-A
- 使用
dos2unix
和unix2dos
实用程序将其从应有的行尾转换回应有的行尾,并将结果存储在文件 B 中 - 使用 Emacs
ediff
工具比较两个文件。它将显示不正确的行。
如果文件已经在 Git 或 Mercurial 仓库中,只需更改文件,然后使用 Emacs 内置 VCS 支持查看更改C-x v d
,选择文件然后输入=
。
您将看到在文件的旧版本中没有正确结尾的行。
答案4
如果您主要在 DOS/Windows 环境中使用 Emacs,Emacs 应该能够正确识别行尾系统并以透明的方式处理它。
您可能会看到文件中突然出现 ^M,因为该文件已被编辑,可能是使用脚本添加了带有 UNIX 行尾的行,现在行尾混合了。
您可以通过将 ^M 重新添加到这些行来修复这些行,保存文件,关闭缓冲区,然后重新打开它。现在它应该看起来正常,并且状态行上显示 (DOS) 作为编码标记。
要查找的正则表达式是 \([^^M]\)$ 并将其替换为 \1^M。请记住使用 Ctrl-Q 来“引用”Ctrl-M 字符。