2010-08-06 19 views
6

¿Hay alguna manera de activar la ejecución de una función emacs lisp que no sea M-x myfun? Me gustaría que la función se vuelva a llamar cada vez que se cambie el búfer.ejecuta continuamente una función emacs lisp

Antecedentes: tengo una tabla de números con algunos errores. La tabla tiene totales de columnas y otras características que se pueden usar para identificar los errores. Mi función elisp resalta columnas sospechosas de números. Lo que me gustaría es que el resaltado desaparezca tan pronto como se corrijan los números, sin repetidas llamadas a la función de resaltar errores.

La función análoga en Excel se llama, creo, "formato condicional"

+1

Por supuesto que puede hacer esto. Echa un vistazo a los implementos 'c-mode'' corsé eléctrico'. –

Respuesta

9

El concepto que está buscando en sus primeros párrafos es ganchos. Una variable de enlace es una lista de funciones que se ejecutan cuando ocurre un determinado evento. La mayoría de las variables de gancho tienen un nombre que termina en -hook. El gancho after-change-functions se ejecuta cada vez que escribe algo o cambia el búfer. Los ganchos se tratan en el manual de Emacs Lisp bajo el título "Ganchos".

Sin embargo, dado lo que está tratando de hacer, sería más fácil usar el mecanismo de resaltado de Emacs. La solución puede ser tan simple como agregar una expresión regular en el lugar correcto.

La mayoría de los archivos que contienen texto estructurado (especialmente lenguajes de programación) se resaltan con el mecanismo de bloqueo de fuente. Esto está documentado en los manuales de Emacs y Emacs Lisp en "Font Lock"; vea en particular la función font-lock-add-keywords, para lo cual el manual de Emacs da un ejemplo que es más o menos lo que está buscando. También hay some information on the Emacs wiki.

añadido:

bloqueo de fuente puede ir más allá de las expresiones regulares; desafortunadamente, la documentación está limitada a la breve explicación en el docstring de font-lock-keywords. Hay algunos ejemplos simples en cperl-mode.el (aunque están algo enterrados en la masa). El wiki también hace referencia al ctypes.el que usa esta característica. Aquí hay un ejemplo que resalta las adiciones de enteros incorrectos.

(defun maybe-warn-about-addition() 
    (let ((x (string-to-int (match-string 1))) 
     (y (string-to-int (match-string 2))) 
     (z (string-to-int (match-string 3)))) 
    (if (/= (+ x y) z) 
     font-lock-warning-face))) 
(font-lock-add-keywords 
nil 
'(("\\s-\\([0-9]+\\)\\s-*\\+\\s-*\\([0-9]+\\)\\s-*=\\s-*\\([0-9]+\\)\\s-" 
    (3 (maybe-warn-about-addition) t)))) 

Incluso la expresión regular puede ser reemplazado por código arbitrario que busca los límites de lo que se desea resaltar (un nombre de función como MATCHER, utilizando el vocabulario de la cadena de documentación). Hay un ejemplo avanzado de palabras clave de bloqueo de fuente en el modo C estándar (cc-fonts.el).

+0

Muchas gracias. Mi sensación era que Font Lock era personalizable para las expresiones regulares, pero que no había una facilidad para las condiciones basadas en el contenido, como resaltar la línea 1 1 3 (porque 1 + 1! = 3) y luego eliminar resaltar cuando la línea se convierte en 2 1 3 (porque 2 + 1 hace = 3). – josh

+0

@josh: puede escribir código arbitrario para configurar el resaltado con Font Lock, es un poco más complicado. Tu ejemplo es definitivamente posible. Buscaré un código de ejemplo y lo agregaré a mi respuesta. – Gilles

1

Añadir su función a la variable after-change-functions.

Cuestiones relacionadas