Wie färbe ich Text in Emacs?

11

Ich mag Ansicht (und / oder bearbeiten) kolorierte Text in Emacs, wie ausgegeben durch ls -l --color=always, tree...oder was auch immer.

Der Text, auf den ich mich beziehe, existiert in einer Datei. Wenn ich diese Datei in Emacs öffne, möchte ich sie koloriert sehen oder umschalten können, um ANSI (SGR) Escape-Sequenzen anzuzeigen.

ansi-color.el Es scheint das zu sein, was ich brauche, aber ich konnte es nicht dazu bringen, die ANSi-Escape- Sequenzen einzufärben , aber ich sehe blau-fett für einzelne Steuerbytes (z. B. ^Aund ^[) ... bin ich nicht sicher, ob das ein Merkmal von ist ansi-color, aber ich denke, es ist.

Laut den Kommentaren von ansi-color.el kann es mit Zeichenfolgen und Regionen funktionieren, aber selbst das scheint nicht zu funktionieren. Zum Beispiel wird die Funktion von ansi-color-apply-on-regionnicht erkannt M-x. Es heißt "No match"

Ich habe (require 'ansi-color)zu meiner .emacs- Datei hinzugefügt und sogar (add-hook 'shell-mode-hook 'ansi-color-for-comint-mode-on). Ich bekomme keine Fehler oder Warnungen, wenn Emacs startet, also stecke ich fest.

Wie kann ich die Standardfunktionen zum Laufen bringen und kann sie beim Öffnen einer Datei, deren Name mit einem Suffix versehen ist, automatisch anwenden .col?

Peter.O
quelle

Antworten:

15

Ich denke, das Stück, das Sie vermissen, ist die interactiveForm. So unterscheidet Emacs zwischen einer Funktion, die von anderen Funktionen aufgerufen werden soll, und einer Funktion, die direkt vom Benutzer aufgerufen werden soll. Siehe den Emacs Lisp Intro- Knoten

Wenn Sie nun die Definition von lesen ansi-color-apply-on-region, werden Sie feststellen, dass sie nicht für die interaktive Verwendung ausgelegt ist. "ansi-color" dient zum Filtern der Comint-Ausgabe. Es ist jedoch einfach, einen interaktiven Wrapper dafür zu erstellen.

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

Das nächste Bit ist, dass Sie Ansi-Farben für die Erweiterung .col aktivieren möchten. Sie können jedem Hauptmodus, den Sie zum Bearbeiten dieser Dateien verwenden möchten, eine Hook-Funktion hinzufügen. Die Funktion wird immer dann ausgeführt, wenn Sie den Hauptmodus aktivieren. Sie müssen also eine Überprüfung für das richtige Dateisuffix hinzufügen.

Alternativ können Sie einen schnell abgeleiteten Modus hacken, der auf dem "grundlegenden" Modus basiert.

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

und ordnen Sie es dieser Erweiterung zu.

(setq auto-mode-alist
      (cons '("\\.col\\'" . fundamental-ansi-mode) auto-mode-alist))
event_jr
quelle
Fantastisch ... wie von Zauberhand! Gut erklärt, und Ihr Link " Funktion aktiv machen" hat viel geholfen. Ich bin beginnen die allgemeine Struktur von Emacs zu sehen. Danke ...
Peter.O
Ich frage mich, was ich falsch mache. Ich habe den gesamten Text, den Sie oben haben, in meine .emacs-Datei eingefügt, aber der Text, den ich hervorhole, scheint nach dem Aufrufen von ansi-color-apply-on-region-int nicht farbig zu werden.
SFbay007
5

Mit der folgenden Lösung können Dateien mit ANSI-Farbsequenzen gelesen (und nicht gespeichert) werden. Die Dateinamen müssen eine .txtErweiterung haben.

Legen Sie die Bibliothek tty-Format in ~/.emacs.d/site-lisp/, dann fügen Sie diese Zeilen zu Ihrer ~/.emacsinit - Datei.

(add-to-list 'load-path "~/.emacs.d/site-lisp/")              
(require 'tty-format)
(add-hook 'find-file-hooks 'tty-format-guess)
Enzotib
quelle
Dies ist auch eine nützliche Option. Es nutzt ansi-colorund geht noch einen Schritt weiter, wie Ihr Link sagt: "... Das Ziel von tty-format.el ist nur, * solche Dateien sichtbar zu machen ." * .. " solche Dateien " sind solche, die ANSI SGR-Escape enthalten Sequenzen und Backspacing .. Danke ..
Peter.O
1
Für das, was es wert ist. Diese Methode im Vergleich zur vollständig bearbeitbaren Version von event_jr hat eine schnellere (~ 25%) kontinuierliche Paging-Geschwindigkeit mit einer deutlich besseren (viel! Besseren) Aktualisierungsfrequenz. Die Testdatei hatte 45.000 Zeilen. Bei der bearbeitbaren Version wurde die Bildschirmaktualisierung bei etwa 75% des Weges durch die Datei angehalten, aber die Bildlaufleiste rollte immer noch. Ich vermute, dass dies auf einen gewissen Overhead eines Punkt- / Markierungs-Rückgängig-Puffers in der bearbeitbaren Version zurückzuführen ist. .. Beide Methoden haben ihre Vorteile ... (mit "kontinuierlich" meine ich, die
Bild-auf
PS .. Seiten im Tty-Format so reibungslos und so schnell wie weniger im Terminal (die Zeiten lagen innerhalb von ein oder zwei Sekunden voneinander; ca. 50 Sekunden von oben nach unten und von unten nach oben).
Peter.O
Ich war mir nicht bewusst tty-format. Es scheint meiner Wrapper-Funktion oder dem 3-Zeilen-Ableitungsmodus überlegen zu sein. :) Emacs hat es schwer mit vielen Overlays umzugehen, so wie Ansi-Color die Kolorierung macht. Hier besteht die Möglichkeit einer weiteren Optimierung, da nicht der gesamte Puffer, sondern nur der angezeigte Teil eingefärbt werden muss.
event_jr
0

Vielen Dank @enzotib für Ihre Lösung!

Als Ergänzung zu Ihrer Lösung können Sie sie wie folgt explizit für den Benutzer aufrufbar machen:

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

und automatisch für andere Dateien als nur * .txt oder README:

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

Auf diese Weise können Sie Ihre Escape-Sequenzen durch Farben ersetzen, ohne die Originaldatei zu ändern, im Gegensatz zu Lösungen, die verwendet werden ansi-color-apply-on-region.

deb0ch
quelle