Почему в буфере компиляции отображаются управляющие символы?

9

Я использую *compilation*буфер для сборки приложения C ++ на Centos 5 и Centos 6. Буфер показывает сборку и включает ссылки на файлы, которые являются частью сборки. Тем не менее, я получаю управляющие символы, такие как ^[появляются в выходных данных, и их трудно прочитать, а emacs получает поврежденные имена файлов, когда вы нажимаете один из них в выходных данных. Я думаю, что эти символы - какая-то окраска или другая аннотация на выходе компилятора, но я не знаю, откуда они берутся. Вот пример вывода:

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

Как я могу избавиться от нетекстового вывода в моем буфере компиляции?

WilliamKF
источник
1
Они выглядят как VT100 Color и экранирование форматирования. Вы можете попытаться отключить цвета пропускания -fdiagnostics-color=neverк gcc(при условии , что gccваш cc)
PythonNut
Поскольку это ansi-color-apply-on-regionможет быть медленным, я написал этот фрагмент несколько недель назад: de-ansi.el . Я не хотел, чтобы это был пакет, и поэтому у него есть зависимости от пакета key-chords и от моего временного вспомогательного режима temp-mode.el . Вы также должны быть на emacs 24.4 или новее для функции уведомления о файлах.
Каушал Моди

Ответы:

14

Это действительно escape-последовательности, которые терминал должен интерпретировать как приказы об изменении цвета текста. Обычно они не должны использоваться, когда компилятор вызывается из Emacs (тип терминала должен быть установлен на dumb, что должно заставить компилятор воздерживаться от использования любой escape-последовательности). В вашей конфигурации может быть что-то не так, что заставляет использовать цвета, когда они не должны. Но вы можете заставить Emacs распознавать escape-последовательности с помощью пакета ansi-color .

Нечто подобное должно заставить буферы компиляции обрабатывать escape-последовательности ANSI, а не отображать их в виде необработанных строк.

(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
Очень полезно. Работает в Emacs 26.1.
Lalylulelo
1
Это перекрашивает весь буфер каждый раз, когда он запускается (и приводил к окрашиванию всего текста до последнего цвета переднего плана для меня). Этот хук устанавливает «compilation-filter-start» в начало области, вставленной с точкой, перемещенной в конец. Поэтому я бы использовал их вместо (point-min) и (point-max).
GCT