Por que o buffer * de compilação * mostra caracteres de controle?

9

Estou usando o *compilation*buffer para criar um aplicativo C ++ no Centos 5 e Centos 6. O buffer mostra a compilação e inclui referências a arquivos que fazem parte da compilação. No entanto, estou recebendo caracteres de controle como ^[aparecem na saída e é difícil de ler e o emacs está recebendo nomes de arquivos corrompidos quando você clica em um na saída. Eu acho que esses caracteres são algum tipo de coloração ou outra anotação na saída do compilador, mas não sei de onde eles vêm. Aqui está o exemplo de saída:

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

Como posso me livrar da saída não textual no meu buffer de compilação?

WilliamKF
fonte
11
Eles se parecem com o VT100 Color e a formatação escapa. Você pode tentar desabilitar cores, passando -fdiagnostics-color=neverpara gcc(assumindo que gccé o seu cc)
PythonNut
Como o processo ansi-color-apply-on-regionpode ser lento, escrevi este trecho algumas semanas atrás: de-ansi.el . Eu não pretendia que fosse um pacote e, portanto, ele depende do pacote de acordes de teclas e do meu modo secundário temporário temp-mode.el . Você também precisa estar no emacs 24.4 ou posterior para o recurso de notificação de arquivos.
21415 Kaushal Modi

Respostas:

14

Essas são, de fato, seqüências de escape que o terminal deve interpretar como ordens para alterar a cor do texto. Normalmente eles não devem ser usados ​​quando o compilador é chamado pelo Emacs (o tipo de terminal deve ser definido como dumb, o que deve fazer com que o compilador se abstenha de usar qualquer sequência de escape). Pode haver algo errado na sua configuração que faz com que as cores sejam usadas quando não deveriam. Mas você pode fazer o Emacs reconhecer as seqüências de escape com o pacote ansi-color .

Algo assim deve fazer com que os buffers de compilação manipulem sequências de escape ANSI em vez de exibi-las como strings brutas.

(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
fonte
11
Extremamente útil. Funciona no Emacs 26.1.
Lalylulelo # 30/18
11
Isso recoloca o buffer inteiro toda vez que ele é executado (e resultou em colorir todo o texto para a última cor de primeiro plano para mim). Este gancho define "início do filtro de compilação" para o início da região inserida com o ponto movido para o final. Então, eu usaria aqueles em vez de (point-min) e (point-max).
GCT