Comment coloriser du texte dans emacs?

11

Je veux vue (et / ou modifier) le formatage du texte dans emacs, comme est sortie par ls -l --color=always, tree...ou autre chose.

Le texte auquel je fais référence existe dans un fichier. Lorsque j'ouvre ce fichier dans emacs, je veux pouvoir le voir colorisé ou le basculer pour afficher les séquences d'échappement ANSI (SGR).

ansi-color.el semble être ce dont j'ai besoin, mais je n'ai pas pu le faire coloriser les séquences d' échappement ANSi , mais je vois du bleu en gras pour les octets de contrôle individuels (par exemple. ^Aet ^[) ... Je ne suis pas bien sûr si c'est une caractéristique de ansi-color, mais je pense que oui.

Selon les commentaires ansi-color.el , cela peut fonctionner avec des chaînes et des régions, mais même cela ne semble pas fonctionner. Par exemple, la fonction ansi-color-apply-on-regionn'est pas reconnue par M-x. Il dit: "Pas de correspondance"

J'ai ajouté (require 'ansi-color)à mon fichier .emacs et même (add-hook 'shell-mode-hook 'ansi-color-for-comint-mode-on). Je ne reçois aucune erreur ni aucun avertissement lorsque emacs démarre, donc je suis bloqué.

Comment puis-je faire fonctionner les fonctions standard et les appliquer automatiquement lors de l'ouverture d'un fichier dont le nom est suffixé .col?

Peter.O
la source

Réponses:

15

Je pense que la pièce qui vous manque est la interactiveforme. C'est ainsi qu'Emacs fait la distinction entre une fonction conçue pour être appelée par d'autres fonctions et une fonction conçue pour être appelée directement par l'utilisateur. Voir le noeud Emacs Lisp Intro

Maintenant, si vous lisez la définition de ansi-color-apply-on-region, vous verrez qu'elle n'est pas conçue pour une utilisation interactive. "ansi-color" est conçu pour filtrer la sortie comint. Cependant, il est facile de créer un wrapper interactif pour cela.

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

Le bit suivant est que vous souhaitez activer les couleurs ansi pour l'extension .col. Vous pouvez ajouter une fonction de raccordement au mode principal que vous souhaitez utiliser pour modifier ces fichiers. La fonction sera exécutée chaque fois que vous activez le mode principal, vous devrez donc ajouter une vérification du suffixe de fichier approprié.

Alternativement, vous pouvez pirater un mode dérivé rapide basé sur le mode "fondamental".

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

et l'associer à cette extension.

(setq auto-mode-alist
      (cons '("\\.col\\'" . fundamental-ansi-mode) auto-mode-alist))
event_jr
la source
Fantastique .. comme par magie! Bien expliqué, et votre lien interactif Créer une fonction a beaucoup aidé. Je commence à voir la structure générale d'Emacs. Merci ...
Peter.O
Je me demande ce que je fais mal. J'ai ajouté tout le texte que vous avez ci-dessus dans mon fichier .emacs mais le texte que je surligne ne semble pas se colorer après avoir appelé ansi-color-apply-on-region-int.
SFbay007
5

La solution suivante permet de lire (et non d'enregistrer) des fichiers contenant des séquences de couleurs ANSI. Les noms de fichiers doivent avoir une .txtextension.

Mettez la bibliothèque TTY format dans ~/.emacs.d/site-lisp/, puis ajoutez ces lignes à votre ~/.emacsfichier init.

(add-to-list 'load-path "~/.emacs.d/site-lisp/")              
(require 'tty-format)
(add-hook 'find-file-hooks 'tty-format-guess)
enzotib
la source
C'est aussi une option utile. Il utilise ansi-coloret va un peu plus loin, comme le dit votre lien, "... Le but de tty-format.el est simplement de rendre * ces fichiers visibles." * .. " ces fichiers " étant ceux contenant un échappement ANSI SGR séquences et backspacing .. Merci ..
Peter.O
1
Pour ce que ça vaut .. Cette méthode par rapport à la version entièrement modifiable publiée par event_jr a une vitesse de pagination continue plus rapide (~ 25%) avec une fréquence de rafraîchissement significativement meilleure (bien! Meilleure) .. Le fichier de test avait 45 000 lignes. Pour la version modifiable, le rafraîchissement de l'écran s'arrête à environ 75% du chemin dans le fichier, mais la barre de défilement défilait toujours. Je soupçonne que cela est dû à une surcharge d'un tampon de point / marque d'annulation dans la version modifiable. .. Les deux méthodes ont leurs avantages ... (par "continu" , je veux dire maintenir la touche Page Haut / Bas appuyée en continu)
Peter.O
Pages au format PS .. tty aussi facilement et aussi rapidement que le fait le moins dans le terminal (les temps étaient à une seconde ou deux les uns des autres; à environ 50 secondes du haut en bas et du bas en haut).
Peter.O
Je n'étais pas au courant tty-format. Il semble être supérieur à ma fonction wrapper ou au mode dérivé à 3 lignes. :) Emacs a du mal à gérer beaucoup de superpositions, c'est ainsi qu'ansi-color fait la colorisation. Il y a une possibilité d'optimisation supplémentaire ici, car nous n'avons pas besoin de coloriser tout le tampon, juste la partie affichée.
event_jr
0

Merci beaucoup @enzotib pour votre solution!

Tout comme un ajout à votre solution, voici un moyen de la rendre explicitement appelable par l'utilisateur:

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

et automatique pour les fichiers autres que * .txt ou README:

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

De cette façon, vous pouvez remplacer vos séquences d'échappement par des couleurs sans altérer le fichier d'origine, contrairement aux solutions utilisant ansi-color-apply-on-region.

deb0ch
la source