Come colorare il testo in emacs?


11

Voglio vista (e / o modificare) il testo colorized in emacs, come viene emesso ls -l --color=always, tree...o qualsiasi altra cosa.

Il testo a cui mi riferisco esiste in un file. Quando apro quel file in emacs, voglio essere in grado di vederlo colorato o attivarlo per mostrare le sequenze di escape ANSI (SGR).

ansi-color.el sembra essere quello di cui ho bisogno, ma non sono stato in grado di farlo colorizzare le sequenze di escape ANSi , ma vedo il blu-grassetto per i singoli byte di controllo (ad es. ^Ae ^[) ... Non lo sono certo se questa è una caratteristica di ansi-color, ma penso che sia.

Secondo i commenti ansi-color.el , può funzionare con stringhe e regioni, ma anche ciò non sembra funzionare. Ad esempio, la funzione ansi-color-apply-on-regionnon è riconosciuta da M-x. Dice "Nessuna corrispondenza"

Ho aggiunto (require 'ansi-color)al mio file .emacs e anche (add-hook 'shell-mode-hook 'ansi-color-for-comint-mode-on). Non ricevo alcun errore o avviso quando inizia emacs, quindi sono bloccato.

Come posso far funzionare le funzioni standard e può essere applicato automaticamente all'apertura di un file il cui nome è suffisso .col?

Risposte:


15

Penso che il pezzo che ti manca sia il interactivemodulo. È così che Emacs distingue tra una funzione progettata per essere chiamata da altre funzioni e una funzione progettata per essere chiamata direttamente dall'utente. Vedi il nodo Emacs Lisp Intro

Ora, se leggi la definizione di ansi-color-apply-on-region, vedrai che non è progettato per l'uso interattivo. "ansi-color" è progettato per filtrare l'output dei commenti. Tuttavia è facile creare un wrapper interattivo per questo.

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

Il prossimo passo è che vuoi attivare i colori ansi per l'estensione .col. È possibile aggiungere una funzione hook a qualunque modalità principale che si desidera utilizzare per modificare quei file. La funzione verrà eseguita ogni volta che si attiva la modalità principale, quindi sarà necessario aggiungere un controllo per il suffisso del file corretto.

In alternativa puoi hackerare una modalità derivata rapida basata sulla modalità "fondamentale".

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

e associarlo a quell'estensione.

(setq auto-mode-alist
      (cons '("\\.col\\'" . fundamental-ansi-mode) auto-mode-alist))

Fantastico .. come per magia! Ben spiegato e il tuo link interattivo Crea una funzione ha aiutato molto. Sto iniziando a vedere la struttura generale di Emacs. Grazie ...
Peter

Mi chiedo cosa sto facendo di sbagliato. Ho aggiunto tutto il testo che hai sopra nel mio file .emacs ma il testo che metto in evidenza non sembra colorato dopo aver invocato ansi-color-apply-on-region-int.
SFbay007,

5

La seguente soluzione consente di leggere (e non salvare) file contenenti sequenze di colori ANSI. I nomi dei file devono avere .txtun'estensione.

Mettere la libreria tty-formato in ~/.emacs.d/site-lisp/, quindi aggiungere queste righe al ~/.emacsfile di init.

(add-to-list 'load-path "~/.emacs.d/site-lisp/")              
(require 'tty-format)
(add-hook 'find-file-hooks 'tty-format-guess)

Anche questa è un'opzione utile. Lo utilizza ansi-colore fa un ulteriore passo avanti, come dice il tuo link, "... Lo scopo di tty-format.el è solo quello di rendere visualizzabili * tali file ." * .. " tali file " sono quelli che contengono ANSI SGR escape sequenze e backspacing .. Grazie ..
Peter.O

1
Per quello che vale .. Questo metodo rispetto alla versione completamente modificabile pubblicata da event_jr ha una velocità di paging continua più veloce (~ 25%) con frequenza di aggiornamento significativamente migliore (molto! Meglio) .. Il file di test aveva 45.000 righe. Per la versione modificabile, lo schermo si aggiorna a circa il 75% dell'intero file, ma la barra di scorrimento scorre ancora .. Sospetto che ciò sia dovuto al sovraccarico di un buffer di annullamento di punti / segni nella versione modificabile. .. Entrambi i metodi hanno i loro vantaggi ... (per "continuo" , intendo tenere premuto il tasto Pagina su / giù continuamente)
Peter.O

PS .. pagine in formato tty in modo uniforme e veloce quanto meno nel terminale (i tempi erano entro un secondo o due l'uno dall'altro; circa 50 secondi dalla parte superiore e inferiore della parte superiore).
Peter

Non ne ero a conoscenza tty-format. Sembra essere superiore alla mia funzione wrapper o alla modalità derivata a 3 righe. :) Emacs ha difficoltà a gestire molte sovrapposizioni, ed è così che la colorizzazione viene effettuata dall'ANSI-COLOR. C'è l'opportunità per un'ulteriore ottimizzazione qui, perché non è necessario colorare l'intero buffer, ma solo la parte visualizzata.
event_jr,

0

Grazie mille @enzotib per la tua soluzione!

Proprio come un'aggiunta alla tua soluzione, ecco un modo per renderla esplicitamente richiamabile dall'utente:

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

e automatico per file diversi da * .txt o README:

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

In questo modo è possibile sostituire le sequenze di escape con colori senza alterare il file originale, a differenza delle soluzioni che utilizzano ansi-color-apply-on-region.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.