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.
Выполнить
M-x package-install
с участиемxterm-color
.Добавьте следующие строки в свой
~/.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))