Pourquoi le tampon * compilation * affiche-t-il les caractères de contrôle?

9

J'utilise le *compilation*tampon pour créer une application C ++ sur Centos 5 et Centos 6. Le tampon affiche la génération et inclut des références aux fichiers qui font partie de la génération. Cependant, je reçois des caractères de contrôle comme ceux qui ^[apparaissent dans la sortie et il est difficile à lire et emacs obtient des noms de fichiers corrompus lorsque vous cliquez sur un dans la sortie. Je pense que ces caractères sont une sorte de coloration ou autre annotation sur la sortie du compilateur mais je ne sais pas d'où ils viennent. Voici un exemple de sortie:

cc -c -g -I../machind -I. -DRELEASE_VERSION -g -O2 -m64 -D__BITS64 -pipe -DARCH_64 -DARCH_INTEL -DARCH_X86 -DARCH_X86_64 -DOS_LINUX -pthread -DLM_INTERNAL -DFLEXLM_KITBUILD -DFLEX_STATIC -DRELEASE_VERSION -DGPLATFORM=\\"x64_lsb\\" -DLINUX -DLSB3_0 -D__FD_SETSIZE=65535 -DGLIBC -DLINUX64 -DAMD64 -DREDHAT -DREL -DRHLINUX64 -DPLATFORM_AMD64_RHLINUX   -DNO_ACTIVATION_SUPPORT ../machind/lmcrypt.c
^[[01m^[[K../machind/lmcrypt.c:^[[m^[[K In function  ^[[01m^[[Kmain^[[m^[[K :
^[[01m^[[K../machind/lmcrypt.c:156:47:^[[m^[[K ^[[01;35m^[[Kwarning: ^[[m^[[Kcast to pointer from integer of different size [-Wint-to-pointer-cast]
     lc_set_attr(lm_job, LM_A_MAX_LICENSE_LEN, (LM_A_VAL_TYPE)max);
^[[01;32m^[[K                                               ^^[[m^[[K

Comment puis-je me débarrasser de la sortie non textuelle dans mon tampon de compilation?

WilliamKF
la source
1
Ceux-ci ressemblent à des échappements de formatage et de couleur VT100. Vous pouvez essayer de désactiver les couleurs en passant -fdiagnostics-color=neverà gcc(en supposant que ce gccsoit votre cc)
PythonNut
Comme cela ansi-color-apply-on-regionpourrait être lent, j'ai rédigé cet extrait il y a quelques semaines: de-ansi.el . Je ne voulais pas que ce soit un package et il a donc des dépendances sur le package d'accords clés et sur mon mode mineur temporaire temp-mode.el . Vous devez également être sur emacs 24.4 ou version ultérieure pour la fonction de notification de fichier.
Kaushal Modi

Réponses:

14

Ce sont en effet des séquences d'échappement que le terminal doit interpréter comme des ordres pour changer la couleur du texte. Normalement, ils ne doivent pas être utilisés lorsque le compilateur est appelé depuis Emacs (le type de terminal doit être défini sur dumb, ce qui devrait empêcher le compilateur d'utiliser toute séquence d'échappement). Il peut y avoir un problème dans votre configuration qui fait que les couleurs doivent être utilisées alors qu'elles ne devraient pas l'être. Mais vous pouvez faire en sorte qu'Emacs reconnaisse les séquences d'échappement avec le paquet ansi-color .

Quelque chose comme ça devrait permettre aux tampons de compilation de gérer les séquences d'échappement ANSI au lieu de les afficher sous forme de chaînes brutes.

(require 'ansi-color)
(defun my/ansi-colorize-buffer ()
  (let ((buffer-read-only nil))
    (ansi-color-apply-on-region (point-min) (point-max))))
(add-hook 'compilation-filter-hook 'my/ansi-colorize-buffer)
François Févotte
la source
1
Extrêmement utile. Fonctionne dans Emacs 26.1.
Lalylulelo
1
Cela re-colore le tampon entier chaque fois qu'il s'exécute (et a pour résultat de colorer tout le texte à la dernière couleur de premier plan pour moi). Ce hook définit "compilation-filter-start" au début de la région insérée avec le point déplacé à la fin. Je les utiliserais donc au lieu de (point-min) et (point-max).
gct