在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 "")))