Cómo colorear text en emacs?

Quiero ver (y / o editar) text coloreado en emacs, como lo muestra ls -l --color=always , tree... , o lo que sea.

El text al que me refiero existe en un file. Cuando abro ese file en emacs, quiero poder verlo coloreado, o alternarlo para mostrar secuencias de escape ANSI (SGR).

ansi-color.el parece ser lo que necesito, pero no he podido hacer que coloree las secuencias de escape ANSi, pero veo azul-negrita para bytes de contol individuales (por ejemplo, ^A y ^[ ) … No estoy seguro de si esa es una característica del ansi-color , pero creo que sí.

De acuerdo con los comentarios de ansi-color.el , puede funcionar con cadenas y regiones, pero incluso eso no parece funcionar. Por ejemplo, la function ansi-color-apply-on-region no es reconocida por Mx . Dice: "No hay coincidencia"

He agregado (require 'ansi-color) a mi file .emacs e incluso (add-hook 'shell-mode-hook 'ansi-color-for-comint-mode-on) . No recibo ningún error o advertencia cuando se inicia emacs, por lo que estoy atascado.

¿Cómo puedo hacer que funcionen las funciones estándar y puedo aplicarlas automáticamente al abrir un file cuyo nombre tiene el sufijo .col ?

Creo que la pieza que te falta es la forma interactive . Es la forma en que Emacs distingue entre una function diseñada para ser llamada por otras funciones y una function diseñada para ser llamada directamente por el usuario. Ver el nodo de introducción Emacs Lisp

Ahora, si lee la definición de ansi-color-apply-on-region , verá que no está diseñada para uso interactivo. "ansi-color" está diseñado para filtrar la salida de comint. Sin embargo, es fácil crear un contenedor interactivo para él.

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

El siguiente paso es que desee activar los colors ansi para la extensión .col. Puede agregar una function de enlace al modo principal que desee usar para editar esos files. La function se ejecutará cada vez que encienda el modo principal, por lo que tendrá que agregar un cheque para el sufijo de file adecuado.

Alternativamente, puede hackear un modo derivado rápido basado en el modo "fundamental".

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

y asociarlo con esa extensión.

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

La siguiente solución permite leer (y no save) files que contienen secuencias de color ANSI. Los nombres de files deben tener una extensión .txt .

Coloque el formatting tty de la biblioteca en ~/.emacs.d/site-lisp/ , luego agregue estas líneas a su file de inicio ~/.emacs .

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

¡Muchas gracias @enzotib por su solución!

Solo como una adición a su solución, aquí hay una manera de hacerlo explícitamente exigible por el usuario:

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

y automático para files que no sean simplemente * .txt o README:

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

De esta forma puede replace sus secuencias de escape con colors sin alterar el file original, a diferencia de las soluciones que usan ansi-color-apply-on-region .