Tìm kiếm một cái gì đó giống như một 'phím bấm đầu tiên trong một thời gian


7

Giả sử rằng tôi có một phiên Emacs đang chạy và tôi rời khỏi máy tính của mình trong 20 phút. Khi trở lại phiên Emacs của tôi, một lúc nào đó tôi sẽ nhấn một số phím trong khi cửa sổ Emacs có tiêu điểm. Đây sẽ là một ví dụ về loại sự kiện tôi đang gọi first-keypress-in-a-while 1 .

Tôi đang tìm cách để Emacs tự động chạy một số mã bất cứ khi nào sự kiện như vậy xảy ra. IOW, tôi đang tìm kiếm một cái gì đó như a first-keypress-in-a-while-hook.

Nhìn qua các móc tiêu chuẩn của Emacs tôi không thể xác định được ngay một ứng cử viên tốt, nhưng có lẽ có một người không rõ ràng có thể làm công việc này.

Ngoài ra, có một số cách khác mà tôi có thể mô phỏng / gần đúng chức năng của một cái móc như vậy không?


1 Tất nhiên, in-a-whileđề cập đến một số tham số có thể xác định người dùng tương ứng với một khoảng thời gian tối thiểu, giả sử 15 phút. Sự kiện tôi quan tâm là lần nhấn phím đầu tiên sau một khoảng thời gian không hoạt động lâu hơn khoảng thời gian này. Theo "không hoạt động", ý tôi là trạng thái mà Emacs phát hiện không có tương tác của người dùng: không nhấn phím, không nhấp chuột, v.v.

Câu trả lời:


7

Bạn có thể thử:

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

Sau đó, bạn có thể sử dụng thêm chức năng first-keypress-in-a-while-hook.


1
Chức năng của bạn cũng nên loại bỏ chính nó pre-command-hooksau khi nó chạy? Tôi nghĩ rằng điều này sẽ thêm my-run-fkpiawh vào mỗi lệnh được gọi sau khoảng thời gian nhàn rỗi, thay vì chỉ đầu tiên?
Tyler

6

Tôi đoán một giải pháp cho vấn đề của bạn là đặt cờ với bộ đếm thời gian nhàn rỗi, https://www.gnu.org/software/emacs/manual/html_node/elisp/Idle-Timers.html

và kiểm tra / bỏ đặt nó với post-self-insert-hookhoặc một móc tương tự bạn chọn.

Các công việc sau đây cho tôi:

(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)))
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.