Fontifica una regione di un buffer con un'altra modalità principale


12

Ho un buffer che mostra la documentazione per i moduli Ansible. Questo buffer ha la sua modalità principale che fornisce tutte le cose standard. In particolare, utilizza il buffer per evidenziare markup inline, opzioni, sezioni, ecc. Tutto sommato, è abbastanza simile a M-x man.

Nella parte inferiore della documentazione di solito ci sono alcuni esempi di codice in YAML. Vorrei anche chiarire questi. Potrei aggiungere le mie parole chiave per il blocco dei caratteri per YAML, ovviamente, ma preferirei riutilizzare la fontificazione della modalità YAML.

Come posso fare ciò? In particolare, come posso utilizzare una diversa modalità principale per fontificare una particolare regione di un buffer?

Si noti che la modalità YAML non deve essere attiva in questa regione. L'intero buffer è solo un buffer di visualizzazione passivo e non deve essere modificato. Ho solo bisogno della fontificazione prodotta come se la modalità YAML fosse attiva in quella regione.

Presumo che potrei copiare la regione del buffer in un buffer temporaneo, abilitare la modalità YAML, fontificare il buffer e copiare tutte le proprietà del testo. Funzionerebbe? In tal caso, come copio le proprietà del testo e quali sono le proprietà pertinenti da copiare? O c'è un approccio migliore?


Come viene implementata la fontificazione non yaml? Applicate manualmente le proprietà del testo o utilizzate la modalità blocco caratteri?
Malabarba,

I collegamenti in questo post riassumono almeno una buona parte delle opzioni disponibili: wisdomandwonder.com/link/8610/…
grettke,

Risposte:


10

Di recente mi sono imbattuto in un problema simile, fondamentalmente volevo chiarire gli snippet di codice nella documentazione che ho ottenuto da qualche altra fonte. Ho seguito l'approccio menzionato verso la fine della tua risposta e ha funzionato bene per me. La funzione che ho terminato con qualcosa di simile al seguente

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

Come sottolineato da @Malabarba nei commenti, il semplice approccio sopra riportato non funziona se il buffer di destinazione utilizza la modalità blocco caratteri. Comunque possiamo ingannare font-lock-mode nel credere che la stringa sia già bloccata da font impostando la proprietà text font-lock-facesu face, (otteniamo il faceset di proprietà, quando usiamo la funzione sopra) e impostando text-property fontifiedsu t. La seguente funzione accetta una stringa restituita dalla funzione sopra e fa la richiesta di elaborazione in modo che la stringa viene inserita fontified (questo è preso da org-mode org-src-font-lock-fontify-blockfunzione

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

Ora puoi usarlo come segue

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

Questa è la stessa soluzione per cui ho trovato sx.el, ma è importante notare che funzionerà solo se il buffer di destinazione non utilizza la modalità blocco caratteri.
Malabarba,

Giusto! Ho appena realizzato che questo ha funzionato per me perché ho usato nel buffer in cui non è stato utilizzato il blocco dei caratteri (Help buffer)
Iqbal Ansari,

@Malabarba ha trovato un modo per farlo funzionare con i buffer di destinazione con la modalità blocco caratteri abilitata
Iqbal Ansari,


Oh bello! Sono contento di poterti aiutare :)
Iqbal Ansari il

3

Library Narrow Indirect ( narrow-indirect) può essere d'aiuto qui: dai un'occhiata al commento dell'intestazione. Si basa su:

  1. restringimento, che limita la modifica a una porzione di un buffer e
  2. buffer indiretti, che copiano un buffer in un altro per il quale è possibile modificare la modalità principale.

Si noti che il restringimento è disabilitato per impostazione predefinita perché è considerato non adatto ai principianti (l'associazione predefinita è C-x n n). È possibile abilitarlo inserendo quanto segue nel file init:

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

Puoi anche cercare il mio fatto myfn-narrow-indirecta mano nella mia conf .


Il restringimento influisce effettivamente sul blocco dei caratteri, ovvero tenerlo lontano dall'esterno della regione ristretta? Il blocco dei caratteri non rimuove mai le restrizioni del buffer?
lunaryorn,

E comunque, un pacchetto wiki non è un'opzione.
lunaryorn,

Inoltre, non è necessario rimuovere la disabledproprietà da un comando per chiamarla da Emacs Lisp. Interessa solo l'uso interattivo.
lunaryorn,

0

Suggerirei di guardare org-src-font-lock-fontify-block che fornisce questa funzionalità per i blocchi sorgente in modalità org. Sembra semplicemente copiare le parti rilevanti in un altro buffer, abilitare lì la modalità principale e quindi copiare nuovamente il testo fontificato. Hackish, ma sembra funzionare.


2
Questa risposta assomiglia più a un commento in quanto fornisce una direzione suggerita per affrontare il problema, ma non una risposta completa. Si prega di considerare di cambiarlo in un commento.
Dan
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.