Emacs'ta metin nasıl renklendirilir?


11

İstediğim çıktı gereğidir gibi görünüm (ve / veya düzenleme) emacs'dan renklendirilen metne ls -l --color=always, tree...ya neyse.

Bahsettiğim metin bir dosyada var. Bu dosyayı emacs'ta açtığımda, renklendirildiğini görmek veya ANSI (SGR) kaçış dizilerini göstermesi için değiştirmek istiyorum.

ansi-color.el İhtiyacım olan şey gibi görünüyor , ancak ANSi kaçış dizilerinin renklendirilmesini yapamadım , ancak bireysel kontrol baytları için mavi kalın görüyorum (ör. ^Ave ^[) ... bunun bir özelliği olup olmadığından eminim ansi-color, ama bence öyle.

Göre ansi-color.el yorumlarla , bu dizeleri ve bölgeler ile çalışabilir, ama bu bile fonksiyon Örneğin .. işin görünmüyor ansi-color-apply-on-regiontarafından tanınmayan M-x. "Eşleşme yok" yazıyor

Ben ekledik (require 'ansi-color)benim için .emacs dosyası ve hatta (add-hook 'shell-mode-hook 'ansi-color-for-comint-mode-on). Emacs başladığında hata veya uyarı almıyorum, bu yüzden sıkıştım.

Standart işlevlerin çalışmasını nasıl sağlayabilirim ve adı eklenmiş bir dosyayı açarken otomatik olarak başvurulabilir .colmi?

Yanıtlar:


15

Sanırım eksik olduğun parça interactiveform. Emacs, diğer işlevler tarafından çağrılmak üzere tasarlanmış bir işlev ile doğrudan kullanıcı tarafından çağrılmak üzere tasarlanmış bir işlev arasında bu şekilde ayrım yapar. Emacs Lisp Giriş düğümüne bakın

Şimdi, tanımını okursanız, ansi-color-apply-on-regionetkileşimli kullanım için tasarlanmadığını göreceksiniz. "ansi-color" comint çıktısını filtrelemek için tasarlanmıştır. Ancak bunun için interaktif bir ambalaj yapmak kolaydır.

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

Bir sonraki bit .col uzantısı için ansi renklerini açmak istiyorsunuz. Bu dosyaları düzenlemek için kullanmak istediğiniz ana moda bir kanca işlevi ekleyebilirsiniz. Büyük modu her açtığınızda işlev çalıştırılır, bu nedenle uygun dosya soneki için bir kontrol eklemeniz gerekir.

Alternatif olarak, "temel" moda dayalı hızlı türetilmiş bir modu hackleyebilirsiniz.

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

ve bu uzantıyla ilişkilendirin.

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

Fantastik .. sihir gibi! İyi açıklanmıştır ve Bir Etkileşimli Etkileşim Oluşturun bağlantınız çok yardımcı oldu. Ben değilim başlayan Emacs genel yapısını görmek için. Teşekkürler ...
Peter.O

Ne yaptığımı merak ediyorum. Yukarıdaki tüm metinleri .emacs dosyama ekledim, ancak vurguladığım metin ansi-renk-uygula-bölge-int çağrıldıktan sonra renklenmiyor gibi görünüyor.
SFbay007

5

Aşağıdaki çözüm, ANSI renk dizileri içeren dosyaların okunmasına (ve kaydedilmemesine) izin verir. Dosya adlarının bir .txtuzantısı olmalıdır .

Kütüphane koy tty-biçimi içinde ~/.emacs.d/site-lisp/senin şu satırları ekleyin, sonra ~/.emacsinit dosyası.

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

Bu da kullanışlı bir seçenektir. Bu kullanır ansi-color, ve bağlantı söylediği gibi, bir adım ileri sürer "tty-format.el amacı sadece * tür dosyaları yapmaktır ... Görülebilir. '* ..' tür dosyalar " içerenler olmak ANSI SGR kaçış dizileri ve backspacing .. Teşekkürler ..
Peter.O

1
Değeri için .. Bu yöntem vs event_jr tarafından yayınlanan tamamen düzenlenebilir versiyonu vs daha iyi (çok! Daha iyi) yenileme sıklığı ile daha hızlı (~% 25) sürekli çağrı hızı vardır .. Test dosyası 45.000 satır vardı. Düzenlenebilir sürüm için, ekran yenileme dosya üzerinden yolun yaklaşık% 75 durdurmak için zemin, ancak kaydırma çubuğu hala kaydırma .. Bunun nedeni düzenlenebilir sürümünde bir nokta / mark geri alma arabellek bazı yükü nedeniyle şüpheleniyorum. .. Her iki yöntemin de avantajları vardır ... ( "sürekli" ile , Sayfa Yukarı / Aşağı tuşunun sürekli basılı tutulması anlamına gelir)
Peter.O

PS .. Tty format düzgün ve daha hızlı olarak sayfalar az yapar terminali (kez saniye veya birbirinden iki içinde idi; approx. En botton ve alt-üst 50 saniye).
Peter.O

Farkında değildim tty-format. Sarıcı fonksiyonumdan veya 3 satırdan türetilmiş moddan daha üstün görünüyor. :) Emacs, birçok bindirmeyle uğraşmakta zorlanıyor, bu yüzden ansi-color renklendirme yapıyor. Burada daha fazla optimizasyon için fırsat var, çünkü tüm tamponu renklendirmemize gerek yok, sadece görüntülenen kısım.
event_jr

0

@Enzotib çözümünüz için çok teşekkür ederim!

Çözümünüze ek olarak, bunu kullanıcı tarafından açıkça çağrılabilir hale getirmenin bir yolu:

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

ve yalnızca * .txt veya README dışındaki dosyalar için otomatik:

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

Bu şekilde, kullanılan çözümlerin aksine, orijinal dizini değiştirmeden kaçış dizilerinizi renklerle değiştirebilirsiniz ansi-color-apply-on-region.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.