วิธี colorize ข้อความใน emacs?


11

ฉันต้องการที่จะดู (และ / หรือแก้ไข) colorized ข้อความใน 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หรือไม่

คำตอบ:


15

ฉันคิดว่าชิ้นส่วนที่คุณขาดหายไปคือinteractiveแบบฟอร์ม มันเป็นวิธีที่ Emacs แยกความแตกต่างระหว่างฟังก์ชั่นที่ออกแบบให้เรียกใช้งานโดยฟังก์ชั่นอื่น ๆ และฟังก์ชั่นที่ออกแบบให้เรียกใช้โดยตรงจากผู้ใช้ ดูโหนด Emacs Lisp Intro

ตอนนี้ถ้าคุณอ่านคำจำกัดความของansi-color-apply-on-regionคุณจะเห็นว่ามันไม่ได้ออกแบบมาสำหรับการใช้งานแบบโต้ตอบ "ansi-color" ถูกออกแบบมาเพื่อกรองเอาต์พุต comint อย่างไรก็ตามมันเป็นเรื่องง่ายที่จะสร้าง wrapper เชิงโต้ตอบสำหรับมัน

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

บิตถัดไปคือคุณต้องการเปิดใช้สี ansi สำหรับส่วนขยาย. col คุณสามารถเพิ่มฟังก์ชั่น hook ให้กับโหมดหลักที่คุณต้องการใช้เพื่อแก้ไขไฟล์เหล่านั้น ฟังก์ชั่นจะทำงานเมื่อใดก็ตามที่คุณเปิดโหมดเมเจอร์ดังนั้นคุณจะต้องเพิ่มการตรวจสอบสำหรับคำต่อท้ายไฟล์ที่เหมาะสม

หรือคุณสามารถแฮ็คโหมดที่ได้รับอย่างรวดเร็วโดยใช้โหมด "พื้นฐาน"

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

ยอดเยี่ยม .. ราวกับมีเวทมนตร์! อธิบายได้ดีและลิงก์Make a Function Interactive ของคุณช่วยได้มาก ฉันเริ่มเห็นโครงสร้างทั่วไปของ Emacs ขอบคุณ ...
Peter.O

ฉันสงสัยว่าฉันทำอะไรผิด ฉันเพิ่มข้อความทั้งหมดที่คุณมีด้านบนในไฟล์. emacs ของฉัน แต่ข้อความที่ฉันไฮไลต์ดูเหมือนจะไม่ได้สีหลังจากเรียกใช้ ansi-color-Apply-on-region-int
SFbay007

5

โซลูชันต่อไปนี้อนุญาตให้อ่านไฟล์ (และไม่บันทึก) ที่มีลำดับสี ANSI ชื่อไฟล์จะต้องมี.txtนามสกุล

ใส่ห้องสมุดTTY รูปแบบใน~/.emacs.d/site-lisp/แล้วเพิ่มบรรทัดเหล่านี้ไปของคุณ~/.emacsไฟล์ init

(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 escape ลำดับและ backspacing .. ขอบคุณ ..
Peter.O

1
สำหรับสิ่งที่คุ้มค่า .. วิธีนี้เทียบกับเวอร์ชั่นที่แก้ไขได้อย่างเต็มที่ที่โพสต์โดยevent_jrมีความเร็วในการเพจจิ้งต่อเนื่องเร็วขึ้น (~ 25%) พร้อมกับความถี่รีเฟรชที่ดียิ่งขึ้น (มาก! ดีกว่า) .. สำหรับรุ่นที่สามารถแก้ไขได้พื้นรีเฟรชหน้าจอจะหยุดที่ประมาณ 75% ของวิธีการผ่านไฟล์ แต่แถบเลื่อนยังคงเลื่อน .. ฉันสงสัยว่านี่เป็นเพราะค่าใช้จ่ายบางส่วนของจุด / เครื่องหมายยกเลิกบัฟเฟอร์ในรุ่นที่แก้ไขได้ .. ทั้งสองวิธีมีข้อดีของพวกเขา ... (โดย"ต่อเนื่อง"ฉันหมายถึงการกดปุ่ม Page Up / Down ค้างไว้อย่างต่อเนื่อง)
Peter.O

PS .. TTY รูปแบบหน้าเป็นอย่างราบรื่นและรวดเร็วเป็นที่น้อยไม่ใน terminal (ครั้งภายในสองหรือสองของแต่ละอื่น ๆ . ประมาณ 50 วินาทีจากด้านบนกระดุมและด้านล่างสุด)
Peter.O

tty-formatผมก็ไม่ทราบ ดูเหมือนว่าจะเหนือกว่าฟังก์ชั่น wrapper ของฉันหรือ 3 โหมดที่ได้รับมา :) Emacs มีช่วงเวลาที่ยากลำบากในการจัดการกับการซ้อนทับจำนวนมากซึ่งเป็นวิธีที่สี ansi ทำสี มีโอกาสสำหรับการเพิ่มประสิทธิภาพเพิ่มเติมที่นี่เนื่องจากเราไม่จำเป็นต้อง colorize บัฟเฟอร์ทั้งหมดเพียงแค่ส่วนที่แสดง
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.