Simulazione delle operazioni del mouse con la tastiera


8

Esiste un modo, tramite alcuni comandi che possono essere invocati dalla tastiera, di far pensare ad Emacs che ho fatto clic in un determinato punto (in modo che faccia tutto ciò che avrebbe fatto se avessi fatto clic lì, ad esempio segui il collegamento o apri un menu )? O che ho spostato il mouse in corrispondenza del punto (in modo che la descrizione si apra)?

[Motivazione: alcune modalità decorano il buffer, trasformando del testo in collegamenti e così via. Potrei sapere come fare qualcosa con il mouse (ad es. Fare clic su di esso), ma non la scorciatoia / comando equivalente da richiamare. Ovviamente dovrei leggere la documentazione per la modalità e impararla, ma ho pensato che fosse una domanda interessante.]


2
Sono particolarmente interessato a simulare un passaggio con la tastiera. Non è raro che un suggerimento sia il posto più semplice per trovare le informazioni che sto cercando.
nispio,

@nispio puoi visualizzare l'anteprima della descrizione comandi al punto con display-local-help
Malabarba

@Malabarba: Mille Grazie; sembra funzionare!
ShreevatsaR,

Risposte:


5

Spesso, spostarsi in una posizione e premere un tasto avrà lo stesso effetto del clic in quella posizione. Non esiste un meccanismo integrato che garantisca questo, è solo che le modalità sono in genere scritte in quel modo.

È possibile generare eventi del mouse ( clic , doppio / triplo / ... clic , pulsante giù / su , trascinamento , movimento ). Tutti gli eventi del mouse hanno la forma in (TYPE POSITION . EXTRA-DATA)cui TYPE è un simbolo che codifica il pulsante del mouse, la natura dell'azione (clic, trascinamento, ecc.) E i modificatori. TYPE è mouse-movementper un evento di movimento. Chiama posn-at-pointper generare la POSIZIONE per la posizione del punto nel buffer corrente.

Ecco un codice di prova che simula un clic del mouse nella posizione del cursore quando si preme f11seguito da una cifra. I modificatori sono presi in considerazione.

(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 simulazione dell'hover sembra più difficile.


1
Questo non simula il passaggio del mouse, ma se tutto ciò che vuoi è vedere un suggerimento, puoi visualizzare l'anteprima del suggerimento sul punto con display-local-help
Malabarba

Sto ancora provando questo, ma in risposta alla prima coppia di frasi: il motivo per cui ho posto questa domanda è che sto lavorando in una modalità in cui la "qualche chiave" non è chiara (capita di esserlo C-c C-, RET, ma io ho dovuto cercare la documentazione della modalità per quello).
ShreevatsaR,

In realtà questo non funziona del tutto. Nella modalità in cui sto lavorando, un pezzo di codice viene trasformato in un collegamento e facendo clic con il mouse si apre un menu nel punto. Fare quanto sopra con f11 1non lo fa (stampa qualcosa nel minibuffer ma non è l'equivalente di un clic del mouse sul collegamento) anche f11 3se sembra essere equivalente <mouse-3>e così via.
ShreevatsaR

@ShreevatsaR Forse l'azione del clic del mouse che vuoi è legata down-mouse-1e no mouse-1? Come posso sapere in quale keymap è associata una chiave? può aiutare a indagare su questo.
Gilles 'SO- smetti di essere malvagio' il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.