2012-04-23 8 views
5

¿Cuál sería una buena manera de hacer que Emacs resalte una expresión que puede incluir elementos como corchetes equilibrados, p. algo así comoemacs: resaltar expresiones equilibradas (por ejemplo, etiquetas LaTeX)

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

highlight-regex funciona muy bien para las cosas simples, pero tenía un verdadero problema de escribir una expresión regular emacs para reconocer los saltos de línea, y por supuesto que los partidos hasta el primer corchete de cierre.

(como una cuestión secundaria:. Punteros a cualquier paquete que se extienden emacs sintaxis de expresiones regulares sería muy apreciada - estoy teniendo tiempo muy duro con él, y estoy bastante familiarizado con expresiones regulares en Perl)

Editar: para mi propósito específico (etiquetas LaTeX destacando en un tampón de AUCTeX), yo era capaz de conseguir que esto funcione mediante la personalización de una variable específica AUCTeX font-latex-user-keyword-classes, que añade algo como esto para custom-set-variables en .emacs:

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

Una solución más genérica sería hasta que sea bueno tenerlo!

Respuesta

1

Puede usar funciones que actúen sobre s-expressions para trabajar con la región que desea resaltar, y use una de las soluciones mencionadas en this question para resaltarla.

Aquí es un ejemplo:

(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: Aquí está un ejemplo utilizando una función similar con el sistema de fuente de bloqueo estándar Emacs', como se explica en la sección search-based fontification de la emacs-lisp Manual:

(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

Buena idea, pero todavía no puedo hacer que funcione. En primer lugar, la solución de la "región que resalta" no parece hacer nada por mí, es decir. la ejecución de la declaración (add-text-properties 1 10 ...) por sí sola no resalta los símbolos 1 a 10. En segundo lugar, incluso si lo hago funcionar, estoy un poco preocupado de que el resaltado permanezca clavado en ese lugar en el buffer. También sería bueno si se pudiera hacer que esto funcione automáticamente, como lo hace el resaltado de sintaxis ... – laxxy

+0

"Estoy un poco preocupado de que el resaltado permanezca clavado en ese lugar en el búfer" No es el caso: texto las propiedades permanecen unidas a su texto, no a posiciones específicas en el búfer. – Francesco

+0

para otras dos inquietudes, creo que la sección [búsqueda basada en la codificación] (http://www.gnu.org/software/emacs/manual/html_node/elisp/Search_002dbased-Fontification.html#Search_002dbased- Fondation) de la elisp manual debería ayudarte. En particular, podría agregar un elemento 'function' a la variable' font-lock-keywords'. – Francesco

Cuestiones relacionadas