如何以编程方式生成鼠标事件?

时间:2012-06-20 16:32:48

标签: events emacs mouse

SLIME中有两个非常有用的功能:slime-copy-or-inspect-presentation-at-mouseslime-presentation-menu。但必须使用事件参数调用它们。为了生成一个偶数,我需要做很多后勤工作(计算“鼠标”当前指向的对象的打印表示所占据的区域,行和列 - 我真的不想做的事情因为,当然Emacs中有一些东西可以计算所有这些东西。

那么,是否有一种简单的方法来生成“假的”鼠标事件?因为在编辑器中只使用鼠标只需两个东西,否则不需要鼠标感觉......好吧,不是很聪明。 :)

修改

这是我尝试过的:

(define-key lisp-mode-map (kbd "C-x ?")
  #'(lambda ()
      (interactive)
      (message "called")
      (slime-copy-or-inspect-presentation-at-mouse
       `(mouse-2 ;; button
     (,(selected-window) ;; window
      ,(point) ;; position
      (0 . 0) ;; window-relative pixel
      0 ;; timestamp
      nil ;; object
      ,(point) ;; text position 
      (,(current-column) . ;; column
       ,(line-number-at-pos (point))) ;; line
      nil ;; image
      (0 . 0) ;; object-relative pixel
      (1 . 1))))))
(define-key lisp-mode-map (kbd "C-x SPC")
  #'(lambda ()
      (interactive)
      (message "called")
      (slime-presentation-menu
       `(mouse-3 ;; button
     (,(selected-window) ;; window
      ,(point) ;; position
      (0 . 0) ;; window-relative pixel
      0 ;; timestamp
      nil ;; object
      ,(point) ;; text position 
      (,(current-column) . ;; column
       ,(line-number-at-pos (point))) ;; line
      nil ;; image
      (0 . 0) ;; object-relative pixel
      (1 . 1))))))

这实际上可以让我达到显示菜单的程度,但当slime-presentation-menu调用绑定到菜单项的任何函数时,他们会看到它们没有被“真正的”鼠标事件调用,扔出去。 :(

EDIT2

我实际上认为这是因为x-popup-menu,当您使用鼠标或键盘选择菜单项时调度不同的事件... arrrrrgh。

2 个答案:

答案 0 :(得分:4)

期望绑定到鼠标单击的命令采用事件参数。这是一个包含点击按钮,位置,窗口等内容的列表。请参阅21.7.4 Click Events in the Elisp manual

这是一个伪造滚轮事件的简单示例:

(mwheel-scroll `(mouse-5 ;; button
                 (,(selected-window) ;; window
                  ,(point) ;; position
                  (0 . 0) ;; window-relative pixel
                  0 ;; timestamp
                  nil ;; object
                  ,(point) ;; text position 
                  (,(current-column) . ;; column
                   ,(line-number-at-pos (point))) ;; line
                  nil ;; image
                  (0 . 0) ;; object-relative pixel
                  (1 . 1)))) ;; object size

以下是真实事件的示例:

'(mouse-4
  (#<window 374 on *scratch*>
   120
   (6 . 10)
   1301935153
   nil
   120
   (0 . 0)
   nil
   (6 . 10)
   (7 . 15)))

答案 1 :(得分:0)

posn-at-point几乎做对了。这是一种将其输出与真实鼠标事件进行比较的方法:

(defun my/test-posn (e)
  (interactive "e")
  (message "%S\n%S" e `(down-mouse-3 ,(posn-at-point))))

(global-set-key [down-mouse-3] #'my/test-posn)

输出:

(down-mouse-3 (#<window 73 on blah> 3152 (0 . 594) 145393072 nil 3152 (0 . 33) nil (1 . 4) (8 . 18)))
(down-mouse-3 (#<window 73 on blah> 3152 (0 . 594) 0         nil 3152 (0 . 33) nil (0 . 0) (8 . 18)))