Emacs에서 텍스트에 색상을 지정하는 방법은 무엇입니까?

Emacs에서 텍스트에 색상을 지정하는 방법은 무엇입니까?

예 를 들어 Emacs에서 컬러 텍스트를 보거나 편집하고 싶습니다 ls -l --color=always.tree...

제가 인용한 텍스트가 파일에 존재합니다. Emacs에서 파일을 열 때 색상을 보거나 ANSI(SGR) 이스케이프 시퀀스를 표시하도록 전환하고 싶습니다.

ansi-color.el ~인 것 같다필요한 작업을 수행하려고 하는데 ANSI 이스케이프에 대한 색상을 지정하도록 할 수 없습니다.순서, 하지만 개인에게는 파란색 굵은 글꼴이 표시됩니다.제어 바이트(예: ^A^[)...이것이 의 기능인지는 모르겠지만 ansi-color그런 것 같습니다.

~에 따르면ansi-color.el 댓글, 문자열 및 영역에서 작동하지만 그것조차도 작동하지 않는 것 같습니다. 예를 들어, 기능이 ansi-color-apply-on-region인식되지 않습니다 M-x. "일치하지 않음"이라고 표시됩니다.

(require 'ansi-color)내 항목에 추가했습니다..emacs파일이 (add-hook 'shell-mode-hook 'ansi-color-for-comint-mode-on).emacs를 시작하더라도 오류나 경고가 표시되지 않아 멈춰 있습니다.

표준 기능을 작동시키고 이름이 로 끝나는 파일을 열 때 자동으로 적용되도록 하려면 어떻게 해야 합니까 .col?

답변1

내 생각에 당신이 놓친 것은 form 입니다 interactive. 이것이 Emacs가 다른 함수에 의해 호출되도록 설계된 함수와 사용자가 직접 호출하도록 설계된 함수를 구별하는 방법입니다. Emacs Lisp 소개를 참조하세요.마디

이제 정의를 읽어보면 ansi-color-apply-on-region대화형 사용을 위해 설계되지 않았음을 알 수 있습니다. "ansi-color"는 comint 출력을 필터링하도록 설계되었습니다. 그러나 대화형 래퍼를 만드는 것은 쉽습니다.

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

다음 단계는 .col 확장자에 대해 ANSI 색상을 켜는 것입니다. 이러한 파일을 편집하는 데 사용하려는 기본 모드에 후크 기능을 추가할 수 있습니다. 이 기능은 메인 모드를 열 때마다 실행되므로 올바른 파일 접미사에 대한 확인을 추가해야 합니다.

또는 "기본" 모드를 기반으로 빠른 파생 모드를 해킹할 수 있습니다.

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

해당 확장명과 연결하세요.

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

답변2

다음 솔루션을 사용하면 ANSI 색상 시퀀스가 ​​포함된 파일을 읽을 수 있지만 저장할 수는 없습니다. 파일 이름에는 .txt확장자가 있어야 합니다.

도서관을 놔두다tty 형식~/.emacs.d/site-lisp/init 파일 에 다음 행을 추가 하십시오 ~/.emacs.

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

답변3

솔루션을 제공해 주신 @enzotib에게 큰 감사를 드립니다!

솔루션을 보완하기 위해 사용자가 명시적으로 호출할 수 있도록 하는 방법은 다음과 같습니다.

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

*.txt 또는 README 이외의 파일의 경우 자동으로 실행됩니다.

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

이렇게 하면 를 사용하는 것과 달리 원본 파일을 변경하지 않고 이스케이프 시퀀스를 색상으로 바꿀 수 있습니다 ansi-color-apply-on-region.

관련 정보