在emacs中隐藏^ M

有时我需要读取在行尾有^ M(control-M)的日志文件。 我可以做一个全局replace来摆脱它们,但是更多的东西被logging到日志文件中,当然,它们都会回来。

设置unix风格或dos风格的行尾编码似乎没有太大的差别(但unix风格是我的默认)。 我正在使用undecided-(unix | dos)编码系统。

我在Windows上,阅读由log4net创build的日志文件(虽然log4net显然不是这种烦恼的唯一来源)。

任何提示?

(defun remove-dos-eol () "Do not show ^M in files containing mixed UNIX and DOS line endings." (interactive) (setq buffer-display-table (make-display-table)) (aset buffer-display-table ?\^M [])) 

JohanBockgård的解决scheme。 我在这里find了

emacs的现代版本知道如何处理UNIX和DOS行尾,所以当^ M出现在文件中时,这意味着在文件中有两者的混合。 当有这样的混合,emacs默认为UNIX模式,所以^ Ms是可见的。 真正的解决办法是修复创build文件的程序,以便使用一致的行结束符。

关于什么?

 Cx RET c dos RET Cx Cf FILENAME RET 

我做了一个文件,有两行,第二个有回车。 Emacs会在Unix编码中打开这个文件,而切换编码系统什么也不做。 但是,上面的universal-coding-system-argument可行的。

如果您想查看日志文件,只需隐藏^ M而不是实际replace它们,则可以使用Drew Adam的高亮显示扩展程序来执行此操作。

您可以编写elisp代码或者创build一个键盘macros来执行以下操作

 select the whole buffer hlt-highlight-regexp-region Cq CM hlt-hide-default-face 

这将首先突出^ M的,然后隐藏它们。 如果你想让他们使用`hlt-show-default-face'

我相信你可以将文件正在使用的行编码系统更改为Unix格式

 Cx RET f UNIX RET 

如果你这样做,模式行应该改变添加单词“(Unix)”,所有这些^ M应该消失。

埃德里克的回答应该得到更多的关注。 JohanBockgård的解决scheme确实解决了海报的投诉,因为它使得“M”不可见,但是这只是掩盖了潜在的问题,并鼓励进一步混合Unix和DOS行结尾。

正确的解决办法是做一个全局的Mx replace-regexp所有的行结束符都转换成DOS结尾(或Unix,视情况而定)。 然后closures并重新打开该文件(不确定Mx revert-buffer是否足够),^ M将全部不可见或全部消失。

把它放在你的.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 ""))) 

现在你可以简单地调用dos2unix并删除所有的^M字符。

您可以更改Control-M( ^M )字符的显示表项,使其显示为空格,甚至完全消失(空白)。 请参阅图书馆pp-cl.el ( Pretty Control-L )中的代码以获取灵感。 它以任意方式显示^L字符。

编辑:哎呀,我只是注意到@binOr已经提到这种方法。

那么使用dos2unix,unix2dos(现在tofrodos )呢?

如果您在Gnus收到的邮件中遇到^M s,您可以使用W c (清洗CR)或

 (setq gnus-treat-strip-cr t) 

sudeepdino008的答案没有为我工作(我不能评论他的答案,所以我不得不加我自己的答案)。

我能够使用此代码修复它:

 (defun dos2unix () "Replace DOS eolns CR LF with Unix eolns CR" (interactive) (goto-char (point-min)) (while (search-forward (string ?\Cm) nil t) (replace-match "")))