Làm thế nào để tô màu văn bản trong emacs?


11

Tôi muốn xem (và / hoặc chỉnh sửa) văn bản colorized trong emacs, chẳng hạn như là đầu ra bằng cách ls -l --color=always, tree...hoặc bất cứ điều gì.

Văn bản tôi đề cập đến tồn tại trong một tập tin. Khi tôi mở tệp đó trong emacs, tôi muốn có thể thấy nó được tô màu hoặc chuyển đổi nó để hiển thị các chuỗi thoát ANSI (SGR).

ansi-color.el dường như là những gì tôi cần, nhưng tôi không thể làm cho nó thực hiện bất kỳ việc tô màu nào cho các chuỗi thoát ANSi , nhưng tôi thấy màu xanh đậm cho từng byte contol (ví dụ ^A^[) ... Tôi không chắc chắn nếu đó là một tính năng của ansi-color, nhưng tôi nghĩ rằng nó là.

Theo các nhận xét ansi-color.el , nó có thể hoạt động với các chuỗi và vùng, nhưng ngay cả điều đó dường như không hoạt động .. Ví dụ: chức năng ansi-color-apply-on-regionkhông được nhận ra bởi M-x. Nó nói, "Không khớp"

Tôi đã thêm vào tập tin .emacs(require 'ansi-color) của tôi và thậm chí . Tôi không nhận được lỗi hoặc cảnh báo khi emacs bắt đầu, vì vậy tôi bị mắc kẹt. (add-hook 'shell-mode-hook 'ansi-color-for-comint-mode-on)

Làm thế nào tôi có thể làm cho các chức năng tiêu chuẩn hoạt động, và nó có thể được thực hiện để tự động áp dụng khi mở một tệp có tên được gắn với .col?

Câu trả lời:


15

Tôi nghĩ rằng phần bạn đang thiếu là interactivehình thức. Đó là cách Emacs phân biệt giữa một chức năng được thiết kế để được gọi bởi các chức năng khác và chức năng được thiết kế để người dùng gọi trực tiếp. Xem nút Giới thiệu Emacs Lisp

Bây giờ nếu bạn đọc định nghĩa ansi-color-apply-on-region, bạn sẽ thấy rằng nó không được thiết kế để sử dụng tương tác. "Ansi-color" được thiết kế để lọc đầu ra comint. Tuy nhiên, thật dễ dàng để tạo một trình bao bọc tương tác cho nó.

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

Bit tiếp theo là bạn muốn bật màu ansi cho phần mở rộng .col. Bạn có thể thêm chức năng hook vào bất kỳ chế độ chính nào bạn muốn sử dụng để chỉnh sửa các tệp đó. Chức năng sẽ được chạy bất cứ khi nào bạn bật chế độ chính, vì vậy bạn sẽ phải thêm một kiểm tra cho hậu tố tập tin thích hợp.

Ngoài ra, bạn có thể hack chế độ dẫn xuất nhanh dựa trên chế độ "cơ bản".

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

và liên kết nó với phần mở rộng đó.

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

Tuyệt vời .. như thể bằng phép thuật! Giải thích rõ ràng và liên kết Make a Function Interactive của bạn đã giúp ích rất nhiều. Tôi bắt đầu thấy cấu trúc chung của Emacs. Cảm ơn ...
Peter.O

Tôi tự hỏi những gì tôi đang làm sai. Tôi đã thêm tất cả văn bản bạn có ở trên vào tệp .emacs của mình nhưng văn bản tôi đánh dấu dường như không được tô màu sau khi gọi ansi-color-application-on-area-int.
SFbay007

5

Giải pháp sau đây cho phép đọc (và không lưu) các tệp có chứa chuỗi màu ANSI. Tên tệp phải có .txtphần mở rộng.

Đặt định dạng tty của thư viện vào ~/.emacs.d/site-lisp/, sau đó thêm các dòng này vào ~/.emacstệp init của bạn .

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

Đây là một lựa chọn hữu ích quá. Nó sử dụng ansi-colorvà đưa nó thêm một bước nữa, như liên kết của bạn nói, "... Mục đích của tty-format.el chỉ là làm cho * các tệp đó có thể xem được." * .. " các tệp đó " là những tệp có chứa ANSI SGR trình tự và khoảng cách .. Cảm ơn ..
Peter.O

1
Để biết giá trị của nó .. Phương pháp này so với phiên bản có thể chỉnh sửa hoàn toàn như được đăng bởi event_jr có tốc độ phân trang liên tục nhanh hơn (~ 25%) với tần suất làm mới tốt hơn đáng kể (nhiều! Tốt hơn) .. Tệp thử nghiệm có 45.000 dòng. Đối với phiên bản có thể chỉnh sửa, mặt đất làm mới màn hình tạm dừng khoảng 75% trong suốt tệp, nhưng thanh cuộn vẫn đang cuộn .. Tôi nghi ngờ điều này là do một số chi phí đệm / điểm hoàn tác trong phiên bản có thể chỉnh sửa. .. Cả hai phương pháp đều có ưu điểm của chúng ... (bằng cách "liên tục" , ý tôi là nhấn phím Page Up / Down liên tục)
Peter.O

PS .. các trang định dạng tty mượt mà và nhanh như ít hơn trong thiết bị đầu cuối (thời gian chỉ trong một hoặc hai giây với nhau; khoảng 50 giây từ đầu trang và trên cùng).
Peter.O

Tôi đã không nhận thức được tty-format. Nó dường như vượt trội hơn chức năng trình bao bọc của tôi hoặc chế độ dẫn xuất 3 dòng. :) Emacs có một thời gian khó khăn để xử lý rất nhiều lớp phủ, đó là cách màu sắc ansi. Có cơ hội để tối ưu hóa hơn nữa ở đây, bởi vì chúng ta không cần tô màu toàn bộ bộ đệm, chỉ phần được hiển thị.
event_jr

0

Cảm ơn bạn rất nhiều @enzotib cho giải pháp của bạn!

Cũng giống như một bổ sung cho giải pháp của bạn, đây là một cách để người dùng có thể gọi nó một cách rõ ràng:

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

và tự động cho các tệp khác ngoài * .txt hoặc README:

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

Bằng cách này, bạn có thể thay thế các chuỗi thoát của mình bằng màu sắc mà không thay đổi tệp gốc, không giống như các giải pháp sử dụng ansi-color-apply-on-region.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.