Mô phỏng thao tác chuột với bàn phím


8

Có cách nào, thông qua một số lệnh có thể được gọi bằng bàn phím, khiến Emacs nghĩ rằng tôi đã nhấp vào một điểm cụ thể (để nó làm bất cứ điều gì nó sẽ làm nếu tôi nhấp vào đó, ví dụ: theo liên kết hoặc bật lên một menu )? Hoặc là tôi di chuột ở điểm (để đầu công cụ bật lên)?

[Động lực: Một số chế độ trang trí bộ đệm, biến một số văn bản thành liên kết và như vậy. Tôi có thể biết cách làm một cái gì đó với chuột (ví dụ: nhấp vào nó), nhưng không phải là phím tắt / lệnh tương đương để gọi. Tất nhiên tôi nên đọc tài liệu cho chế độ và tìm hiểu nó, nhưng nghĩ đó là một câu hỏi thú vị.]


2
Tôi đặc biệt quan tâm đến việc bạn có thể mô phỏng di chuột bằng bàn phím hay không. Không có gì lạ khi một mẹo công cụ là nơi dễ nhất để tìm thông tin tôi đang tìm kiếm.
nispio

@nispio bạn có thể xem trước chú giải công cụ tại điểm với trợ giúp hiển thị cục bộ
Malabarba

@Malabarba: Cảm ơn rất nhiều; Điều đó dường như làm việc!
ShreevatsaR

Câu trả lời:


5

Thông thường, điều hướng đến một vị trí và nhấn một số phím sẽ có tác dụng tương tự như nhấp vào vị trí đó. Không có cơ chế tích hợp nào đảm bảo điều này, chỉ có các chế độ thường được viết theo cách đó.

Bạn có thể tạo các sự kiện chuột ( nhấp chuột , gấp đôi / gấp ba / lần nhấp , nút xuống / lên , kéo , chuyển động ). Tất cả các sự kiện chuột có dạng (TYPE POSITION . EXTRA-DATA)TYPE là biểu tượng mã hóa nút chuột, tính chất của hành động (nhấp, kéo, v.v.) và các công cụ sửa đổi. TYPE là mouse-movementcho một sự kiện chuyển động. Gọi posn-at-pointđể tạo VỊ TRÍ cho vị trí của điểm trong bộ đệm hiện tại.

Dưới đây là một số mã bằng chứng mô phỏng mô phỏng nhấp chuột tại vị trí con trỏ khi bạn nhấn f11theo sau là một chữ số. Công cụ sửa đổi được đưa vào tài khoản.

(defun make-mouse-event-at-point (base-event)
  (let ((posn (posn-at-point))
        (prefix "")
        (basic-type (event-basic-type base-event))
        (modifiers (event-modifiers base-event)))
    (cond
     ((and (integerp basic-type) (>= basic-type ?0) (<= basic-type ?9))
      ;; click
      (let* ((mouse-type (intern (format "%smouse-%d" prefix (- basic-type ?0))))
             (click-count 1)
             (type (event-convert-list (append modifiers (list mouse-type)))))
        (list type posn click-count)))
     (t
      (error "Unsupported key for mouse event: %s" (event-basic-type base-event))))))
(defun simulate-mouse-event-at-point ()
  (interactive)
  (let ((event (make-mouse-event-at-point last-input-event)))
    (setq unread-command-events (cons event unread-command-events))))

(defvar simulate-mouse-event-map (make-sparse-keymap))
(global-set-key [f11] simulate-mouse-event-map)
(define-key simulate-mouse-event-map [t] 'simulate-mouse-event-at-point)

Mô phỏng di chuột có vẻ khó khăn hơn.


1
Điều này không mô phỏng di chuột, nhưng nếu tất cả những gì bạn muốn là nhìn thấy một chú giải công cụ, bạn có thể xem trước chú giải công cụ tại điểm với trợ giúp hiển thị cục bộ
Malabarba

Tôi vẫn đang thử điều này, nhưng để trả lời cho một vài câu đầu tiên: lý do tôi hỏi câu hỏi này là tôi đang làm việc ở chế độ mà "một số phím" không rõ ràng (nhưng nó xảy ra C-c C-, RET, nhưng tôi đã phải tra cứu tài liệu của chế độ cho việc đó).
ShreevatsaR

Trên thực tế điều này không hoạt động. Trong chế độ tôi đang làm việc, một số đoạn mã được chuyển thành một liên kết và nhấp chuột sẽ mở ra một menu tại điểm. Làm như trên f11 1mà không làm điều đó (nó in một cái gì đó trong xe buýt nhỏ nhưng nó không tương đương với một cú nhấp chuột vào liên kết) mặc dù f11 3có vẻ tương đương <mouse-3>và vân vân.
ShreevatsaR

@ShreevatsaR Có thể hành động nhấp chuột mà bạn muốn bị ràng buộc down-mouse-1và không mouse-1? Làm thế nào tôi có thể tìm ra trong đó keymap mà một khóa bị ràng buộc? có thể giúp điều tra việc này.
Gilles 'SO- ngừng trở thành ác quỷ '10
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.