【问题标题】:How to generate mouse event programmatically?如何以编程方式生成鼠标事件?
【发布时间】:2012-06-20 16:32:47
【问题描述】:

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。

【问题讨论】:

    标签: events emacs mouse


    【解决方案1】:

    希望绑定到鼠标单击的命令采用事件参数。这是一个列表,其中包含单击的按钮、位置、窗口等内容。请参阅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)))
    

    【讨论】:

    • 我对slime一点也不熟悉,但是看了一下源码,好像你提到的函数调用slime-presentation-around-click,又调用了slime-presentation-around-观点。似乎它将点击转换为一个点,因此您应该能够编写类似的函数,直接使用 slime-presentation-around-point。我正在查看来自 Ubuntu 的 slime-20100722。
    • posn-at-point 主要是这样做的,我想。我想知道它是否仅在最近的 emacs 中可用?
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多