Як розфарбувати текст у emacs?


11

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

Текст, на який я посилаюся, існує у файлі. Коли я відкриваю цей файл у emacs, я хочу мати змогу бачити його кольоровим або перемикати його, щоб показати послідовності втечі ANSI (SGR).

ansi-color.el Мабуть, те, що мені потрібно, але я не зміг змусити його зробити будь-яке забарвлення послідовностей втечі 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?

Відповіді:


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))

Фантастичний .. наче за магією! Добре пояснено, і ваше Інтерактивне посилання Зробити функцію дуже допомогло. Я починаю бачити загальну структуру 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)

Це теж корисний варіант. Він використовує ansi-colorі робить його на крок далі, як говорить ваше посилання, "... Мета tty-format.el полягає в тому, щоб зробити * такі файли видимими." * .. " такі файли ", що містять ANSI SGR втечу послідовності та
зворотній пробіг

1
Для чого це варто .. Цей метод порівняно з повністю редагованою версією, розміщеною в публікації event_jr, має більш швидку (~ 25%) швидкість безперервного виклику з значно більшою (набагато кращою) частотою оновлення. Тестовий файл мав 45 000 рядків. Для редагованої версії екран оновлення екрану зупиняється приблизно на 75% шляху через файл, але смуга прокрутки все ще прокручується. Я підозрюю, що це через деяку накладну частку буфера скасування точки / позначки в редагованій версії. .. Обидва способи мають свої переваги ... (під "безперервним" , я маю на увазі тримати натискання клавіші сторінки вгору / вниз постійно)
Peter.O

Сторінки формату PS .. tty формату так само швидко і швидко, як менше , ніж у терміналі (час був у межах секунди або двох одна від одної; приблизно 50 секунд від верхнього ботону та знизу вгорі).
Пітер.O

Я не знав про це tty-format. Здається, це перевершує мою функцію обгортки або трипорядковий похідний режим. :) Emacs важко справляється з великою кількістю накладок, а саме як ansi-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))

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.