Buscando algo así como una `` primera pulsación de tecla en un gancho ''

7

Suponga que tengo una sesión de Emacs ejecutándose y que me alejo de mi computadora por, digamos, 20 minutos. Al regresar a mi sesión de Emacs, en algún momento presionaré alguna tecla mientras la ventana de Emacs tiene el foco. Este sería un ejemplo del tipo de evento al que estoy llamando first-keypress-in-a-while 1 .

Estoy buscando una manera de hacer que Emacs ejecute automáticamente un código cada vez que ocurre tal evento. IOW, estoy buscando algo como a first-keypress-in-a-while-hook.

Mirando a través de los ganchos estándar de Emacs, no puedo identificar de inmediato a un buen candidato, pero tal vez haya uno no obvio que pueda hacer este trabajo.

Alternativamente, ¿hay alguna otra forma en que pueda simular / aproximar la funcionalidad de un gancho?


1 Por supuesto, se in-a-whilerefiere a algún parámetro configurable por el usuario que corresponde a un intervalo de tiempo mínimo, digamos 15 minutos. El evento que me interesa es la primera pulsación de tecla después de un período de inactividad más largo que este intervalo. Por "inactividad" me refiero al estado en el que Emacs no detecta la interacción del usuario: sin presionar teclas, sin clics del mouse, etc.

kjo
fuente

Respuestas:

7

Tu podrías intentar:

(defun my-run-fkpiawh ()
  (remove-hook 'pre-command-hook #'my-run-fkpiawh)
  (run-hooks 'first-keypress-in-a-while-hook))
(run-with-idle-timer 1200 t (lambda ()
                              (add-hook 'pre-command-hook
                                        #'my-run-fkpiawh)))

Después de lo cual puede usar agregar funciones a first-keypress-in-a-while-hook.

Stefan
fuente
1
¿Su función también debería eliminarse pre-command-hookdespués de ejecutarse? Creo que esto agregará my-run-fkpiawh a cada comando llamado después del período de inactividad, en lugar de solo el primero.
Tyler
6

Supongo que una solución a su problema es establecer una bandera con un temporizador inactivo, https://www.gnu.org/software/emacs/manual/html_node/elisp/Idle-Timers.html

y verificando / desarmando con post-self-insert-hooko un gancho similar de su elección.

Lo siguiente funciona para mí:

(defvar *my-idle-flag* nil)
(run-with-idle-timer 900 t (lambda () (setq *my-idle-flag* t)))
(add-hook 'post-self-insert-hook
      (lambda()
        (if *my-idle-flag* (message "plong"))
        (setq *my-idle-flag* nil)))
Vera Johanna
fuente