Simulando operaciones del mouse con el teclado

8

¿Hay alguna manera, a través de algún comando que pueda ser invocado por el teclado, de hacer que Emacs piense que hice clic en un punto en particular (para que haga lo que hubiera hecho si hubiera hecho clic allí, por ejemplo, seguir enlace o abrir un menú) )? ¿O que coloqué el mouse en el punto (para que aparezca la información sobre herramientas)?

[Motivación: algunos modos decoran el búfer, convirtiendo parte del texto en enlaces, etc. Puedo saber cómo hacer algo con el mouse (por ejemplo, hacer clic en él), pero no el atajo de teclado / comando equivalente para invocar. Por supuesto, debería leer la documentación para el modo y aprenderla, pero pensé que es una pregunta interesante.]

ShreevatsaR
fuente
2
Estoy especialmente interesado en si puedes simular un desplazamiento con el teclado. No es raro que una información sobre herramientas sea el lugar más fácil para encontrar la información que estoy buscando.
nispio
@nispio puede obtener una vista previa de la información sobre herramientas en el punto con display-local-help
Malabarba
@Malabarba: Muchas gracias; eso parece funcionar!
ShreevatsaR

Respuestas:

5

A menudo, navegar a una ubicación y presionar alguna tecla tendrá el mismo efecto que hacer clic en esa ubicación. No hay un mecanismo incorporado que garantice esto, es solo que los modos generalmente se escriben de esa manera.

Puede generar eventos del mouse ( clic , doble / triple / ... clic , botón abajo / arriba , arrastrar , movimiento ). Todos los eventos del mouse tienen la forma (TYPE POSITION . EXTRA-DATA)en que TYPE es un símbolo que codifica el botón del mouse, la naturaleza de la acción (hacer clic, arrastrar, etc.) y los modificadores. TYPE es mouse-movementpara un evento de movimiento. Llame posn-at-pointpara generar la POSICIÓN para la ubicación del punto en el búfer actual.

Aquí hay un código de prueba de concepto que simula un clic del mouse en la posición del cursor cuando presiona f11seguido de un dígito. Los modificadores se tienen en cuenta.

(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 hover parece más difícil.

Gilles 'SO- deja de ser malvado'
fuente
1
Esto no simula el desplazamiento, pero si todo lo que desea es ver una información sobre herramientas, puede obtener una vista previa de la información sobre herramientas en el punto con display-local-help
Malabarba
Todavía estoy probando esto, pero en respuesta a las primeras dos oraciones: la razón por la que hice esta pregunta es porque estoy trabajando en un modo en el que "alguna clave" no está clara (resulta ser C-c C-, RET, pero yo tuvo que buscar la documentación del modo para eso).
ShreevatsaR
En realidad esto no funciona del todo. En el modo en el que estoy trabajando, algún fragmento de código se convierte en un enlace, y al hacer clic con el mouse se abre un menú en ese punto. Hacer lo anterior con f11 1no lo hace (imprime algo en el minibúfer, pero no es el equivalente a un clic del mouse en el enlace), aunque f11 3parece ser equivalente a <mouse-3>y así sucesivamente.
ShreevatsaR
@ShreevatsaR ¿Quizás la acción de clic del mouse que deseas está vinculada down-mouse-1y no mouse-1? ¿Cómo puedo saber en qué mapa de teclas está vinculada una tecla? puede ayudar a investigar esto.
Gilles 'SO- deja de ser malvado'