¿Cómo colorear el texto en emacs?


11

Quiero vista (y / o modificar) el texto coloreada en emacs, como es la producción en ls -l --color=always, tree...o lo que sea.

El texto al que me refiero existe en un archivo. Cuando abro ese archivo 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 negrita azul para los bytes de control individuales (por ejemplo, ^Ay ^[) ... no estoy Seguro si esa es una característica de ansi-color, pero creo que lo es.

Según los comentarios de ansi-color.el , puede funcionar con cadenas y regiones, pero incluso eso no parece funcionar. Por ejemplo, la función ansi-color-apply-on-regionno es reconocida por M-x. Dice: "No coincide"

He agregado (require 'ansi-color)a mi archivo .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, así que estoy atascado.

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

Respuestas:


15

Creo que la pieza que te falta es la interactiveforma. Es cómo Emacs distingue entre una función diseñada para ser llamada por otras funciones, y una función diseñada para ser llamada directamente por el usuario. Vea el nodo de introducción de 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 impresión. Sin embargo, es fácil hacer un contenedor interactivo para ello.

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

El siguiente bit es que desea activar los colores ansi para la extensión .col. Puede agregar una función de enlace al modo mayor que quiera usar para editar esos archivos. La función se ejecutará cada vez que active el modo mayor, por lo que deberá agregar una comprobación para el sufijo de archivo 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))

Fantástico ... como por arte de magia! Bien explicado, y su enlace interactivo Hacer una función ayudó mucho. Estoy empezando a ver la estructura general de Emacs. Gracias ...
Peter.O

Me pregunto qué estoy haciendo mal. Agregué todo el texto que tiene arriba en mi archivo .emacs pero el texto que resalto no parece colorearse después de invocar ansi-color-apply-on-region-int.
SFbay007

5

La siguiente solución permite leer (y no guardar) archivos que contienen secuencias de color ANSI. Los nombres de archivo deben tener una .txtextensión.

Ponga la biblioteca TTY-formato en ~/.emacs.d/site-lisp/, a continuación, añadir estas líneas a su ~/.emacsarchivo de inicio.

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

Esta es una opción útil también. Utiliza ansi-colory va un paso más allá para, como dice su enlace, "... El objetivo de tty-format.el es simplemente hacer que * tales archivos sean visibles". ".." tales archivos "son aquellos que contienen ANSI SGR escape secuencias y retroceso .. Gracias ..
Peter.O

1
Para lo que vale ... Este método frente a la versión totalmente editable publicada por event_jr tiene una velocidad de paginación continua más rápida (~ 25%) con una frecuencia de actualización significativamente mejor (¡mucho! Mejor) ... El archivo de prueba tenía 45,000 líneas. Para la versión editable, la pantalla actualiza el terreno para detenerse en aproximadamente el 75% del camino a través del archivo, pero la barra de desplazamiento todavía se desplaza ... Sospecho que esto se debe a cierta sobrecarga de algún búfer de deshacer punto / marca en la versión editable. .. Ambos métodos tienen sus ventajas ... (por "continuo" , me refiero a mantener presionada la tecla Page Up / Down continuamente)
Peter.O

Las páginas de formato PS .. tty son tan fluidas y rápidas como menos en el terminal (los tiempos fueron dentro de un segundo o dos el uno del otro; aproximadamente 50 segundos desde arriba hacia abajo y desde abajo).
Peter.O

No estaba al tanto tty-format. Parece ser superior a mi función de contenedor o modo derivado de 3 líneas. :) Emacs tiene dificultades para lidiar con muchas superposiciones, que es cómo ansi-color realiza la coloración. Aquí hay una oportunidad para una mayor optimización, ya que no necesitamos colorear todo el búfer, solo la parte que se muestra.
event_jr

0

¡Muchas gracias @enzotib por tu solución!

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

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

y automático para archivos que no sean solo * .txt o README:

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

De esta manera, puede reemplazar sus secuencias de escape con colores sin alterar el archivo original, a diferencia de las soluciones que utiliza ansi-color-apply-on-region.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.