Perché il buffer * compilation * mostra i caratteri di controllo?


9

Sto usando il *compilation*buffer per creare un'applicazione C ++ su Centos 5 e Centos 6. Il buffer mostra la build e include riferimenti ai file che fanno parte della build. Tuttavia, sto ottenendo caratteri di controllo come ^[appaiono nell'output ed è difficile da leggere ed emacs sta ottenendo nomi di file corrotti quando si fa clic su uno nell'output. Penso che questi personaggi siano una sorta di colorazione o altre annotazioni sull'output del compilatore, ma non so da dove vengano. Ecco un esempio di output:

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

Come posso eliminare l'output non testuale nel mio buffer di compilazione?


1
Assomigliano alle fughe di colore e formattazione di VT100. Potresti provare a disabilitare i colori passando -fdiagnostics-color=nevera gcc(supponendo che gccsia il tuo cc)
PythonNut

Dato che ansi-color-apply-on-regionpotrebbe essere lento, ho scritto questo frammento qualche settimana fa: de-ansi.el . Non intendevo che fosse un pacchetto e quindi ha dipendenze dal pacchetto key-chords e dalla mia temporanea modalità secondaria temp-mode.el . Devi anche essere su emacs 24.4 o successivo per la funzione di notifica file.
Kaushal Modi,

Risposte:


14

Queste sono in effetti sequenze di escape che il terminale dovrebbe interpretare come ordini per cambiare il colore del testo. Normalmente non dovrebbero essere usati quando il compilatore è invocato da Emacs (il tipo di terminale dovrebbe essere impostato su dumb, il che dovrebbe far sì che il compilatore si astenga dall'usare qualsiasi sequenza di escape). Potrebbe esserci qualcosa di sbagliato nella tua configurazione che fa sì che i colori vengano usati quando non dovrebbero. Ma puoi far riconoscere a Emacs le sequenze di escape con il pacchetto ansi-color .

Qualcosa del genere dovrebbe far sì che i buffer di compilazione gestiscano le sequenze di escape ANSI invece di visualizzarle come stringhe non elaborate.

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

1
Estremamente utile. Funziona in Emacs 26.1.
Lalylulelo,

1
Questo ricolora l'intero buffer ogni volta che viene eseguito (e mi ha portato a colorare tutto il testo fino all'ultimo colore di primo piano). Questo hook imposta "compilation-filter-start" all'inizio della regione inserita con il punto spostato alla fine. Quindi userei quelli invece di (point-min) e (point-max).
GT
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.