Как отображать цветовые коды ANSI в emacs для любого режима?
У меня есть файл журнала, который использует цветовые коды escape ANSI для форматирования текста. Режим fundamental
. Есть другие ответы на вопросы, которые затрагивают эту проблему, но я не уверен, как применить ее к этому режиму или в любом другом режиме. Я знаю, что решение имеет какое-то отношение к настройке ansi-color
в некотором роде.
Ответы
Ответ 1
Вы можете использовать код ниже
(require 'ansi-color)
(defun display-ansi-colors ()
(interactive)
(ansi-color-apply-on-region (point-min) (point-max)))
Затем вы можете выполнить display-ansi-colors
через M-x, используя привязку по ключу по вашему выбору или через какое-либо программное условие (возможно, ваши файлы журналов имеют расширение или имя, которое соответствует некоторому регулярному выражению)
Если вы хотите сделать это с помощью буферов только для чтения (файлы журналов, результаты grep), вы можете использовать inhibit-read-only
, поэтому функция будет:
(defun display-ansi-colors ()
(interactive)
(let ((inhibit-read-only t))
(ansi-color-apply-on-region (point-min) (point-max))))
Ответ 2
Решения Gavenkoa и Juanleon помогли мне, но не приносили удовлетворения, поскольку они изменяли содержимое файла, который я читал.
Чтобы раскрасить, не изменяя содержимое файла, скачайте tty-format.el и добавьте следующее в ваш .emacs:
(add-to-list 'load-path "path/to/your/tty-format.el/")
(require 'tty-format)
;; M-x display-ansi-colors to explicitly decode ANSI color escape sequences
(defun display-ansi-colors ()
(interactive)
(format-decode-buffer 'ansi-colors))
;; decode ANSI color escape sequences for *.txt or README files
(add-hook 'find-file-hooks 'tty-format-guess)
;; decode ANSI color escape sequences for .log files
(add-to-list 'auto-mode-alist '("\\.log\\'" . display-ansi-colors))
Формат tty основан на ansi-color.el, который изначально поставляется только с последними версиями emacs.
Ответ 3
Пользовательская функция:
(defun my-ansi-color (&optional beg end)
"Interpret ANSI color esacape sequence by colorifying cotent.
Operate on selected region on whole buffer."
(interactive
(if (use-region-p)
(list (region-beginning) (region-end))
(list (point-min) (point-max))))
(ansi-color-apply-on-region beg end))
Для буферов, использующих фильтр использования коммитов/компиляторов:
(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))