Simuler les opérations de la souris avec le clavier

8

Existe-t-il un moyen, via une commande qui peut être invoquée par le clavier, de faire croire à Emacs que j'ai cliqué à un point particulier (pour qu'il fasse ce qu'il aurait fait si j'avais cliqué là-bas, par exemple suivre le lien ou faire apparaître un menu )? Ou que j'ai survolé la souris au point (pour que l'infobulle apparaisse)?

[Motivation: certains modes décorent le tampon, transformant du texte en liens, etc. Je sais peut-être comment faire quelque chose avec la souris (par exemple, cliquez dessus), mais pas le raccourci clavier / la commande équivalente à invoquer. Bien sûr, je devrais lire la documentation du mode et l'apprendre, mais j'ai pensé que c'était une question intéressante.]

ShreevatsaR
la source
2
Je suis particulièrement intéressé à savoir si vous pouvez simuler un survol avec le clavier. Il n'est pas rare qu'une infobulle soit l'endroit le plus facile pour trouver les informations que je recherche.
nispio
@nispio vous pouvez prévisualiser l'info-bulle au point avec display-local-help
Malabarba
@Malabarba: Merci beaucoup; cela semble fonctionner!
ShreevatsaR

Réponses:

5

Souvent, naviguer vers un emplacement et appuyer sur une touche aura le même effet que de cliquer sur cet emplacement. Il n'y a pas de mécanisme intégré qui assure cela, c'est juste que les modes sont généralement écrits de cette façon.

Vous pouvez générer des événements de souris ( clic , double / triple /… clic , bouton bas / haut , glisser , mouvement ). Tous les événements de souris ont la forme (TYPE POSITION . EXTRA-DATA)où TYPE est un symbole qui code le bouton de la souris, la nature de l'action (clic, glisser, etc.) et les modificateurs. TYPE est mouse-movementpour un événement de mouvement. Appelez posn-at-pointpour générer la POSITION pour l'emplacement du point dans le tampon actuel.

Voici un code de preuve de concept qui simule un clic de souris à la position du curseur lorsque vous appuyez, f11suivi d'un chiffre. Les modificateurs sont pris en compte.

(defun make-mouse-event-at-point (base-event)
  (let ((posn (posn-at-point))
        (prefix "")
        (basic-type (event-basic-type base-event))
        (modifiers (event-modifiers base-event)))
    (cond
     ((and (integerp basic-type) (>= basic-type ?0) (<= basic-type ?9))
      ;; click
      (let* ((mouse-type (intern (format "%smouse-%d" prefix (- basic-type ?0))))
             (click-count 1)
             (type (event-convert-list (append modifiers (list mouse-type)))))
        (list type posn click-count)))
     (t
      (error "Unsupported key for mouse event: %s" (event-basic-type base-event))))))
(defun simulate-mouse-event-at-point ()
  (interactive)
  (let ((event (make-mouse-event-at-point last-input-event)))
    (setq unread-command-events (cons event unread-command-events))))

(defvar simulate-mouse-event-map (make-sparse-keymap))
(global-set-key [f11] simulate-mouse-event-map)
(define-key simulate-mouse-event-map [t] 'simulate-mouse-event-at-point)

La simulation du vol stationnaire semble plus difficile.

Gilles 'SO- arrête d'être méchant'
la source
1
Cela ne simule pas le survol, mais si tout ce que vous voulez c'est voir une info-bulle, vous pouvez prévisualiser l'info-bulle au point avec display-local-help
Malabarba
J'essaie toujours de le faire, mais en réponse aux deux premières phrases: la raison pour laquelle j'ai posé cette question est que je travaille dans un mode où la "clé" n'est pas claire (il se trouve que c'est le cas C-c C-, RET, mais je a dû consulter la documentation du mode pour cela).
ShreevatsaR
En fait, cela ne fonctionne pas vraiment. Dans le mode dans lequel je travaille, un morceau de code est transformé en lien, et cliquer avec la souris ouvre un menu à ce point. Faire ce qui précède avec f11 1ne fait pas cela (il imprime quelque chose dans le mini-tampon mais ce n'est pas l'équivalent d'un clic de souris sur le lien) mais f11 3semble être équivalent à <mouse-3>et ainsi de suite.
ShreevatsaR
@ShreevatsaR Peut-être que l'action de clic de souris que vous souhaitez est liée down-mouse-1ou non mouse-1? Comment savoir dans quelle mappe de clé une clé est liée? peut aider à enquêter sur cela.
Gilles 'SO- arrête d'être méchant'