Como colorir texto no emacs?

11

Quero vista (e / ou editar) texto a cores em emacs, como é a produção em ls -l --color=always, tree...ou o que quer.

O texto a que me refiro existe em um arquivo. Quando abro esse arquivo no emacs, desejo poder vê-lo colorido ou alterná-lo para mostrar as seqüências de escape ANSI (SGR).

ansi-color.el parece ser o que eu preciso, mas não consegui fazer nenhuma coloração das seqüências de escape ANSi , mas vejo azul-negrito para bytes de controle individuais (por exemplo, ^Ae ^[) ... não estou claro se isso é um recurso ansi-color, mas acho que é.

De acordo com os comentários da ansi-color.el , ele pode funcionar com strings e regiões, mas mesmo isso não parece funcionar. Por exemplo, a função ansi-color-apply-on-regionnão é reconhecida por M-x. Diz: "Sem correspondência"

Eu adicionei (require 'ansi-color)ao meu arquivo .emacs e até mesmo (add-hook 'shell-mode-hook 'ansi-color-for-comint-mode-on). Não recebo nenhum erro ou aviso quando o emacs inicia, por isso estou preso.

Como faço para que as funções padrão funcionem e elas podem ser aplicadas automaticamente ao abrir um arquivo cujo nome está com sufixo .col?

Peter.O
fonte

Respostas:

15

Eu acho que a peça que está faltando é a interactiveforma. É assim que o Emacs distingue entre uma função projetada para ser chamada por outras funções e uma função projetada para ser chamada diretamente pelo usuário. Veja o Emacs Lisp Intro

Agora, se você ler a definição de ansi-color-apply-on-region, verá que ela não foi projetada para uso interativo. "ansi-color" foi projetado para filtrar a saída de comint. No entanto, é fácil criar um wrapper interativo para ele.

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

O próximo passo é que você deseja ativar as cores ansi para a extensão .col. Você pode adicionar uma função de gancho ao modo principal que você deseja usar para editar esses arquivos. A função seria executada sempre que você ativar o modo principal, portanto, será necessário adicionar uma verificação do sufixo do arquivo apropriado.

Como alternativa, você pode hackear um modo derivado rápido com base no 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)))

e associe-o a essa extensão.

(setq auto-mode-alist
      (cons '("\\.col\\'" . fundamental-ansi-mode) auto-mode-alist))
event_jr
fonte
Fantástico .. como se por mágica! Bem explicado, e seu link Tornar uma função interativa ajudou muito. Estou começando a ver a estrutura geral do Emacs. Obrigado ...
Peter.O
Eu me pergunto o que estou fazendo de errado. Adicionei todo o texto que você tem acima no meu arquivo .emacs, mas o texto destacado parece não ficar colorido depois de chamar ansi-color-apply-on-region-int.
SFbay007
5

A solução a seguir permite ler (e não salvar) arquivos contendo seqüências de cores ANSI. Os nomes de arquivos devem ter uma .txtextensão.

Coloque a biblioteca no formato tty~/.emacs.d/site-lisp/ e adicione essas linhas ao seu ~/.emacsarquivo init.

(add-to-list 'load-path "~/.emacs.d/site-lisp/")              
(require 'tty-format)
(add-hook 'find-file-hooks 'tty-format-guess)
enzotib
fonte
Esta é uma opção útil também. Ele utiliza ansi-colore leva um passo adiante para, como o seu link diz, "... O objetivo do tty-format.el é apenas tornar * esses arquivos visíveis." * .. " esses arquivos " são aqueles que contêm escape ANSI SGR seqüências e backspacing .. Obrigado ..
Peter.O
1
Pelo que vale a pena .. Esse método versus a versão totalmente editável, postada por event_jr, tem uma velocidade de paginação contínua mais rápida (~ 25%) com uma frequência de atualização significativamente melhor (muito! Melhor) .. O arquivo de teste tinha 45.000 linhas. Para a versão editável, a atualização da tela é interrompida em cerca de 75% do arquivo, mas a barra de rolagem ainda está rolando. Suspeito que isso ocorra devido a alguma sobrecarga de algum ponto / marca de desfazer o buffer na versão editável. .. Ambos os métodos têm suas vantagens ... (por "contínuo" , quero dizer mantendo a tecla Page Up / Down pressionado continuamente)
Peter.O
PS .. tty-formato páginas como suavemente e tão rápido quanto menos faz no terminal (os tempos estavam dentro de um ou dois segundos de cada outro; aprox. 50 segundos a partir de cima para botton, e na parte inferior-top).
precisa saber é o seguinte
Eu não estava ciente tty-format. Parece ser superior à minha função de invólucro ou ao modo derivado de 3 linhas. :) O Emacs tem dificuldade em lidar com muitas sobreposições, e é assim que a cor das cores é a ansi-color. Há oportunidades para otimização adicional aqui, porque não precisamos colorir todo o buffer, apenas a parte que está sendo exibida.
event_jr
0

Muito obrigado @enzotib pela sua solução!

Como complemento à sua solução, aqui está uma maneira de torná-la explicitamente solicitável pelo usuário:

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

e automático para arquivos que não sejam apenas * .txt ou README:

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

Dessa forma, você pode substituir suas seqüências de escape por cores sem alterar o arquivo original, diferentemente das soluções utilizadas ansi-color-apply-on-region.

deb0ch
fonte