¿Cómo puedo tener un comando "verdaderamente" interactivo en emacs?

¿Cómo puedo tener un comando "verdaderamente" interactivo en emacs?

¿Cómo implementaría unpuros huesos¿Función que 'reevalúa' con cada pulsación de tecla? Me refiero a presionar una tecla sin apretar; Estoy buscando emular el comportamiento de isearchy amigos.

Usaría esto para probar interactivamente expresiones XPath contra un búfer en modo nxml abierto usando algo parecido a la reducción del búfer. Sin embargo, para los propósitos de esta pregunta, solo una función que llame messagea lo que sea que esté en el minibúfer sería absolutamente grandiosa.

Respuesta1

Dependiendo de lo que quieras, puedes hacer trampa y usar isearch-mode: su tercer argumento ( OP-FUN) es una función llamada después de que se procesa cada entrada, y su quinto argumento ( WORD) puede ser cualquier función que transforme la cadena escrita en isearch en una expresión regular para buscar. para en el búfer.

Por ejemplo:

(defun my-op-fun (string &optional lax)
  (let ((words (split-string string ":")))
    (mapconcat '(lambda (word) 
                  (concat "\\<" (regexp-quote word)))
               words "\\>.*")))

(defun my-isearch-beggining-of-line ()
  (interactive)
  (isearch-mode t t nil t 'my-op-fun))

si escribe "foo", buscará una palabra que comience con "foo", si escribe "foo:bar", buscará la palabra "foo" seguida de algún otro carácter y luego "bar" como comienzo de una palabra. .

Es posible que sea necesario dominar algunas expresiones regulares para que esto funcione para usted.

También puedes consultar la fuente de isearch para ver cómo se hace.

información relacionada