Muitas vezes, navegar para um local e pressionar alguma tecla terá o mesmo efeito que clicar nesse local. Não existe um mecanismo interno que garanta isso, é apenas que os modos geralmente são escritos dessa maneira.
Você pode gerar eventos de mouse ( clique , duplo / triplo /… clique , botão para baixo / para cima , arraste , movimento ). Todos os eventos do mouse têm a forma em (TYPE POSITION . EXTRA-DATA)
que TYPE é um símbolo que codifica o botão do mouse, a natureza da ação (clique, arraste etc.) e os modificadores. TYPE é mouse-movement
para um evento de movimento. Chame posn-at-point
para gerar a POSITION para a localização do ponto no buffer atual.
Aqui está um código de prova de conceito que simula um clique do mouse na posição do cursor quando você pressiona f11
seguido de um dígito. Modificadores são levados em consideração.
(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)
Simular a pairar parece mais difícil.