web-dev-qa-db-ja.com

emacsでテキストを色付けする方法は?

ls -l --color=alwaystree...などによって出力されるような色付きのテキストをemacsで表示(および/または編集)したい。

私が参照しているテキストはファイルに存在します。そのファイルをemacsで開くとき、色付きで表示したり、ANSI(SGR)エスケープシーケンスを表示するように切り替えたりしたいと思います。

ansi-color.elseems必要なものですが、ANSiエスケープの色付けを行うことができませんでしたsequences、しかし個々の青太字は表示されますコントロールバイト(例:^Aおよび^[)...これがansi-colorの機能であるかどうかはわかりませんが、そうだと思います。

ansi-color.elコメント によると、文字列と領域で機能しますが、それでも機能しないようです。たとえば、関数ansi-color-apply-on-regionM-xによって認識されません。 「一致しない」と書かれています

.emacsファイルと(require 'ansi-color)(add-hook 'Shell-mode-hook 'ansi-color-for-comint-mode-on)を追加しました。 emacsの起動時にエラーや警告が表示されないので、行き詰まります。

標準関数を機能させるにはどうすればよいですか。また、名前の末尾に.colが付いているファイルを開くときに自動的に適用するようにできますか?

11
Peter.O

あなたが見逃しているのはinteractiveフォームだと思います。これが、Emacsが他の関数から呼び出されるように設計された関数とユーザーが直接呼び出すように設計された関数を区別する方法です。 Emacs LISPイントロを参照 ノード

ansi-color-apply-on-regionの定義を読むと、インタラクティブに使用するように設計されていないことがわかります。 「ansi-color」は、comint出力をフィルタリングするように設計されています。ただし、インタラクティブなラッパーを作成するのは簡単です。

(defun ansi-color-apply-on-region-int (beg end)
  "interactive version of func"
  (interactive "r")
  (ansi-color-apply-on-region beg end))

次のビットは、.col拡張子のANSIカラーをオンにすることです。これらのファイルの編集に使用するメジャーモードにフック関数を追加できます。この関数は、メジャーモードをオンにするたびに実行されるため、適切なファイルサフィックスのチェックを追加する必要があります。

あるいは、「基本」モードに基づいてクイック派生モードをハックすることもできます。

(define-derived-mode fundamental-ansi-mode fundamental-mode "fundamental ansi"
  "Fundamental mode that understands ansi colors."
  (require 'ansi-color)
  (ansi-color-apply-on-region (point-min) (point-max)))

それをその拡張子に関連付けます。

(setq auto-mode-alist
      (cons '("\\.col\\'" . fundamental-ansi-mode) auto-mode-alist))
15
event_jr

次のソリューションでは、ANSIカラーシーケンスを含むファイルを読み取る(保存しない)ことができます。ファイル名には.txt拡張子が必要です。

ライブラリ tty-format~/.emacs.d/site-LISP/に入れ、これらの行を~/.emacs初期化ファイルに追加します。

(add-to-list 'load-path "~/.emacs.d/site-LISP/")              
(require 'tty-format)
(add-hook 'find-file-hooks 'tty-format-guess)
5
enzotib

あなたの解決策をありがとう@enzotib!

ソリューションへの追加と同様に、ユーザーが明示的に呼び出すことができるようにする方法は次のとおりです。

;; M-x display-ansi-colors to explicitly decode ANSI color escape sequences                                                                                                                                        
(defun display-ansi-colors ()
  (interactive)
  (format-decode-buffer 'ansi-colors))

* .txtやREADME以外のファイルの場合は自動:

;; decode ANSI color escape sequences for .log files                                                                                                                                                               
(add-to-list 'auto-mode-alist '("\\.log\\'" . display-ansi-colors))

このようにして、ansi-color-apply-on-regionを使用するソリューションとは異なり、元のファイルを変更せずにエスケープシーケンスを色に置き換えることができます。

0
deb0ch