Tamponun bir bölgesini başka bir ana mod ile fondanlayın


12

Ansible modülleri için belgeleri gösteren bir arabelleğe sahibim. Bu arabellek, tüm standart şeyleri sağlayan kendi ana moduna sahiptir. Özellikle, satır içi işaretleme, seçenekler, bölümler, vb vurgulamak için arabelleği fondanlar. Sonuçta, oldukça benzer M-x man.

Dokümanların altında genellikle YAML'de bazı kod örnekleri vardır. Bunları da fontifleştirmek istiyorum. YAML için kendi font kilidi anahtar kelimelerimi ekleyebilirim, ancak YAML Modunun fontlaştırmasını tekrar kullanmayı tercih ederim.

Bunu nasıl yapabilirim? Özellikle, bir tamponun belirli bir bölgesini fondanlamak için farklı bir ana modu nasıl kullanabilirim?

YAML Modunun bu bölgede aktif olması gerekmediğini unutmayın . Tüm tampon sadece pasif bir gösterim tamponudur ve düzenlenmesi amaçlanmamıştır. Gerçekten sadece YAML Modu o bölgede aktifmiş gibi üretilen fontlaştırmaya ihtiyacım var.

Arabellek bölgesini geçici bir arabelleğe kopyalayabildiğimi, YAML Modunu etkinleştirebildiğimi, arabelleği fontive edebildiğimi ve tüm metin özelliklerini kopyalayabildiğimi varsayıyorum. Işe yarar mı? Öyleyse, metin özelliklerini nasıl kopyalarım ve kopyalanacak ilgili özellikler nelerdir? Yoksa daha iyi bir yaklaşım var mı?


Yaml olmayan yazı tipi nasıl uygulanır? Metin özelliklerini elle mi uyguluyorsunuz, yoksa yazı tipi kilidi modunu mu kullanıyorsunuz?
Malabarba

Bu yazıdaki bağlantılar, en az orada bulunan seçeneklerin en az bir kısmını özetliyor
grettke

Yanıtlar:


10

Son zamanlarda benzer bir sorunla karşılaştım, temelde başka bir kaynak aldığım belgelerdeki kod parçacıklarını fontifleştirmek istedim. Cevabınızın sonuna doğru belirtilen yaklaşımı izledim ve benim için iyi çalıştı. Aşağıdaki gibi bir şey ile sonuçlanan fonksiyon

(defun my-fontify-yaml (text)
  (with-temp-buffer
    (erase-buffer)
    (insert text)
    (delay-mode-hooks (yaml-mode))
    (font-lock-default-function 'yaml-mode)
    (font-lock-default-fontify-region (point-min)
                                      (point-max)
                                      nil)
    (buffer-string)))

@Malabarba'nın yorumlarda belirttiği gibi, hedef arabellek yazı tipi kilit modu kullanıyorsa yukarıdaki basit yaklaşım işe yaramaz. Ancak dize zaten yazı metin özelliğini ayarlayarak kilitli olduğunu düşünerek içine font-lock-mod tuzağa düşürebileceğini font-lock-faceiçin face, (biz olsun faceyukarıda işlevini kullandığınızda, mülkiyet seti) ve metin özelliğini ayarlayarak fontifiediçin t. Aşağıdaki işlev, yukarıdaki işlev tarafından döndürülen bir dizeyi alır ve dizenin fontified olarak girilmesi için gerekli işlemi yapar (bu, kuruluş modunun org-src-font-lock-fontify-blockişlevinden alınır)

(defun my-fontify-using-faces (text)
  (let ((pos 0))
    (while (setq next (next-single-property-change pos 'face text))
      (put-text-property pos next 'font-lock-face (get-text-property pos 'face text) text)
      (setq pos next))
    (add-text-properties 0  (length text) '(fontified t) text)
    text))

Şimdi aşağıdaki gibi kullanabilirsiniz

(insert (my-fontify-using-faces (my-fontify-yaml "application: test\nversion: 1")))

Bu, bulduğum çözümle aynı sx.el, ancak yalnızca hedef arabelleği yazı tipi-kilit modu kullanmadığında işe yarayacağını belirtmek önemlidir.
Malabarba

Sağ! Bunun benim için işe yaradığını fark ettim çünkü yazı tipi kilidinin kullanılmadığı tamponda kullandım (Yardım tamponu)
Iqbal Ansari

@Malabarba, yazı tipi kilit modu etkinken hedef arabelleklerle bu işi yapmanın bir yolunu buldu
Iqbal Ansari

Çok teşekkürler, mükemmel çalışıyor !
lunaryorn

Oh iyi! Sevindim yardımcı olabilirim :)
Iqbal Ansari

3

Kütüphane Dar Dolaylı ( narrow-indirect) burada yardımcı olabilir - başlık yorumuna bir göz atın. Aşağıdakilere dayanır:

  1. bir arabellek üzerindeki düzenlemeyi sınırlayan daralma ve
  2. ana modu değiştirebileceğiniz başka bir arabellek kopyalayan dolaylı arabellekler.

Başlangıçta düşmanca kabul edildiği için daralmanın varsayılan olarak devre dışı bırakıldığını unutmayın (varsayılan bağlama C-x n n). İnit dosyanıza aşağıdakileri koyarak etkinleştirebilirsiniz:

(put 'narrow-to-region 'disabled nil)

Ayrıca benim el yapımı myfn-narrow-indirectbenim conf içinde bakabilirsiniz .


Daraltma aslında yazı tipi kilidini etkiler mi, yani daraltılmış bölgenin dışından uzak tutuyor mu? Yazı tipi kilidi arabellek kısıtlamalarını hiçbir zaman gerçekten kaldırmaz mı?
lunaryorn

Her neyse, bir wiki paketi bir seçenek değil.
lunaryorn

Ayrıca disabledEmacs Lisp'den çağırmak için özelliği komuttan kaldırmanız gerekmez . Yalnızca etkileşimli kullanımı etkiler.
lunaryorn

0

Kuruluş modu kaynak blokları için bu işlevselliği sağlayan org-src-font-lock-fontify-block'a bakmanızı öneririm. İlgili parçaları başka bir arabelleğe kopyalamak, ana modu etkinleştirmek ve daha sonra fontifize edilmiş metni geri kopyalamak gibi görünüyor. Hackish, ama işe yarıyor gibi görünüyor.


2
Bu cevap, problemle başa çıkmak için önerilen bir yön sağladığı sürece tam bir cevap değil, daha çok bir yoruma benziyor. Lütfen bir yorum olarak değiştirmeyi düşünün.
Dan
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.