¿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 ycmd
enlaces 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.
key-bindings
abingham
fuente
fuente
self-insert-command
cancelar 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.after-change-functions
es un mecanismo general para reaccionar a los cambios de texto.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.buffer-chars-modified-tick
función puede ser útil.Respuestas:
Agregue los siguientes ganchos:
pre-command-hook
, establezca alguna variable centinela ent
: esto indica que el comando no cambió.after-change-functions
, establezca este valor centinela ennil
. (Es un gancho, simplemente no suena como uno; gracias a @phils por señalar esto).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.
fuente
post-self-insert-hook
(esa parte de la respuesta parece confundir ese gancho con el asesoramientoself-insert-command
). En cualquier caso, creo que generalmente preferiríaafter-change-functions
porque 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).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-hook
eso (1) registra el valor actual de(buffer-modified-p)
y luego (2) utilizaset-modified-p
para hacer que el búfer no se modifique.Ponga una función en
post-command-hook
eso (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 senil
restablece al valor previo al cambio utilizandoset-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.
fuente