行末に^ M(control-M)が含まれているログファイルを読み取る必要がある場合があります。私はそれらを取り除くためにグローバル置換を行うことができますが、それから何かがログファイルに記録され、そしてもちろん、それらはすべて戻ってきます。
Unixスタイルまたはdosスタイルの行末エンコーディングを設定しても大きな違いはないようです(ただし、unixスタイルがデフォルトです)。未定(unix | dos)コーディングシステムを使用しています。
私はWindowsを使用していて、log4netによって作成されたログファイルを読み取っています(ただし、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によるソリューション。私はそれを見つけました ここ 。
Emacsの最新バージョンは、UNIXとDOSの両方の行末を処理する方法を知っているため、^ Mがファイルに表示される場合、ファイルに両方が混在していることを意味します。このような混合がある場合、emacsはデフォルトでUNIXモードになるため、^ Mが表示されます。実際の修正は、ファイルを作成するプログラムを修正して、一貫した行末を使用するようにすることです。
どう?
C-x RET c dos RET C-x C-f FILENAME RET
私は2行のファイルを作成しました。2行目はキャリッジリターンです。 EmacsはUnixコーディングでファイルを開き、コーディングシステムの切り替えは何もしません。しかし universal-coding-system-argument
上記は機能します。
ログファイルを表示し、実際にそれらを置き換えるのではなく、単に^ 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」を使用します
エドリックの答えはもっと注目されるはずです。 JohanBockgårdのソリューションは、^ Mを非表示にする限り、投稿者の不満に対処しますが、根本的な問題を覆い隠し、UnixとDOSの行末の混合をさらに助長します。
適切な解決策は、グローバルM-x replace-regexp
to turn all行末をDOS行(または場合によってはUnix)にします。次に、ファイルを閉じて再度開きます(M-x revert-buffer
で十分です)。^ Mはすべて非表示になるか、すべて消えます。
ファイルが使用しているラインコーディングシステムをUnix形式に変更できると思います。
C-x RET f UNIX RET
これを行うと、モード行が「(Unix)」という単語を追加するように変更され、^ Mはすべて消えます。
Control-M(^M
)文字の表示テーブルエントリを変更して、空白として表示したり、完全に非表示(空)にしたりできます。ライブラリのコード pp-c-l.el
( Pretty Control-L )を参考にしてください。 ^L
文字を任意の方法で表示します。
編集:おっと、@ binOrがすでにこのメソッドについて言及していることに気づきました。
これを.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
文字を削除できます。
dos2unix、unix2dos(現在 tofrodos )を使用するのはどうですか?
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 "")))
遭遇した場合^M
sはGnusで受信したメールで使用できますW c
(CRを洗う)、または
(setq gnus-treat-strip-cr t)
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)