Как раскрасить текст в Emacs?

11

Я хочу , чтобы просмотреть (и / или редактирования) Раскрашенная текста в Emacs, таких как выводится ls -l --color=always, tree...или любой другой .

Текст, на который я ссылаюсь, существует в файле. Когда я открываю этот файл в emacs, я хочу видеть его раскрашенным или переключать его для отображения escape-последовательностей ANSI (SGR).

ansi-color.el Похоже, это то, что мне нужно, но я не смог заставить его делать какие-либо раскраски escape- последовательностей ANSi , но я вижу выделенный синим цветом для отдельных контрольных байтов (например, ^Aи ^[) ... Я не конечно, если это особенность ansi-color, но я думаю, что это так.

Согласно комментариям ansi-color.el , он может работать со строками и областями, но даже это не похоже на работу. Например, функция ansi-color-apply-on-regionне распознается M-x. Он говорит: «Нет матча»

Я добавил (require 'ansi-color)в мой файл .emacs и даже (add-hook 'shell-mode-hook 'ansi-color-for-comint-mode-on). Я не получаю ошибок или предупреждений при запуске emacs, поэтому я застрял.

Как заставить стандартные функции работать, и можно ли сделать так, чтобы они автоматически применялись при открытии файла, к имени которого добавляется суффикс .col?

Peter.O
источник

Ответы:

15

Я думаю, что часть, которую вы пропускаете, это interactiveформа. Вот как Emacs различает функцию, предназначенную для вызова другими функциями, и функцию, предназначенную для непосредственного вызова пользователем. Смотрите узел Emacs Lisp Intro

Теперь, если вы прочитаете определение ansi-color-apply-on-region, вы увидите, что оно не предназначено для интерактивного использования. «ansi-color» предназначен для фильтрации вывода комет. Однако сделать для него интерактивную оболочку легко.

(defun ansi-color-apply-on-region-int (beg end)
  "interactive version of func"
  (interactive "r")
  (ansi-color-apply-on-region beg end))

Следующий бит - вы хотите включить цвета ANSI для расширения .col. Вы можете добавить функцию подключения к любому основному режиму, который вы хотите использовать для редактирования этих файлов. Функция будет запускаться всякий раз, когда вы включаете мажорный режим, поэтому вам нужно будет добавить проверку правильности суффикса файла.

В качестве альтернативы вы можете взломать быстрый производный режим, основанный на «фундаментальном» режиме.

(define-derived-mode fundamental-ansi-mode fundamental-mode "fundamental ansi"
  "Fundamental mode that understands ansi colors."
  (require 'ansi-color)
  (ansi-color-apply-on-region (point-min) (point-max)))

и связать его с этим расширением.

(setq auto-mode-alist
      (cons '("\\.col\\'" . fundamental-ansi-mode) auto-mode-alist))
event_jr
источник
Фантастика .. как по волшебству! Хорошо объяснил, и ваша интерактивная ссылка Make a Function очень помогла. Я , начиная видеть общую структуру Emacs. Спасибо ...
Peter.O
Интересно, что я делаю не так? Я добавил весь текст, который вы указали выше, в мой файл .emacs, но текст, который я выделил, кажется, не окрашивается после вызова ansi-color-apply-on-region-int.
SFbay007
5

Следующее решение позволяет читать (а не сохранять) файлы, содержащие цветовые последовательности ANSI. Имена файлов должны иметь .txtрасширение.

Поместите библиотеку терминальную-формат в ~/.emacs.d/site-lisp/, затем добавьте эти строки в ~/.emacsфайл инициализации.

(add-to-list 'load-path "~/.emacs.d/site-lisp/")              
(require 'tty-format)
(add-hook 'find-file-hooks 'tty-format-guess)
enzotib
источник
Это тоже полезная опция. Он использует ansi-colorи делает еще один шаг вперед, как говорится в вашей ссылке: «... Цель tty-format.el - просто сделать * такие файлы видимыми." * .. " такими файлами " являются те, которые содержат escape ANSI SGR последовательности и возврат ... Спасибо ..
Peter.O
1
Для чего это стоит ... Этот метод по сравнению с полностью редактируемой версией, опубликованной event_jr, имеет более быструю (~ 25%) скорость непрерывной подкачки со значительно лучшей (намного! Лучшей) частотой обновления. Тестовый файл содержал 45 000 строк. В редактируемой версии экран обновления экрана был остановлен примерно на 75% пути через файл, но полоса прокрутки все еще прокручивалась. Я подозреваю, что это связано с некоторыми издержками буфера отмены точки / метки в редактируемой версии. .. Оба метода имеют свои преимущества ... (под "непрерывным" я имею в виду постоянное нажатие клавиши Page Up / Down)
Peter.O
Страницы формата PS .. tty так же плавно и быстро, как меньше , в терминале (время было в пределах одной или двух секунд друг от друга; приблизительно 50 секунд от верхнего до нижнего и нижнего верха).
Peter.O
Я не знал об этом tty-format. Похоже, что он превосходит мою функцию-обертку или 3-строчный производный режим. :) Emacs с трудом справляется с множеством оверлеев, поэтому ANS-Color выполняет раскрашивание. Здесь есть возможность для дальнейшей оптимизации, потому что нам не нужно раскрашивать весь буфер, только отображаемую часть.
event_jr
0

Большое спасибо @enzotib за ваше решение!

В качестве дополнения к вашему решению, вот способ сделать его явно вызываемым для пользователя:

;; M-x display-ansi-colors to explicitly decode ANSI color escape sequences                                                                                                                                        
(defun display-ansi-colors ()
  (interactive)
  (format-decode-buffer 'ansi-colors))

и автоматически для файлов, отличных от * .txt или README:

;; decode ANSI color escape sequences for .log files                                                                                                                                                               
(add-to-list 'auto-mode-alist '("\\.log\\'" . display-ansi-colors))

Таким образом, вы можете заменить свои escape-последовательности цветами без изменения исходного файла, в отличие от решений, использующих ansi-color-apply-on-region.

deb0ch
источник