Como colorir o texto no emacs?

9

Eu quero ver (e / ou editar) o texto colorido no emacs, como é o resultado de ls -l --color=always , tree... ou o que for.

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

ansi-color.el parece ser o que eu preciso, mas eu não consegui fazer qualquer colorização do ANSi seqüências , mas eu faço veja azul-negrito para contol bytes individuais (por exemplo, ^A e ^[ ) ... Não tenho certeza se esse é um recurso do ansi-color , mas acho que é.

De acordo com os comentários do ansi-color.el , ele pode trabalhar com strings e regiões, mas mesmo que não pareça funcionar .. Por exemplo, a função ansi-color-apply-on-region não é reconhecida por M-x . Diz "sem correspondência"

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

Como posso fazer com que as funções padrão funcionem, e elas podem ser aplicadas automaticamente ao abrir um arquivo cujo nome é sufixado com .col ?

    
por Peter.O 26.08.2011 / 16:19

3 respostas

14

Acho que a parte que está faltando é a forma interactive . É como 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 nó nó do Emacs Lisp

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" é projetado para filtrar a saída 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))

A próxima parte é que você deseja ativar as cores ansi para a extensão .col. Você pode adicionar uma função de gancho ao modo principal que deseja usar para editar esses arquivos. A função será executada sempre que você ligar o modo principal, então você terá que adicionar uma verificação para o sufixo de arquivo apropriado.

Alternativamente, você pode hackear um modo derivado rápido baseado 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 associá-lo a essa extensão.

(setq auto-mode-alist
      (cons '("\.col\'" . fundamental-ansi-mode) auto-mode-alist))
    
por 26.08.2011 / 18:51
5

A seguinte solução permite ler (e não salvar) arquivos contendo seqüências de cores ANSI. Os nomes dos arquivos devem ter uma extensão .txt .

Coloque a biblioteca tty-format em ~/.emacs.d/site-lisp/ e adicione essas linhas ao seu ~/.emacs arquivo init.

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

Muito obrigado @enzotib pela sua solução!

Assim como um complemento à sua solução, aqui está uma maneira de torná-lo 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, ao contrário das soluções que usam ansi-color-apply-on-region .

    
por 12.05.2016 / 19:15

Tags