web-dev-qa-db-ja.com

emacsで^ Mを非表示にする

行末に^ M(control-M)が含まれているログファイルを読み取る必要がある場合があります。私はそれらを取り除くためにグローバル置換を行うことができますが、それから何かがログファイルに記録され、そしてもちろん、それらはすべて戻ってきます。

Unixスタイルまたはdosスタイルの行末エンコーディングを設定しても大きな違いはないようです(ただし、unixスタイルがデフォルトです)。未定(unix | dos)コーディングシステムを使用しています。

私はWindowsを使用していて、log4netによって作成されたログファイルを読み取っています(ただし、log4netだけがこの問題の唯一の原因ではありません)。

ヒントはありますか?

56
Russell
(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によるソリューション。私はそれを見つけました ここ

75
binOr

Emacsの最新バージョンは、UNIXとDOSの両方の行末を処理する方法を知っているため、^ Mがファイルに表示される場合、ファイルに両方が混在していることを意味します。このような混合がある場合、emacsはデフォルトでUNIXモードになるため、^ Mが表示されます。実際の修正は、ファイルを作成するプログラムを修正して、一貫した行末を使用するようにすることです。

19
Edric

どう?

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

私は2行のファイルを作成しました。2行目はキャリッジリターンです。 EmacsはUnixコーディングでファイルを開き、コーディングシステムの切り替えは何もしません。しかし universal-coding-system-argument上記は機能します。

6
ashawley

ログファイルを表示し、実際にそれらを置き換えるのではなく、単に^ Mを非表示にする場合は、Drew Adamの 強調表示拡張子 を使用して実行できます。

Elispコードを記述するか、キーボードマクロを作成して次の操作を行うことができます。

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

これにより、最初に^ Mが強調表示され、次に非表示になります。それらを元に戻したい場合は、「hlt-show-default-face」を使用します

4
justinhj

エドリックの答えはもっと注目されるはずです。 JohanBockgårdのソリューションは、^ Mを非表示にする限り、投稿者の不満に対処しますが、根本的な問題を覆い隠し、UnixとDOSの行末の混合をさらに助長します。

適切な解決策は、グローバルM-x replace-regexp to turn all行末をDOS行(または場合によってはUnix)にします。次に、ファイルを閉じて再度開きます(M-x revert-bufferで十分です)。^ Mはすべて非表示になるか、すべて消えます。

3
SABBATINI Luca

ファイルが使用しているラインコーディングシステムをUnix形式に変更できると思います。

C-x RET f UNIX RET

これを行うと、モード行が「(Unix)」という単語を追加するように変更され、^ Mはすべて消えます。

3
T.E.D.

Control-M(^M)文字の表示テーブルエントリを変更して、空白として表示したり、完全に非表示(空)にしたりできます。ライブラリのコード pp-c-l.elPretty Control-L )を参考にしてください。 ^L文字を任意の方法で表示します。

編集:おっと、@ binOrがすでにこのメソッドについて言及していることに気づきました。

2
Drew

これを.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文字を削除できます。

2
sudeepdino008

dos2unix、unix2dos(現在 tofrodos )を使用するのはどうですか?

0
Massagran

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 "")))
0
RMK

遭遇した場合^MsはGnusで受信したメールで使用できますW c(CRを洗う)、または

(setq gnus-treat-strip-cr t)
0
Brady Trainor

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)