5

SLIME には と の 2 つの非常に便利な機能がslime-copy-or-inspect-presentation-at-mouseありslime-presentation-menuます。ただし、イベント引数を指定して呼び出す必要があります。偶数を生成するには、多くのロジスティクスを行う必要があります (「マウス」が現在指しているオブジェクトの印刷された表現、行と列が占める領域を計算する - 私が本当にやりたくないこと)なぜなら、確かに Emacs にはすでにそれらすべてを計算する何かがあるからです。

それで、「偽の」マウスイベントを生成する簡単な方法はありますか? エディターでマウスを使用するのは、他の方法ではマウスの感覚を必要としない 2 つのことだけだからです...まあ、あまりスマートではありません。:)

編集

これが私が試したことです:

(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これは、マウスまたはキーボードでメニュー項目を選択したときに異なるイベントをディスパッチする が原因だと思います... arrrrgh。

4

2 に答える 2

4

マウス クリックにバインドされることを期待するコマンドは、イベント パラメータを受け取ります。これは、クリックされたボタン、位置、ウィンドウなどのリストです。Elisp マニュアルの 21.7.4 Click Events を参照してください。

スクロール ホイール イベントを偽装する簡単な例を次に示します。

(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)))
于 2012-06-21T15:39:00.817 に答える
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)))
于 2016-02-07T18:38:47.600 に答える