2012-06-20 5 views
5

В SLIME есть две очень полезные функции: slime-copy-or-inspect-presentation-at-mouse и slime-presentation-menu. Но они должны быть вызваны с аргументом события. Для того, чтобы генерировать даже мне нужно было бы много логистики (вычисление области, занятой печатным представлением объекта, на который указывает «мышь», строки и столбцы - то, что я действительно не хочу делать потому что, конечно, в Emacs есть что-то, что уже вычисляет все это.Как сгенерировать событие мыши программно?

Итак, есть ли простой способ генерировать «фальшивое» событие мыши? Потому что использование мыши только для двух вещей в редакторе, который в противном случае не требует мыши . чувствует себя ... ну, не очень умный :)

EDIT

Вот что я пробовал:

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

Команды

ответ

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

Я вообще не знакомы со слизью, но, взглянув на источник, он выглядит как функции, которые вы упомяните вызов slime-presentation-around-click, который, в свою очередь, вызывает slime-presentation-around-point. Кажется, что он переводит щелчок в точку, поэтому вы должны иметь возможность писать аналогичные функции, которые напрямую используют slime-presentation-around-point. Я смотрю на слизь-20100722 от Ubuntu. – jpkotta

+0

'posn-at-point'. Почти все это, думаю. Интересно, доступно ли это только в недавних emacs? –

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))) 
Смежные вопросы