「最初のキーを押しながらフック」のようなものを探しています


7

Emacsセッションを実行していて、たとえば20分間コンピューターから離れたとします。Emacsセッションに戻ったら、ある時点で、Emacsウィンドウにフォーカスがある間に何らかのキーを押します。これは、私がfirst-keypress-in-a-while 1と呼んでいる種類のイベントの例です。

このようなイベントが発生したときにEmacsが自動的にコードを実行する方法を探しています。IOW、私は何かのようなものを探していfirst-keypress-in-a-while-hookます。

Emacsの標準的なフック調べても、すぐに良い候補を特定することはできませんが、この仕事を実行できる明白でないものがあるかもしれません。

あるいは、そのようなフックの機能をシミュレート/近似できる他の方法はありますか?


1もちろん、in-a-while最小時間間隔、たとえば15分に対応するユーザー設定可能なパラメーターを指します。私が興味を持っているイベントは、この間隔より長い非アクティブな期間の後の最初のキーを押すことです。「非アクティブ」とは、Emacsがユーザー操作を検出しない状態を意味します。つまり、キーを押したり、マウスをクリックしたりしないなどです。

回答:


7

あなたは試すことができます:

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

その後、関数をに追加できますfirst-keypress-in-a-while-hook


1
関数はpre-command-hook実行後にもそれ自体を削除する必要がありますか?これは、最初の時間だけでなく、アイドル期間の後に呼び出されるすべてのコマンドにmy-run-fkpiawhを追加すると思いますか?
タイラー

6

あなたの問題の解決策は、アイドルタイマーでフラグを設定することだと思います、https://www.gnu.org/software/emacs/manual/html_node/elisp/Idle-Timers.html

そしてそれをチェック/設定解除しpost-self-insert-hookます。

次は私のために働きます:

(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)))
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.