Mausoperationen mit Tastatur simulieren

8

Gibt es eine Möglichkeit, über einen Befehl, der über die Tastatur aufgerufen werden kann, Emacs glauben zu lassen, dass ich an einem bestimmten Punkt geklickt habe (so dass es alles tut, was es getan hätte, wenn ich dort geklickt hätte, z. B. dem Link folgen oder ein Menü öffnen) )? Oder dass ich mit der Maus über den Punkt schwebte (damit der Tooltip angezeigt wird)?

[Motivation: Einige Modi schmücken den Puffer, verwandeln Text in Links und so weiter. Ich weiß vielleicht, wie man etwas mit der Maus macht (z. B. darauf klicken), aber nicht die entsprechende Tastenkombination / den entsprechenden Befehl zum Aufrufen. Natürlich sollte ich die Dokumentation für den Modus lesen und lernen, dachte aber, dass es eine interessante Frage ist.]

ShreevatsaR
quelle
2
Mich interessiert besonders, ob man mit der Tastatur einen Schwebeflug simulieren kann. Es ist nicht ungewöhnlich, dass ein Tooltip der einfachste Ort ist, um die gesuchten Informationen zu finden.
Nispio
@nispio Sie können eine Vorschau des Tooltips an einem Punkt mit display-local-help
Malabarba
@ Malabarba: Vielen Dank; das scheint zu funktionieren!
ShreevatsaR

Antworten:

5

Das Navigieren zu einem Ort und das Drücken einer Taste hat häufig den gleichen Effekt wie das Klicken auf diesen Ort. Es gibt keinen eingebauten Mechanismus, der dies sicherstellt. Es ist nur so, dass Modi normalerweise so geschrieben werden.

Sie können Mausereignisse generieren ( Klicken , Doppel- / Dreifach- /… Klicken , Drücken nach unten / oben , Ziehen , Bewegen ). Alle Mausereignisse haben die Form, (TYPE POSITION . EXTRA-DATA)in der TYPE ein Symbol ist, das die Maustaste, die Art der Aktion (Klicken, Ziehen usw.) und die Modifikatoren codiert. TYPE ist mouse-movementfür ein Bewegungsereignis. Rufen Sie posn-at-pointauf, um die POSITION für die Position des Punkts im aktuellen Puffer zu generieren.

Hier ist ein Proof-of-Concept-Code, der einen Mausklick auf die Cursorposition simuliert, wenn Sie drücken, f11gefolgt von einer Ziffer. Modifikatoren werden berücksichtigt.

(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)

Das Simulieren des Schwebefluges sieht schwieriger aus.

Gilles 'SO - hör auf böse zu sein'
quelle
1
Dies simuliert keinen Schwebeflug, aber wenn Sie nur einen Tooltip sehen möchten, können Sie den Tooltip mit display-local-help
Malabarba
Ich probiere das immer noch aus, aber als Antwort auf die ersten paar Sätze: Der Grund, warum ich diese Frage gestellt habe, ist, dass ich in einem Modus arbeite, in dem der "einige Schlüssel" nicht klar ist (es ist zufällig C-c C-, RET, aber ich musste dafür die Dokumentation des Modus nachschlagen).
ShreevatsaR
Eigentlich funktioniert das nicht ganz. In dem Modus, in dem ich arbeite, wird ein Teil des Codes in einen Link umgewandelt, und durch Klicken mit der Maus wird an dieser Stelle ein Menü geöffnet. f11 1Wenn Sie das oben Gesagte mit tun, funktioniert das nicht (es druckt etwas im Minibuffer, aber es entspricht nicht einem Mausklick auf den Link), obwohl f11 3dies äquivalent zu <mouse-3>und so weiter zu sein scheint .
ShreevatsaR
@ShreevatsaR Vielleicht ist die gewünschte Mausklick-Aktion gebunden down-mouse-1und nicht mouse-1? Wie kann ich herausfinden, in welcher Keymap ein Schlüssel gebunden ist? kann helfen, dies zu untersuchen.
Gilles 'SO - hör auf böse