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

Events 如何以编程方式生成鼠标事件?,events,emacs,mouse,Events,Emacs,Mouse,SLIME中有两个非常有用的功能:鼠标上的SLIME copy或inspect presentation和SLIME presentation菜单。但必须使用事件参数调用它们。为了生成一个偶数,我需要做大量的后勤计算,计算鼠标当前指向的对象的打印表示所占据的区域,线和列-这是我不想做的,因为在Emacs中肯定有一些东西已经计算了所有这些东西 那么,有没有一种简单的方法来生成假鼠标事件?因为在一个编辑器中使用鼠标只做两件事,否则不需要鼠标感觉。。。嗯,不是很聪明 编辑 以下是我尝试过的: (def

SLIME中有两个非常有用的功能:鼠标上的SLIME copy或inspect presentation和SLIME presentation菜单。但必须使用事件参数调用它们。为了生成一个偶数,我需要做大量的后勤计算,计算鼠标当前指向的对象的打印表示所占据的区域,线和列-这是我不想做的,因为在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调用绑定到菜单项的任何函数时,它们会不知何故地发现它们不是用真正的鼠标事件调用的,抛出并退出

编辑2


我实际上认为这是因为x-popup-menu,当你用鼠标或键盘选择菜单项时,它会发送不同的事件。。。arrrrgh.

希望绑定到鼠标单击的命令将获取事件参数。这是一个完整的列表,包括点击的按钮、位置、窗口等。请参见

下面是一个模拟滚轮事件的简单示例:

鼠标滚轮`鼠标-5;;按钮 ,选定窗口;;窗 指向位置 0 . 0 ;; 窗口相对像素 0 ;; 时间戳 无对象 指向文本位置 ,当前列;;柱 ,pos点的行号;;线 无形象 0 . 0 ;; 对象相对像素 1.1.对象大小 下面是一个真实事件的示例:

“鼠标-4 120 6.10 1301935153 无 120 0 . 0 无 6.10 7.15 posn在这一点上做了几乎正确的事情。下面是一种将其输出与真实鼠标事件进行比较的方法:

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

我对slime一点也不熟悉,但看一下源代码,您提到的函数似乎称为“单击周围的slime演示”,而单击周围的slime演示又称为“点周围的slime演示”。它似乎将点击转换为一个点,所以您应该能够编写类似的函数,直接在点周围使用slime表示。我在看Ubuntu上的slime-20100722,我想posn-at-point主要就是这么做的。我想知道它是否只在最近的emacs中可用?