¿Cómo detectar las pulsaciones de teclas que no editan el búfer?


8

¿Cuál es la mejor manera de detectar pulsaciones de teclas (por ejemplo, a través de un gancho) que no editan el búfer? Me refiero a cosas como las teclas de flecha para el movimiento de puntos, llamadas a beginning-of-buffer, etc.

La razón de esto es que estoy trabajando en algunos ycmdenlaces para emacs, y me gustaría poder detectar (al menos heurísticamente) cuando el usuario ha dejado de editar y se está moviendo alrededor del búfer. Este es un buen momento para enviar el contenido del búfer a analizar. El cliente vim hace esto cuando el usuario sale del modo de inserción, y estoy tratando de emular ese comportamiento.


8
Puede estar interesado en temporizadores inactivos para este tipo de cosas: gnu.org/software/emacs/manual/html_node/elisp/Idle-Timers.html
giordano

2
Otra idea (o un refinamiento de la idea con temporizadores inactivos): aconseje self-insert-commandcancelar y reprogramar un temporizador en lugar de usar un temporizador inactivo. De esta manera, incluso si el usuario hace algo, el temporizador no se reinicia a menos que el "algo" sea la inserción de texto.
mbork

2
mbork: after-change-functionses un mecanismo general para reaccionar a los cambios de texto.
phils

1
Use a post-command-hook. Eso se activará en todo, por lo que es posible que deba filtrar lo que lo activó antes de tomar la acción que desee.
Malabarba

1
No estoy seguro de que sea relevante para este problema en particular, pero la buffer-chars-modified-tickfunción puede ser útil.
Jon O.

Respuestas:


2

Agregue los siguientes ganchos:

  • Para pre-command-hook, establezca alguna variable centinela en t: esto indica que el comando no cambió.
  • Para after-change-functions, establezca este valor centinela en nil. (Es un gancho, simplemente no suena como uno; gracias a @phils por señalar esto).
  • Para post-command-hook, verifique este valor centinela y ejecute su función.

Esto puede o no funcionar dependiendo del orden de ejecución. Si no es así, hágamelo saber en los comentarios a continuación.


Cuando salga del trabajo, publicaré un ejemplo.


Tengo que ir a trabajar ahora ...
Sean Allred

2
No aconseje auto inserción. Usar funciones de cambio posterior
Malabarba

Le daré una oportunidad cuando tenga la oportunidad.
abingham el

44
@abingham Como regla general, los ganchos son preferibles a los consejos. Los ganchos están específicamente diseñados para que adjuntes funciones, mientras que los consejos son formas de adjuntar algo en lugares inesperados. En este caso particular, tampoco es aconsejable recomendar algunas funciones fundamentales, ya que interactúa de manera poco confiable con la compilación de bytes.
Malabarba

2
Creo que Sean tenía la intención de referirse post-self-insert-hook(esa parte de la respuesta parece confundir ese gancho con el asesoramiento self-insert-command). En cualquier caso, creo que generalmente preferiría after-change-functionsporque realmente hace lo que quiere (ya que la autoinserción no es el único tipo de pulsación de tecla que modifica el búfer).
phils

0

Solo un pensamiento -

Esto no debería ser realmente sobre "pulsaciones de teclas", sino sobre comandos , no importa cómo se ejecuten, ¿ no ? Si entiendo correctamente, realmente está buscando una manera de saber si un comando dado que se invoca modifica el búfer.

Si es así, entonces quizás haga algo como esto:

  • Poner una función en pre-command-hookeso (1) registra el valor actual de (buffer-modified-p)y luego (2) utiliza set-modified-ppara hacer que el búfer no se modifique.

  • Ponga una función en post-command-hookeso (1) verifica si el comando modificó el búfer (comparando el valor registrado con el nuevo valor actual de (buffer-modified-p)), luego actúa en consecuencia, y (2) si el nuevo valor se nilrestablece al valor previo al cambio utilizando set-modified-p.

Tipo de mano dura (comprueba cada comando que se invoca), pero puede valer la pena intentarlo.

Si la parte " actúa en consecuencia " no es una opción para todos los comandos de modificación del búfer, y si también es una opción no operativa para muchos comandos que no modifican (por ejemplo, porque lo hizo en un comando anterior que no modifica), entonces al menos no harás esa acción de "actuar en consecuencia " más de lo necesario. Pero la parte de verificación por sí sola puede ser costosa / exagerada (ralentizar demasiado las cosas), pruébelo para ver.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.