在emacs中隐藏^ M.

时间:2009-04-08 16:20:37

标签: emacs

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

设置unix样式或dos样式的行尾编码似乎没有太大区别(但unix样式是我的默认值)。我正在使用未定 - (unix | dos)编码系统。

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

任何提示?

12 个答案:

答案 0 :(得分:73)

(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的解决方案。我找到了here

答案 1 :(得分:19)

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

答案 2 :(得分:6)

怎么样?

C-x RET c dos RET C-x C-f FILENAME RET

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

答案 3 :(得分:4)

如果您想查看日志文件并简单地隐藏^ M而不是实际替换它们,您可以使用Drew Adam的highlight extension来执行此操作。

您可以编写elisp代码或制作键盘宏来执行以下操作

select the whole buffer
hlt-highlight-regexp-region
C-q C-M
hlt-hide-default-face

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

答案 4 :(得分:3)

我相信您可以使用

将文件正在使用的行编码系统更改为Unix格式
C-x RET f UNIX RET

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

答案 5 :(得分:3)

Edric的回答应该得到更多的关注。 JohanBockgård的解决方案确实解决了海报的抱怨,只要它使^ M不可见,但这只是掩盖了潜在的问题,并鼓励进一步混合使用Unix和DOS行结束。

正确的解决方案是执行全局M-x replace-regexp所有行结尾转换为DOS(或Unix,视情况而定)。然后关闭并重新打开文件(不确定M-x revert-buffer是否足够)并且^ M将全部不可见,或者全部消失。

答案 6 :(得分:2)

您可以更改Control-M(^M)字符的显示表条目,使其可以显示为空格,甚至完全消失(空白)。请参阅库pp-c-l.elPretty Control-L)中的代码以获取灵感。它以任意方式显示^L个字符。

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

答案 7 :(得分:2)

将它放在.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个字符。

答案 8 :(得分:0)

如何使用dos2unix,unix2dos(现在为tofrodos)?

答案 9 :(得分:0)

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

(setq gnus-treat-strip-cr t)

答案 10 :(得分:0)

sudeepdino008的回答对我不起作用(我无法评论他的答案,所以我不得不添加自己的答案。)。

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

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

答案 11 :(得分:0)

就像binOr所说的那样,将其添加到Windows或您的配置所在的%APPDATA%.emacs.d \ init.el中。

;; Windows EOL
(defun hide-dos-eol ()
  "Hide ^M in files containing mixed UNIX and DOS line endings."
  (interactive)
  (setq buffer-display-table (make-display-table))
  (aset buffer-display-table ?\^M []))

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

(add-hook 'text-mode-hook 'hide-dos-eol)