Russell
Russell

Reputation:

Hiding ^M in Emacs

Sometimes I need to read log files that have ^M (control-M) in the line endings. I can do a global replace to get rid of them, but then something more is logged to the log file and, of course, they all come back.

Setting Unix-style or dos-style end-of-line encoding doesn't seem to make much difference (but Unix-style is my default). I'm using the undecided-(unix|dos) coding system.

I'm on Windows, reading log files created by log4net (although log4net obviously isn't the only source of this annoyance).

Upvotes: 61

Views: 32635

Answers (12)

Like binOr said add this to your %APPDATA%.emacs.d\init.el on windows or where ever is your config.

;; 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)

Upvotes: 0

binOr
binOr

Reputation: 2581

(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 []))

Solution by Johan Bockgård. I found it here.

Upvotes: 84

RMK
RMK

Reputation: 93

sudeepdino008's answer did not work for me (I could not comment on his answer, so I had to add my own answer.).

I was able to fix it using this code:

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

Upvotes: 0

Brady Trainor
Brady Trainor

Reputation: 2076

If you encounter ^Ms in received mail in Gnus, you can use W c (wash CRs), or

(setq gnus-treat-strip-cr t)

Upvotes: 1

sudeepdino008
sudeepdino008

Reputation: 3364

Put this in your .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 "")))

Now you can simply call dos2unix and remove all the ^M characters.

Upvotes: 2

SABBATINI Luca
SABBATINI Luca

Reputation: 151

Edric's answer should get more attention. Johan Bockgård's solution does address the poster's complaint, insofar as it makes the ^M's invisible, but that just masks the underlying problem, and encourages further mixing of Unix and DOS line-endings.

The proper solution would be to do a global M-x replace-regexp to turn all line endings to DOS ones (or Unix, as the case may be). Then close and reopen the file (not sure if M-x revert-buffer would be enough) and the ^M's will either all be invisible, or all be gone.

Upvotes: 3

Drew
Drew

Reputation: 30701

You can change the display-table entry of the Control-M (^M) character, to make it displayable as whitespace or even disappear totally (vacuous). See the code in library pp-c-l.el (Pretty Control-L) for inspiration. It displays ^L chars in an arbitrary way.

Edited: Oops, I just noticed that @binOr already mentioned this method.

Upvotes: 2

Massagran
Massagran

Reputation: 1821

what about using dos2unix, unix2dos (now tofrodos)?

Upvotes: 0

Edric
Edric

Reputation: 25140

Modern versions of emacs know how to handle both UNIX and DOS line endings, so when ^M shows up in the file, it means that there's a mixture of both in the file. When there is such a mixture, emacs defaults to UNIX mode, so the ^Ms are visible. The real fix is to fix the program creating the file so that it uses consistent line-endings.

Upvotes: 19

ashawley
ashawley

Reputation: 4283

What about?

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

I made a file that has two lines, with the second having a carriage return. Emacs would open the file in Unix coding, and switching coding system does nothing. However, the universal-coding-system-argument above works.

Upvotes: 8

justinhj
justinhj

Reputation: 11306

If you'd like to view the log files and simply hide the ^M's rather than actually replace them you can use Drew Adam's highlight extension to do so.

You can either write elisp code or make a keyboard macro to do the following

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

This will first highlight the ^M's and then hide them. If you want them back use `hlt-show-default-face'

Upvotes: 4

T.E.D.
T.E.D.

Reputation: 44804

I believe you can change the line coding system the file is using to the Unix format with

C-x RET f UNIX RET

If you do that, the mode line should change to add the word "(Unix)", and all those ^M's should go away.

Upvotes: 5

Related Questions