Auf der Suche nach so etwas wie einem "ersten Tastendruck in einer Weile"

7

Angenommen, ich habe eine Emacs-Sitzung ausgeführt und entferne mich beispielsweise 20 Minuten lang von meinem Computer. Wenn ich zu meiner Emacs-Sitzung zurückkehre, drücke ich irgendwann eine Taste, während das Emacs-Fenster den Fokus hat. Dies wäre ein Beispiel für die Art von Ereignis, das ich first-keypress-in-a-while 1 nenne .

Ich suche nach einer Möglichkeit, Emacs automatisch Code ausführen zu lassen, wenn ein solches Ereignis eintritt. IOW, ich suche so etwas wie ein first-keypress-in-a-while-hook.

Wenn ich mir die Standardhaken von Emacs ansehe, kann ich keinen guten Kandidaten sofort identifizieren, aber vielleicht gibt es einen nicht offensichtlichen, der diesen Job machen könnte.

Gibt es eine andere Möglichkeit, die Funktionalität eines solchen Hakens zu simulieren / zu approximieren?


1in-a-while Bezieht sich natürlich auf einen vom Benutzer einstellbaren Parameter, der einem minimalen Zeitintervall entspricht, z. B. 15 Minuten. Das Ereignis, an dem ich interessiert bin, ist der erste Tastendruck nach einer Zeit der Inaktivität, die länger als dieses Intervall ist. Mit "Inaktivität" meine ich den Zustand, in dem Emacs keine Benutzerinteraktion erkennt: keine Tastendrücke, keine Mausklicks usw.

kjo
quelle

Antworten:

7

Du könntest es versuchen:

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

Danach können Sie Funktionen hinzufügen zu verwenden first-keypress-in-a-while-hook.

Stefan
quelle
1
Sollte sich Ihre Funktion auch nach dem Ausführen von selbst entfernen pre-command-hook? Ich denke, dies wird my-run-fkpiawh zu jedem Befehl hinzufügen, der nach der Leerlaufperiode aufgerufen wird, anstatt nur zum ersten?
Tyler
6

Ich denke, eine Lösung Ihres Problems besteht darin, ein Flag mit einem Leerlauf-Timer zu setzen, https://www.gnu.org/software/emacs/manual/html_node/elisp/Idle-Timers.html

und überprüfen / deaktivieren Sie es mit post-self-insert-hookoder einem ähnlichen Haken Ihrer Wahl.

Folgendes funktioniert für mich:

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