Jak pokolorować tekst w emacsie?

11

Chcę widzenia (i / lub edytować) kolorowanie tekstu w emacs, takiego jakie jest wyjście przez ls -l --color=always, tree...lub cokolwiek.

Tekst, o którym mówię, istnieje w pliku. Kiedy otwieram ten plik w emacsie, chcę mieć możliwość zobaczenia go pokolorowanego lub przełączenia go, aby pokazać sekwencje specjalne ANSI (SGR).

ansi-color.el wydaje się być tym, czego potrzebuję, ale nie byłem w stanie zmusić go do kolorowania sekwencji ucieczki ANSi , ale widzę niebieską pogrubienie dla poszczególnych bajtów contol (np. ^Ai ^[) ... Nie jestem jasne, czy jest to cecha ansi-color, ale myślę, że tak.

Zgodnie z komentarzami ansi-color.el może on działać z ciągami znaków i regionami, ale nawet to nie działa. Na przykład funkcja ansi-color-apply-on-regionnie jest rozpoznawana przez M-x. Mówi: „Brak dopasowania”

Dodałem (require 'ansi-color)do mojego pliku .emacs , a nawet (add-hook 'shell-mode-hook 'ansi-color-for-comint-mode-on). Nie pojawia się żaden błąd ani ostrzeżenie, gdy zaczyna się emacs, więc utknąłem.

Jak sprawić, by standardowe funkcje działały i czy można je ustawić tak, aby były automatycznie stosowane podczas otwierania pliku, którego nazwa zawiera przyrostek .col?

Peter.O
źródło

Odpowiedzi:

15

Myślę, że brakuje ci interactiveformy. W ten sposób Emacs rozróżnia funkcję zaprojektowaną do wywoływania przez inne funkcje, a funkcję zaprojektowaną do wywoływania bezpośrednio przez użytkownika. Zobacz węzeł Emacs Lisp Intro

Teraz, jeśli przeczytasz definicję ansi-color-apply-on-region, zobaczysz, że nie jest ona przeznaczona do użytku interaktywnego. „ansi-color” służy do filtrowania wyjścia komendy. Łatwo jest jednak stworzyć interaktywne opakowanie.

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

Następnym krokiem jest włączenie kolorów ansi dla rozszerzenia .col. Możesz dodać funkcję przechwytującą do dowolnego trybu głównego, którego chcesz użyć do edycji tych plików. Funkcja będzie uruchamiana za każdym razem, gdy włączysz tryb główny, więc będziesz musiał dodać sprawdzanie poprawności sufiksu pliku.

Alternatywnie możesz zhakować szybki tryb oparty na trybie „podstawowym”.

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

i powiąż to z tym rozszerzeniem.

(setq auto-mode-alist
      (cons '("\\.col\\'" . fundamental-ansi-mode) auto-mode-alist))
event_jr
źródło
Fantastycznie ... jakby magicznie! Dobrze wyjaśnione, a Twój link Make a Function Interactive bardzo pomógł. Ja zaczynając zobaczyć ogólną strukturę Emacs. Dzięki ...
Peter.O,
Zastanawiam się, co robię źle. Dodałem cały tekst, który masz powyżej w moim pliku .emacs, ale tekst, który zaznaczam, nie wydaje się zabarwiony po wywołaniu ansi-color-Apply-on-region-int.
SFbay007
5

Poniższe rozwiązanie umożliwia odczyt (i nie zapisanie) plików zawierających sekwencje kolorów ANSI. Nazwy plików muszą mieć .txtrozszerzenie.

Umieść bibliotekę w formacie tty~/.emacs.d/site-lisp/ , a następnie dodaj te wiersze do ~/.emacspliku init.

(add-to-list 'load-path "~/.emacs.d/site-lisp/")              
(require 'tty-format)
(add-hook 'find-file-hooks 'tty-format-guess)
enzotib
źródło
Jest to również przydatna opcja. Wykorzystuje ansi-colori idzie o krok dalej, jak mówi link: „... Celem tty-format.el jest po prostu udostępnienie * takich plików .” * .. „ takie pliki ” to te, które zawierają ucieczkę ANSI SGR sekwencje i
odstępy
1
Za to, co jest warte .. Ta metoda w porównaniu z wersją w pełni edytowalną opublikowaną przez event_jr ma większą (~ 25%) prędkość ciągłego stronicowania ze znacznie lepszą (znacznie! Lepszą) częstotliwością odświeżania. Plik testowy miał 45 000 linii. W przypadku wersji do edycji ekran odświeżania ekranu zatrzymuje się na około 75% drogi przez plik, ale pasek przewijania wciąż się przewijał. Podejrzewam, że dzieje się tak z powodu narzutu bufora punkt / znak w wersji edytowalnej. .. Obie metody mają swoje zalety ... (przez „ciągły” , mam na myśli ciągłe naciskanie klawisza Page Up / Down)
Peter.O
Strony w formacie tty PS .. tak płynnie i tak szybko, jak mniej w terminalu (czasy znajdowały się w odległości sekundy lub dwóch od siebie; około 50 sekund od górnego paska i od dołu do góry).
Peter.O,
Nie byłam tego świadoma tty-format. Wydaje się być lepszy od mojej funkcji otoki lub 3-liniowego trybu pochodnego. :) Emacs z trudem radzi sobie z wieloma nakładkami, czyli jak kolorystyka ansi-color. Istnieje tu możliwość dalszej optymalizacji, ponieważ nie musimy pokolorować całego bufora, tylko wyświetlaną część.
event_jr
0

Dziękuję bardzo @enzotib za twoje rozwiązanie!

Jako dodatek do Twojego rozwiązania, oto sposób, aby użytkownik mógł je wyraźnie wywołać:

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

i automatyczne dla plików innych niż tylko * .txt lub README:

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

W ten sposób możesz zastąpić sekwencje specjalne kolorami bez zmiany oryginalnego pliku, w przeciwieństwie do rozwiązań wykorzystujących ansi-color-apply-on-region.

deb0ch
źródło