Чому * компіляція * буфер показує контрольні символи?


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

Як я можу позбутися нетекстового виводу в моєму буфері компіляції?


1
Вони виглядають як VT100 Кольорові та форматування втечі. Ви можете спробувати відключити кольори, перейшовши -fdiagnostics-color=neverна gcc(припускаючи, що gccце ваш cc)
PythonNut

Оскільки це ansi-color-apply-on-regionможе бути повільним, я написав цей фрагмент кілька тижнів тому: de-ansi.el . Я не мав наміру бути пакетом, і тому він має залежність від пакета брелоків-брелоків та мого тимчасового другорядного режиму temp-mode.el . Вам також потрібно бути на emacs 24.4 або пізнішої версії для функції сповіщення файлів.
Каушал Моді

Відповіді:


14

Це дійсно послідовності втечі, які термінал повинен інтерпретувати як наказ про зміну кольору тексту. Зазвичай вони не повинні використовуватися, коли компілятор викликається від Emacs (тип терміналу повинен бути встановлений dumb, що повинно змусити компілятор утримуватися від використання будь-якої послідовності запуску). У вашій конфігурації може бути щось не так, що призводить до використання кольорів, коли вони не повинні. Але ви можете змусити Emacs розпізнавати послідовності евакуації за допомогою пакету ansi-кольорів .

Щось подібне повинно змусити буфери компіляції обробляти послідовності відходу 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
Це перефарбовує весь буфер кожного разу, коли він запускається (і в результаті забарвлює весь текст до останнього для мене кольором переднього плану). Цей гачок встановлює "компіляція-фільтр-старт" на початок області, вставленої з точкою, переміщеною до кінця. Тому я б використав ці замість (point-min) та (point-max).
gct
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.