Раскраска 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.

Подробности см. В моем ответе на повторяющийся вопрос.

Другие вопросы по тегам