Procurando algo como um `primeiro pressionamento de tecla em um momento '

7

Suponha que eu tenha uma sessão do Emacs em execução e que me afaste do meu computador por, digamos, 20 minutos. Ao retornar à minha sessão do Emacs, em algum momento pressionarei alguma tecla enquanto a janela do Emacs estiver em foco. Este seria um exemplo do tipo de evento que estou chamando de first-keypress-in-a-while 1 .

Estou procurando uma maneira de o Emacs executar automaticamente algum código sempre que esse evento acontecer. Estou procurando algo parecido com um first-keypress-in-a-while-hook.

Olhando através dos ganchos padrão do Emacs, não consigo identificar imediatamente um bom candidato, mas talvez exista um não óbvio que possa fazer esse trabalho.

Como alternativa, existe alguma outra maneira de simular / aproximar a funcionalidade de um gancho?


1 Obviamente, in-a-whilerefere-se a algum parâmetro configurável pelo usuário que corresponde a um intervalo de tempo mínimo, digamos 15 minutos. O evento em que estou interessado é o primeiro pressionamento de tecla após um período de inatividade maior que esse intervalo. Por "inatividade", quero dizer o estado em que o Emacs não detecta nenhuma interação do usuário: sem pressionar as teclas, sem clicar no mouse etc.

kjo
fonte

Respostas:

7

Você poderia tentar:

(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)))

Após o qual você pode usar adicionar funções ao first-keypress-in-a-while-hook.

Stefan
fonte
11
Sua função também deve se remover pre-command-hookapós a execução? Eu acho que isso adicionará my-run-fkpiawh a todos os comandos chamados após o período ocioso, em vez de apenas o primeiro?
Tyler #
6

Eu acho que uma solução do seu problema é definir um sinalizador com um timer inativo, https://www.gnu.org/software/emacs/manual/html_node/elisp/Idle-Timers.html

e marcando / desmarcando-o com post-self-insert-hookum gancho similar de sua escolha.

O seguinte funciona para mim:

(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
fonte