2012-11-15 13 views
27

Czy ktoś dodał obsługę ansi-color w trybie kompilacji Emacs? Jeśli tak, to jaką właściwość/atrybut ma sprawdzić program do kolorowania, aby upewnić się, że aktywny terminal obsługuje kolorowanie ucieczki ANSI.Kolorowanie ANSI w trybie kompilacji

+2

możliwe duplikat [kolorach ANSI ogórek jest brudząc się emacsowi bufor kompilacja] (http://stackoverflow.com/questions/3072648/cucumbers-ansi-colors-messing-up-emacs-compilation-buffer) – legoscia

Odpowiedz

41

Istnieje już funkcja do nakładania koloru na bufory COMP. Wystarczy włączyć go na buforach kompilacji: pisanie programów

(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) 

kolor powinien sprawdzić zmienną środowiskową TERM i bazy danych terminfo aby sprawdzić, czy terminal obsługuje kolory. W praktyce wiele programów ignoruje to i polega na ustawieniu użytkownika. Emacs domyślnie ustawi typ terminala kompilacji na dumb, ale można to zmienić poprzez ustawienie zmiennej compilation-environment.

+0

Wygląda na to, że nie działa on całkowicie. Przetestowałem z 'grep --color', a czasem większe regiony przebarwiają się, co nie powinno być. Wygląda na to, że Emacs nie zawsze wykrywa wyłączenie sekwencji kontrolnych ANSI :( –

+1

@ Nordlöw, Naprawiłem ten problem i zaktualizowałem post.Funkcja próbowała zabarwić cały bufor, chociaż powinna filtrować tylko porcję, która jest Wylany z procesu. Chociaż nowa wersja jest znacznie bardziej niezawodna i szybka, nadal może być mylona, ​​ponieważ nie jest gwarantowane, że proces nie zmniejszy jego wydajności w trakcie sekwencji ucieczki – ivg

+0

Dzięki za pomoc. –

22

Moja zoptymalizowane rozwiązanie, które nie zanieczyszczają M-x grep (tylko dla 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

Dziękuję! Kiedy użyłem czegoś bardziej podobnego do powyższej zaakceptowanej odpowiedzi, moje bufory rgrep były wyświetlane czerwoną czcionką. znacznie lepiej dla mnie.Za pomocą emacsa 24.3.50.1. – sockmonk

+2

Dzięki, wydaje się, że to lepsze rozwiązanie.Korzystanie z 'kompilacji-filtr-start' powinno być znacznie bardziej wydajne niż ponowne kolorowanie wszystkiego zakład ween '(point-min)' i '(point-max)' za każdym razem. – mgalgs

+1

Aby to zadziałało, ustawiłem zmienną kompilacji-środowiska na TERM = xterm-256color. –