Как отображать цветовые коды 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))