Bagaimana cara mewarnai teks dalam emacs?


11

Saya ingin melihat (dan / atau mengedit) teks berwarna di emacs, seperti output dengan ls -l --color=always, tree..., atau apa pun.

Teks yang saya rujuk ada dalam file. Ketika saya membuka file itu di emacs, saya ingin dapat melihatnya berwarna, atau beralih untuk menunjukkan urutan pelarian ANSI (SGR).

ansi-color.el tampaknya menjadi apa yang saya butuhkan, tapi saya belum bisa membuatnya untuk mewarnai pewarnaan dari urutan pelarian ANSi , tapi saya melihat huruf tebal biru untuk masing-masing byte byte (mis. ^Adan ^[) ... Saya tidak yakin apakah itu fitur ansi-color, tapi saya pikir itu.

Menurut komentar ansi-color.el , ini dapat bekerja dengan string dan wilayah, tetapi bahkan itu tampaknya tidak berfungsi .. Misalnya fungsi ansi-color-apply-on-regiontidak dikenali oleh M-x. Dikatakan, "Tidak cocok"

Saya telah menambahkan file .emacs(require 'ansi-color) saya dan bahkan . Saya tidak mendapatkan kesalahan atau peringatan saat emacs dimulai, jadi saya mandek. (add-hook 'shell-mode-hook 'ansi-color-for-comint-mode-on)

Bagaimana saya bisa mendapatkan fungsi standar untuk bekerja, dan dapatkah itu dibuat untuk diterapkan secara otomatis ketika membuka file yang namanya berakhiran .col?

Jawaban:


15

Saya pikir potongan yang Anda lewatkan adalah interactiveformulir. Begitulah cara Emacs membedakan antara fungsi yang dirancang untuk dipanggil oleh fungsi lain, dan fungsi yang dirancang untuk dipanggil langsung oleh pengguna. Lihat simpul Intro Emacs Lisp

Sekarang jika Anda membaca definisi ansi-color-apply-on-region, Anda akan melihat bahwa itu tidak dirancang untuk penggunaan interaktif. "ansi-color" dirancang untuk memfilter keluaran comint. Namun mudah untuk membuat pembungkus interaktif untuk itu.

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

Bit selanjutnya adalah Anda ingin mengaktifkan warna ansi untuk ekstensi .col. Anda dapat menambahkan fungsi kait ke mode utama apa pun yang ingin Anda gunakan untuk mengedit file-file itu. Fungsi ini akan dijalankan setiap kali Anda mengaktifkan mode-utama, jadi Anda harus menambahkan tanda centang untuk akhiran file yang tepat.

Atau Anda dapat meretas mode turunan cepat berdasarkan mode "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)))

dan kaitkan dengan ekstensi itu.

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

Fantastis .. seperti sulap! Dijelaskan dengan baik, dan tautan Make a Function Interactive Anda banyak membantu. Saya mulai melihat struktur umum Emacs. Terima kasih ...
Peter.O

Saya bertanya-tanya apa yang saya lakukan salah. Saya menambahkan semua teks yang Anda miliki di atas dalam file .emacs saya tetapi teks yang saya sorot tampaknya tidak berwarna setelah memohon ansi-color-apply-on-region-int.
SFbay007

5

Solusi berikut memungkinkan untuk membaca (dan tidak menyimpan) file yang mengandung urutan warna ANSI. Nama file harus memiliki .txtekstensi.

Masukan perpustakaan tty format di ~/.emacs.d/site-lisp/, kemudian tambahkan baris ini ke Anda ~/.emacsinit file.

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

Ini juga merupakan opsi yang bermanfaat. Ia memanfaatkan ansi-colordan membawanya selangkah lebih maju ke, sebagaimana tautan Anda mengatakan, "... Tujuan dari tty-format.el adalah hanya untuk membuat * file-file tersebut dapat dilihat." * .. " file-file semacam itu " adalah file-file yang mengandung pelarian ANSI SGR urutan dan backspacing .. Terima kasih ..
Peter.O

1
Untuk apa itu layak .. Metode ini vs versi sepenuhnya dapat diedit seperti yang diposting oleh event_jr memiliki lebih cepat (~ 25%) kecepatan halaman kontinu dengan frekuensi refresh yang secara signifikan lebih baik (jauh! Lebih baik) .. File uji memiliki 45.000 baris. Untuk versi yang dapat diedit penyegaran layar terhenti sekitar 75% dari jalan melalui file, tetapi bilah gulir masih bergulir. Saya menduga ini karena beberapa overhead dari beberapa titik / tanda batalkan penyangga dalam versi yang dapat diedit. .. Kedua metode memiliki kelebihan mereka ... (dengan "terus menerus" , maksud saya menjaga tombol Page Up / Down ditekan terus menerus)
Peter.O

PS .. tty format halaman semulus dan secepat kurang tidak dalam terminal (kali berada dalam dua satu sama lain kedua atau;. Kira-kira 50 detik dari atas-botton, dan bawah-atas).
Peter.O

Saya tidak menyadarinya tty-format. Tampaknya lebih unggul daripada fungsi pembungkus saya atau 3-mode turunan. :) Emacs kesulitan menangani banyak overlay, yaitu bagaimana ansi-color melakukan pewarnaan. Ada peluang untuk pengoptimalan lebih lanjut di sini, karena kita tidak perlu mewarnai seluruh buffer, hanya bagian yang ditampilkan.
event_jr

0

Terima kasih banyak @enzotib untuk solusi Anda!

Sama seperti tambahan untuk solusi Anda, berikut adalah cara untuk membuatnya secara eksplisit dapat dipanggil oleh pengguna:

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

dan otomatis untuk file selain hanya * .txt atau README:

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

Dengan cara ini Anda dapat mengganti urutan pelarian Anda dengan warna tanpa mengubah file asli, tidak seperti solusi yang digunakan ansi-color-apply-on-region.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.