2012-11-15 27 views
27

有沒有人在編譯模式Emacs中添加了對ansi-color的支持?如果是這樣,顏色寫入程序必須檢查哪些屬性/屬性,以確保其活動終端支持ANSI轉義着色。編譯模式下的ANSI着色

+2

可能重複[黃瓜的ANSI顏色弄亂Emacs的編譯緩衝區(http://stackoverflow.com/questions/3072648/cucumbers-ansi-colors-messing-up-emacs-compilation-buffer) – legoscia

回答

41

已經有一個將顏色應用到評論緩衝區的功能。你只需要啓用它在編譯緩衝區:

(require 'ansi-color) 
(defun colorize-compilation-buffer() 
    (toggle-read-only) 
    (ansi-color-apply-on-region compilation-filter-start (point)) 
    (toggle-read-only)) 
(add-hook 'compilation-filter-hook 'colorize-compilation-buffer) 

顏色寫程序應該檢查TERM環境變量和terminfo數據庫來檢查終端支持的顏色。實際上,很多程序忽略了這一點,並依賴於用戶設置。 Emacs默認將編輯終端類型設置爲dumb,但可以通過設置compilation-environment變量覆蓋此類型。

+0

它似乎並不完全工作。我使用'grep --color'進行測試,有時候較大的區域會變色,不應該是這樣。看起來Emacs並不總是檢測到禁用ANSI控制序列:( –

+1

@Nordlöw,我已經解決了這個問題,並更新了該帖子。該函數試圖着色整個緩衝區,儘管它應該只過濾大塊雖然新版本更加強大和快速,但它仍然可能會被混淆,因爲它無法保證,一個進程不會在轉義序列中間切斷輸出。 – ivg

+0

感謝您的幫助。 –

22

我的最佳解決方案不M-x grep(僅適用於M-x compile)污染:

(ignore-errors 
    (require 'ansi-color) 
    (defun my-colorize-compilation-buffer() 
    (when (eq major-mode 'compilation-mode) 
     (ansi-color-apply-on-region compilation-filter-start (point-max)))) 
    (add-hook 'compilation-filter-hook 'my-colorize-compilation-buffer)) 
+1

謝謝!當我使用更類似於上面接受的答案時,我的rgrep緩衝區顯示爲紅色字體。使用emacs 24.3.50.1。 – sockmonk

+2

謝謝,這似乎是一個更好的解決方案。使用'編譯 - 過濾器啓動'應該比重新着色所有內容更有效ween'(point-min)'和'(point-max)'每次。 – mgalgs

+1

爲了使這項工作,我需要將編譯環境變量設置爲TERM = xterm-256color。 –