Раскраска ANSI в режиме компиляции
Кто-нибудь добавил поддержку ANSI-цвета в режиме компиляции Emacs? Если это так, какое свойство / атрибут должна проверять программа для записи цвета, чтобы убедиться, что ее активный терминал поддерживает экранирование ANSI.
6 ответов
Уже есть функция для применения цвета к буферам коминт. Вам просто нужно включить его в буферах компиляции:
(require 'ansi-color)
(defun colorize-compilation-buffer ()
(toggle-read-only)
(ansi-color-apply-on-region compilation-filter-start (point))
(toggle-read-only))
(add-hook 'compilation-filter-hook 'colorize-compilation-buffer)
Программы цветного письма должны проверить TERM
переменная окружения и база данных terminfo, чтобы проверить, поддерживает ли терминал цвет. На практике многие программы игнорируют это и полагаются на пользовательские настройки. Emacs установит тип терминала компиляции на dumb
по умолчанию, но это можно переопределить, установив compilation-environment
переменная.
Мое оптимизированное решение, которое не загрязняет M-x grep
(только для M-x compile
):
(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))
Начиная с emacs 28.1, теперь это встроенный !
(require 'ansi-color)
(add-hook 'compilation-filter-hook 'ansi-color-compilation-filter)
Или с пакетом использования
(use-package ansi-color
:hook (compilation-filter . ansi-color-compilation-filter))
Опираясь на решение@stribb, которое основано на решении@gavenkoa, вот как настроить его с помощью удивительного пакета использования:
(use-package ansi-color
:config
(defun my-colorize-compilation-buffer ()
(when (eq major-mode 'compilation-mode)
(ansi-color-apply-on-region compilation-filter-start (point-max))))
:hook (compilation-filter . my-colorize-compilation-buffer))
Обращаясь к решению@gavenkoa:
(when (require 'ansi-color nil t)
(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))
Это не будет блокировать ошибки, но все равно не вызовет ошибку, если ANSI-цвет недоступен. Лично я нахожу семантику подстановочного знака ignore-error
неприятен.
По состоянию на 2020 год самым современным способом является xterm-color
Пакет Emacs.
Подробности см. В моем ответе на повторяющийся вопрос.