ANSI цвета огурца испортили буфер компиляции emacs

При работе в Emacs я использую команду компиляции (по умолчанию F12) для запуска программ. Когда я запускаю Cucumber в Emacs, Cucumber выплевывает цвета ANSI, которые режим компиляции Emacs не интерпретирует. Результат ужасен и труден для чтения. Вот фрагмент буфера *compilation*, показывающий уродливое:

^[[31m(::) failed steps (::)^[[0m

Команда, которую я использую:

( cd ~/lab/rails/todolist && rake cucumber:all )

Версии:

  • Emacs 23.1
  • Огурец 0.8.3
  • Огурцы-рельсы 0.3.2

Мир был бы солнечным и пение птиц, если бы я мог:

  • Получить Emacs для интерпретации кодов цвета ANSI в его буфере компиляции, или
  • Получить огурец, чтобы перестать выплевывать цветовые коды ANSI

Есть идеи?

2 ответа

Решение

Я использую это, чтобы включить цветовую интерпретацию ANSI в буфере компиляции:

(require 'ansi-color)
(defun colorize-compilation-buffer ()
  (let ((inhibit-read-only t))
    (ansi-color-apply-on-region (point-min) (point-max))))
(add-hook 'compilation-filter-hook 'colorize-compilation-buffer)

Я улучшаю код, чтобы он не загрязнял M-x grep как команды и более эффективные:

(ignore-errors
  (require 'ansi-color)
  (defun my-colorize-compilation-buffer ()
    (when (eq major-mode 'compilation-mode)
      (ansi-color-apply-on-region compilation-filter-start (point-max))))
  (add-hook 'compilation-filter-hook 'my-colorize-compilation-buffer))

По состоянию на 2020 год самым современным способом является xterm-color Пакет Emacs.

  1. Выполнить M-x package-install с участием xterm-color.

  2. Добавьте следующие строки в свой ~/.emacs или ~/.emacs.d/init.el:

(require 'xterm-color)
(setq compilation-environment '("TERM=xterm-256color"))
(defun my/advice-compilation-filter (f proc string)
  (funcall f proc (xterm-color-filter string)))
(advice-add 'compilation-filter :around #'my/advice-compilation-filter)

(См. Документацию xterm-color.)

Обратите внимание, что это приведет к сообщению об ошибке, если xterm-colorбыл установлен неправильно. Это настоятельно рекомендуется, потому что при неполной установке Emacs четко объяснит вам, что не так, вместо того, чтобы вы задавались вопросом, почему цвета не работают.

Однако, если вы действительно предпочитаете не получать информацию, еслиxterm-color отсутствует, используйте вместо этого:

(when (require 'ansi-color nil t)
  (setq compilation-environment '("TERM=xterm-256color"))
  (defun my/advice-compilation-filter (f proc string)
    (funcall f proc (xterm-color-filter string)))
  (advice-add 'compilation-filter :around #'my/advice-compilation-filter))
Другие вопросы по тегам