Dlaczego bufor * kompilacji * pokazuje znaki sterujące?

9

Używam *compilation*bufora do zbudowania aplikacji C ++ na Centos 5 i Centos 6. Bufor pokazuje kompilację i zawiera odniesienia do plików, które są częścią kompilacji. Jednak dostaję znaki kontrolne, takie jak ^[pojawiają się na wyjściu i trudno jest je odczytać, a emacs otrzymuje uszkodzone nazwy plików po kliknięciu jednego z nich. Myślę, że te postacie są jakimś kolorem lub inną adnotacją na wyjściu kompilatora, ale nie wiem, skąd pochodzą. Oto przykładowe dane wyjściowe:

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

Jak mogę pozbyć się nietekstowego wyniku w buforze kompilacji?

WilliamKF
źródło
1
Wyglądają jak znaki zmiany koloru i formatowania VT100. Możesz spróbować wyłączyć kolory, przechodząc -fdiagnostics-color=neverdo gcc(zakładając, że gccto twoje cc)
PythonNut
Jak to ansi-color-apply-on-regionmoże być powolne, napisałem ten fragment kilka tygodni temu: de-ansi.el . Nie chciałem go mieć pakiet, a więc ma zależności na opakowaniu key-akordów i na moim tymczasowym trybie moll Temp-mode.el . Musisz także korzystać z emacsa 24.4 lub nowszego, aby włączyć funkcję powiadamiania o plikach.
Kaushal Modi

Odpowiedzi:

14

Są to rzeczywiście sekwencje specjalne, które terminal powinien interpretować jako rozkazy zmiany koloru tekstu. Zwykle nie należy ich używać, gdy kompilator jest wywoływany z Emacsa (typ terminala powinien być ustawiony na dumb, co powinno spowodować, że kompilator powstrzyma się od używania jakiejkolwiek sekwencji ucieczki). W twojej konfiguracji może być coś złego, co powoduje, że kolory są używane, gdy nie powinny. Ale możesz sprawić, by Emacs rozpoznał sekwencje specjalne za pomocą pakietu kolorów ansi .

Coś takiego powinno sprawić, że bufory kompilacji będą obsługiwały sekwencje specjalne ANSI zamiast wyświetlać je jako nieprzetworzone łańcuchy.

(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
źródło
1
Niezwykle przydatny. Działa w Emacs 26.1.
Lalylulelo
1
Powoduje to zmianę koloru całego bufora za każdym razem, gdy jest uruchamiany (i spowodowało dla mnie kolorowanie całego tekstu do ostatniego koloru pierwszego planu). Ten zaczep ustawia „kompilacja-filtr-start” na początek regionu wstawionego z punktem przesuniętym na koniec. Więc użyłbym ich zamiast (punkt-min) i (punkt-maks.).
gct