이맥스에서 텍스트를 색칠하는 방법?


11

내가 원하는 출력입니다 같은보기 (및 / 또는 편집) 이맥스에서 색상 화 텍스트로 ls -l --color=always, tree...또는 무엇 이건.

내가 참조하는 텍스트는 파일에 있습니다. 이맥스에서 파일을 열면 파일이 색상으로 표시되거나 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있습니까?

답변:


15

당신이 잃어버린 조각이 interactive형태 라고 생각합니다 . Emacs가 다른 함수에 의해 호출되도록 설계된 함수와 사용자가 직접 호출하도록 설계된 함수를 구별하는 방법입니다. Emacs Lisp Intro 노드를 참조하십시오

이제의 정의를 읽으면 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))

환상적인 .. 마치 마술처럼! 잘 설명했고, 대화 형 기능 만들기 링크가 많은 도움이되었습니다. 나는 이맥스의 일반적인 구조를보기 시작 했습니다. 감사합니다 ...
Peter.O

내가 뭘 잘못하고 있는지 궁금해. 위의 모든 텍스트를 .emacs 파일에 추가했지만 ansi-color-apply-on-region-int를 호출 한 후 강조 표시 된 텍스트가 색칠되지 않는 것 같습니다.
SFbay007

5

다음 솔루션을 사용하면 ANSI 색상 시퀀스가 ​​포함 된 파일을 읽고 저장할 수 있습니다. 파일 이름은 .txt확장자 를 가져야합니다 .

라이브러리 넣어 청각 장애 포맷 의를 ~/.emacs.d/site-lisp/당신에이 줄을 추가 한 후, ~/.emacsinit 파일.

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

이것은 유용한 옵션이기도합니다. 그것은 사용 ansi-color하고 링크가 말한대로, 한 단계 더 걸립니다 "TTY - format.el의 목적은 단지 * 같은 파일을 만드는 것입니다 ... 조회 가능한."* ... " 와 같은 파일 "를 포함하는 것을 ANSI SGR 탈출 시퀀스 및 백
스페이싱

1
value_value .. event_jr 에 의해 게시 된이 방법과 완전히 편집 가능한 버전의 비교 방법 은 새로 고침 빈도가 훨씬 높고 (약 25 %) 연속 페이징 속도 가 빠릅니다 . 테스트 파일에는 45,000 줄이 있습니다. 편집 가능한 버전의 경우 화면 새로 고침 그라운드가 파일을 통과하는 도중의 약 75 %에서 정지했지만 스크롤 막대는 여전히 스크롤되고있었습니다. 편집 가능한 버전에서 일부 포인트 / 마크 실행 취소 버퍼의 오버 헤드 때문인 것으로 생각됩니다. .. 두 방법 모두 장점이 있습니다 ... ( "연속"으로 , Page Up / Down 키를 계속 누르고 있음을 의미합니다)
Peter.O

PS는 .. TTY 포맷 원활하고 빠르게 한 페이지 이하 않는 단말기 (시간은 두 번째 또는 두 서로 내에 하였다. 약 botton을 상단 및 하단에서 상단 50초).
Peter.O

나는 몰랐다 tty-format. 래퍼 함수 또는 3 줄 파생 모드보다 우수합니다. :) 이맥스는 많은 오버레이를 다루는데 어려움을 겪습니다. 전체 버퍼를 채색 할 필요가없고 일부만 표시되므로 여기에서 추가로 최적화 할 수 있습니다.
event_jr

0

귀하의 솔루션에 대해 너무 많은 @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.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.