2012-11-15 6 views
27

Quelqu'un a-t-il ajouté le support pour ansi-color en mode Emacs en mode compilation? Si oui, quelle propriété/attribut le programme d'écriture de couleur doit-il vérifier pour s'assurer que son terminal actif supporte la coloration d'échappement ANSI?Coloriage ANSI en mode compilation

+2

double possible de [couleurs ANSI de concombre déconner Buffer de compilation emacs] (http://stackoverflow.com/questions/3072648/concombres-ansi-couleurs-déconner-emacs-compilation-buffer) – legoscia

Répondre

41

Il existe déjà une fonction pour appliquer la couleur aux tampons de comint. Il vous suffit de l'activer sur les tampons de compilation:

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

programmes d'écriture de couleur doivent vérifier la variable d'environnement TERM et la base de données terminfo pour vérifier si le terminal prend en charge la couleur. En pratique, beaucoup de programmes ignorent cela et s'appuient sur un paramètre utilisateur. Emacs définira le type de terminal de compilation sur dumb par défaut, mais cela peut être annulé en définissant la variable compilation-environment.

+0

Cela ne semble pas fonctionner complètement. J'ai testé avec 'grep --color' et des régions parfois plus grandes sont colorisées ce qui ne devrait pas être. Il semble qu'Emacs ne détecte pas toujours les séquences de contrôle ANSI désactivées: ( –

+1

@ Nordlöw, j'ai corrigé ce problème et mis à jour le post.) La fonction essayait de coloriser le tampon entier, bien qu'il ne doive filtrer que le fragment qui est Bien que la nouvelle version soit beaucoup plus robuste et rapide, elle peut encore être confondue, car il n'est pas garanti qu'un processus ne coupe pas sa sortie au milieu de la séquence d'échappement – ivg

+0

Merci, pour l'aide. –

22

Ma solution optimisée qui ne pollue M-x grep (uniquement pour 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

Merci Quand j'ai utilisé quelque chose de plus comme la réponse acceptée ci-dessus, mes tampons rgrep s'affichaient dans une police rouge. Avec emacs 24.3.50.1 – sockmonk

+2

Merci, cela semble être une meilleure solution.Utiliser 'compilation-filter-start' devrait être beaucoup plus efficace que de re-colorier tout ween '(point-min)' et '(point-min)' chaque fois. – mgalgs

+1

Pour que cela fonctionne, j'ai dû définir la variable d'environnement de compilation sur TERM = xterm-256color. –