Simulando operações do mouse com o teclado

8

Existe alguma maneira, através de algum comando que possa ser invocado pelo teclado, de fazer o Emacs pensar que eu cliquei em um ponto específico (para que ele faça o que faria se eu clicasse lá, por exemplo, siga o link ou abra um menu )? Ou que passei o mouse no ponto (para que a dica da ferramenta seja exibida)?

[Motivação: alguns modos decoram o buffer, transformando algum texto em links e assim por diante. Talvez eu saiba como fazer algo com o mouse (por exemplo, clique nele), mas não o atalho / comando de teclado equivalente a ser chamado. É claro que eu deveria ler a documentação do modo e aprendê-lo, mas achei uma pergunta interessante.]

ShreevatsaR
fonte
2
Estou especialmente interessado em saber se você pode simular um foco com o teclado. Não é incomum que uma dica de ferramenta seja o local mais fácil para encontrar as informações que estou procurando.
Nispio
@nispio você pode visualizar a dica de ferramenta no ponto com visualização-local-ajuda
Malabarba
@ Malabarba: Muito obrigado; isso parece funcionar!
ShreevatsaR

Respostas:

5

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-movementpara um evento de movimento. Chame posn-at-pointpara 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 f11seguido 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.

Gilles 'SO- parar de ser mau'
fonte
1
Isso não simular pairar, mas se tudo que você quer é ver uma dica de ferramenta, você pode visualizar a dica de ferramenta no ponto com visualização-local-ajuda
Malabarba
Ainda estou tentando fazer isso, mas em resposta às duas primeiras frases: o motivo pelo qual fiz essa pergunta é que estou trabalhando em um modo em que a "chave" não é clara (acontece que C-c C-, RETsim, mas eu teve que procurar a documentação do modo para isso).
ShreevatsaR
Na verdade, isso não funciona muito bem. No modo em que estou trabalhando, um pedaço de código é transformado em um link, e clicar com o mouse abre um menu no momento. O procedimento acima f11 1não faz isso (ele imprime algo no minibuffer, mas não é o equivalente a um clique do mouse no link), embora f11 3pareça equivalente <mouse-3>e assim por diante.
ShreevatsaR
@ShreevatsaR Talvez a ação de clicar do mouse que você deseja esteja vinculada down-mouse-1e não mouse-1? Como posso descobrir em qual mapa de teclas uma chave está vinculada? pode ajudar a investigar isso.
Gilles 'SO- stop be evil'