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


11

私は、このような出力がであるようにEmacs内のテキスト、色付け(および/または編集)表示したいls -l --color=alwaystree...または何でも。

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

ansi-color.el 私が必要とするもののようですが、ANSiエスケープシーケンスの色付けを行うことができませんでしたが、個々の制御バイト(たとえば^A、および^[)について青太字が表示されます...私はそうではありませんそれがの機能かどうかは確かですがansi-color、そうだと思います。

ansi-color.elのコメントによると、文字列とリージョンで機能しますが、それでも機能しないようです。たとえば、関数ansi-color-apply-on-regionはによって認識されませんM-x。「一致しない」とあります

.emacsファイル、さらにはに追加(require 'ansi-color)しました。emacsの起動時にエラーや警告が出ないので、行き詰まっています。 (add-hook 'shell-mode-hook 'ansi-color-for-comint-mode-on)

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

回答:


15

欠けているのはinteractiveフォームだと思います。これは、Emacsが他の関数から呼び出されるように設計された関数とユーザーが直接呼び出すように設計された関数を区別する方法です。Emacs Lisp Intro ノードを参照してください

の定義を読むと、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))

幻想的…まるで魔法のよう!よく説明されており、Make a Function Interactiveリンクが非常に役立ちました。私はEmacsの一般的な構造を見始めています。ありがとう...
Peter.O

何を間違えているのだろう。上記のすべてのテキストを.emacsファイルに追加しましたが、強調表示したテキストがansi-color-apply-on-region-intを呼び出した後に色付けされないようです。
SFbay007

5

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

ライブラリtty-formatをに置き、~/.emacs.d/site-lisp/これらの行を~/.emacsinitファイルに追加します。

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

これも便利なオプションです。それはansi-colorあなたのリンクが言うように、それをさらに一歩利用します、「... tty-format.elの目的は単に*そのようなファイルを見えるようにすることです。」* ..「そのようなファイル」はANSI SGRエスケープを含むものですシーケンスとバックスペース ..おかげで..
Peter.O

1
この方法の価値については、このメソッドとevent_jrによって投稿された完全に編集可能なバージョンのほうが、連続ページング速度が速く(約25%)、更新頻度が大幅に(かなり!)優れています。テストファイルの行数は45,000行でした。編集可能バージョンの場合、画面を更新してファイル全体の約75%で停止しますが、スクロールバーはまだスクロールしていました。これは、編集可能バージョンのポイント/マークの取り消しバッファーのオーバーヘッドが原因であると考えられます。 ..どちらの方法にも利点があります...(「継続的」とは、Page Up / Downキーを押し続けることを意味します)
Peter.O

PS .. tty形式のページは、ターミナルで行うよりもスムーズかつ高速です(時間は互いに1秒または2秒以内でした。トップボタンから約50秒、ボトムトップ)。
Peter.O 2011

知らなかったtty-format。私のラッパー関数や3行の派生モードよりも優れているようです。:) Emacsは多くのオーバーレイを扱うのに苦労しています。これは、ansi-colorがカラー化を行う方法です。バッファ全体を色付けする必要はなく、表示されている部分のみを色付けする必要があるため、ここでさらに最適化する機会があります。
event_jr 2011

0

あなたの解決策に@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たソリューションとは異なり、元のファイルを変更せずにエスケープシーケンスを色に置き換えることができます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.