2014-04-30 18 views
16

Ho un file di registro che utilizza i codici colore di escape ANSI per formattare il testo. La modalità è fundamental. Esistono altre risposte alle domande che risolvono questo problema, ma non sono sicuro di come applicarlo a questa modalità oa un'altra modalità. So che la soluzione ha qualcosa a che fare con la configurazione di ansi-color in qualche modo.Come posso visualizzare codici colore ANSI in emacs per qualsiasi modalità?

+0

Non conosco la risposta alla tua domanda, ma è * codici colore ANSI *, non codici colore ASCII. – Chris

+0

Grazie! Ho fatto il cambiamento. – Avery

risposta

32

Si potrebbe utilizzare il codice qui sotto

(require 'ansi-color) 
(defun display-ansi-colors() 
    (interactive) 
    (ansi-color-apply-on-region (point-min) (point-max))) 

Quindi è possibile eseguire display-ansi-colors via Mx, tramite una chiave vincolante di tua scelta, o attraverso qualche programmatica condizione (forse i tuoi file di registro hanno un'estensione o un nome che corrisponde ad alcune regexp)

Se si vuole fare questo con tamponi di sola lettura (i file di log, i risultati grep), è possibile utilizzare inhibit-read-only, quindi la funzione sarà: funzione definita

(defun display-ansi-colors() 
    (interactive) 
    (let ((inhibit-read-only t)) 
    (ansi-color-apply-on-region (point-min) (point-max)))) 
+0

È 'ansi-color' già incluso emacs 24+? – Avery

+1

@Avvero, sì. Inoltre, se qualcun altro si chiede come farlo, aggiungendo questo al tuo .emacs si attiva la visualizzazione ansi-colore per tutti i file '.log' (scegli la tua estensione di file in modo appropriato):' (add-to-list 'auto- mode-alist '("\\. log \\'". display-ansi-colors)) ' – Avery

+0

Sto provando questo per colorare i miei risultati ack (http://beyondgrep.com/). Il buffer dei risultati è di sola lettura e questa soluzione non funziona. – Gauthier

1

utente:

(defun my-ansi-color (&optional beg end) 
    "Interpret ANSI color esacape sequence by colorifying cotent. 
Operate on selected region on whole buffer." 
    (interactive 
    (if (use-region-p) 
     (list (region-beginning) (region-end)) 
    (list (point-min) (point-max)))) 
    (ansi-color-apply-on-region beg end)) 

per i buffer che utilizza il filtro COMINT/uso di compilazione:

(ignore-errors 
    (require 'ansi-color) 
    (defun my-colorize-compilation-buffer() 
    (when (eq major-mode 'compilation-mode) 
     (ansi-color-apply-on-region compilation-filter-start (point-max)))) 
    (add-hook 'compilation-filter-hook 'my-colorize-compilation-buffer)) 
3

soluzioni Juanleon di Gavenkoa e ha lavorato per me, ma non sono stati soddisfacenti in quanto stavano modificando il contenuto del file che stavo leggendo.

per colorare senza modificare il contenuto del file, scaricare tty-format.el e aggiungere il seguente ai vostri .emacs:

(add-to-list 'load-path "path/to/your/tty-format.el/") 

(require 'tty-format) 

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

;; decode ANSI color escape sequences for *.txt or README files                                      
(add-hook 'find-file-hooks 'tty-format-guess) 

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

tty-formato si basa su ANSI-color.El che viene fornito solo in modo nativo con i recenti versioni di emacs.

+0

Questo ha funzionato per me, tuttavia, un avvertimento: non tentare questo su file di grandi dimensioni! Ho appena provato con un file di log da 9 mega e ha bloccato emacs – adamc