2012-04-23 13 views
5

Quale sarebbe un buon modo per ottenere Emacs per evidenziare un'espressione che potrebbe includere elementi come parentesi quadre - ad es. qualcosa comeemacs: evidenziare le espressioni bilanciate (ad esempio i tag LaTeX)

\highlightthis{some \textit{text} here 
some more text 
done now} 

highlight-regex funziona bene per le cose semplici, ma ho avuto reali problemi a scrivere un emacs regex per riconoscere interruzioni di riga, e, naturalmente, partite fino alla prima parentesi di chiusura.

(come una questione secondaria:. Puntatori a tutti i pacchetti che si estendono emacs sintassi regex sarebbe molto apprezzato - Sto avendo il tempo piuttosto difficile con esso, e io sono abbastanza familiarità con le regex in Perl)

Edit: per il mio scopo specifico (tag LaTeX evidenziando in un buffer AUCTeX), sono stato in grado di ottenere questo al lavoro personalizzando un AUCTeX specifica variabile font-latex-user-keyword-classes, che aggiunge qualcosa di simile per custom-set-variables in .emacs:

'(font-latex-user-keyword-classes (quote (("mycommands" (("highlightthis" "{")) (:slant italic :foreground "red") command)))) 

Una soluzione più generica sarebbe s finché sia ​​bello avere però!

risposta

1

È possibile utilizzare le funzioni che agiscono sulle espressioni S per lavorare con la regione che si desidera evidenziare e utilizzare una delle soluzioni menzionate su this question per evidenziarla effettivamente.

Ecco un esempio:

(defun my/highlight-function() 
    (interactive) 
    (save-excursion 
    (goto-char (point-min)) 
    (search-forward "\highlightthis") 
    (let ((end (scan-sexps (point) 1))) 
     (add-text-properties (point) end '(comment t face highlight))))) 

EDIT: Ecco un esempio utilizzando una funzione simile con bloccaggio font standard Emacs', come spiegato nella sezione search-based fontification della emacs-lisp manuale:

(defun my/highlight-function (bound) 
    (if (search-forward "\highlightthis" bound 'noerror) 
     (let ((begin (match-end 0)) 
      (end (scan-sexps (point) 1))) 
     (set-match-data (list begin end)) 
     t) 
    nil)) 
(add-hook 'LaTeX-mode-hook 
      (lambda() 
      (font-lock-add-keywords nil '(my/highlight-function)))) 
+0

Bella idea, ma non riesco ancora a farlo funzionare. In primo luogo, la soluzione dalla "evidenziazione della regione" non sembra fare nulla per me - cioè. l'esecuzione dell'istruzione (add-text-properties 1 10 ...) da sola non evidenzia i simboli da 1 a 10. In secondo luogo, anche se riesco a farlo funzionare, sono un po 'preoccupato che l'evidenziazione rimanga bloccato in quel punto nel buffer. Sarebbe anche bello se questo potesse essere fatto funzionare automaticamente, come il modo in cui l'evidenziazione della sintassi fa ... – laxxy

+0

"Sono un po 'preoccupato che l'evidenziazione rimanga bloccato in quel punto nel buffer" Non è il caso: testo le proprietà rimangono attaccate al loro testo, non a specifiche posizioni nel buffer. – Francesco

+0

per voi due altre preoccupazioni, penso che la sezione [fontificazione basata sulla ricerca] (http://www.gnu.org/software/emacs/manual/html_node/elisp/Search_002dbased-Fontification.html#Search_002dbased-Fontification) del il manuale di elisp dovrebbe aiutarti. Potresti in particolare aggiungere un elemento 'function' alla variabile' font-lock-keywords'. – Francesco

Problemi correlati