Was ist die Auswahlwort- / Symbolfunktion, die an <double-mouse-1> gebunden ist?

11

Ich liebe die Möglichkeit, Wort / Symbol an einem Punkt auszuwählen, den ich derzeit mit einem Doppelmausklick mache. Ich möchte es über die Tastatur tun können, und deshalb möchte ich es an einen Tastenanschlag binden (oder ist es vielleicht schon?), Also brauche ich den Namen der Funktion. Ich gehe davon aus, dass die Funktion bereits vorhanden sein muss, kann aber nicht herausfinden, wie sie heißt.

Ich habe es versucht, C-h kaber dann, wenn ich mit der Maus doppelklicke, wird die Hilfe für <down-mouse-1>angezeigt (ich gehe davon aus, dass das Hilfesystem nicht auf den zweiten Klick wartet oder so). Ich habe auch die Dokumentation durchsucht, in der diese Funktionalität in Abschnitt 21.2 definiert ist, aber sie enthält nicht den Namen der Funktion.

Update: Für typische Keybinding Ich nehme an, es ist das Äquivalent zu , <C-left>gefolgt von <C-S-right>denen sind left-wordund right-wordjeweils obwohl die Shift - Taste für den letzteren gehalten wird. (Ich verstehe die Beziehung zwischen Tastaturbezeichnungen mit der Umschalttaste und deren Zuordnung zu Funktionen nicht vollständig. Die Hilfe für die <C-S-right>Übersetzung in, <C-right>bevor sie identifiziert wird als right-word)

Chip Grandits
quelle
Das Verwenden C-h bund Durchsuchen dieses Puffers zeigt, dass <double-mouse-1>Aufrufe mouse-set-point(von "mouse.el") mit einem bestimmten Ereignis erfolgen. Ich
bin
1
Für die Beziehung zwischen der verschobenen und der nicht verschobenen Version von C-rechts und C-links ist es der Effekt von shift-selection-mode(siehe (info "(emacs) Shift Selection")). Siehe auch emacs.stackexchange.com/questions/12858/…
YoungFrog
@YoungFrog Diese Art von Komplikation ist es, die die meisten meiner Emacs oft als Tastaturmakros programmiert. Ein einfaches kbd-Makro, das auf basiert, <right> <C-left> <C-S-right>bedeutet, dass ich subtile Probleme, die in diesem Link ausführlich behandelt werden, nicht vollständig ansprechen muss.
Chip Grandits

Antworten:

9

Es ist eigentlich ein bisschen kompliziert. Wenn Sie doppelklicken, mouse-1gibt es mehrere Aktionen. <down-mouse-1>tritt zuerst auf, wenn Sie die Taste drücken. Tritt dann mouse-1auf, wenn Sie die Taste loslassen.

<down-mouse-1>ist an den Befehl gebunden mouse-drag-region, und dieser Befehl ruft auf mouse-drag-track. Diese Funktion zählt die Mausklicks und verfolgt jede Mausbewegung (wenn Sie doppelklicken, bedeutet dies, dass Sie die Maus nicht bewegt haben).

mouse-drag-trackruft die Funktion mouse-start-end auf, um den zu wählenden Textbereich zu bestimmen. Es wird an mouse-start-enddie Position übergeben, auf die Sie geklickt haben, die ersten beiden Argumente und die Anzahl der Klicks als drittes Argument. Dies ist mouse-start-end:

mouse-start-end is a compiled Lisp function in `mouse.el'.

(mouse-start-end START END MODE)

Return a list of region bounds based on START and END according to MODE.
If MODE is 0 then set point to (min START END), mark to (max START END).
If MODE is 1 then set point to start of word at (min START END),
mark to end of word at (max START END).
If MODE is 2 then do the same for lines.

Die als drittes arg ( MODE) übergebene Klickzahl ist 1 für einen Doppelklick.

Sie können nicht nur einen Teil dieses Codes über eine Tastaturtastenfolge aufrufen, aber wenn Sie den Code untersuchen, können Sie möglicherweise einen Befehl zum Binden der Tastaturtaste schreiben, um das zu tun, was Sie möchten.

Drew
quelle
Vielen Dank für die Erklärung, warum C-h k dies bei Mausereignissen nicht funktioniert. Der beste Weg, um herauszufinden, wie Emacs "mit der Maus umgeht", besteht darin, sie als Tastaturmakro aufzuzeichnen, zu benennen und dann den von insert-kbd-macro Generell generierten Code zu betrachten. Ich würde nicht versuchen, ein Mausereignis in einem zu verwenden Makro, daher sind diese temporären Makros nur nützlich, um zu sehen, was Emacs tut.
Chip Grandits
6

@Drew hat einige der Komplexitäten erklärt, die mit Ereignissen verbunden sind, die an Mausaktionen gebunden sind. Was Ihr letztendliches Ziel betrifft, das Wort an einer bestimmten Stelle mit der Tastatur zu markieren, könnte Sie die Erweiterungsregion interessieren .

expand-regionMit dieser Option können Sie die Region nach semantischen Einheiten bearbeiten. Wenn beispielsweise keine Region aktiv ist, markiert ein Aufruf er/expand-region(normalerweise gebunden an C-=) das aktuelle Wort. Durch erneutes Aufrufen wird die Region auf den aktuellen Satz erweitert. Und dann der Absatz, der Abschnitt usw. Die tatsächlichen Einheiten hängen von dem Modus ab, in dem Sie sich befinden. In den Lisp-Modi sind dies also Symbol, Ausdruck, der das Symbol einschließt, Ausdruck, der diesen Ausdruck einschließt usw.

Die verlinkte Seite enthält weitere Erklärungen und ein Video, das dies demonstriert.

Tyler
quelle
1
Ja, ich sehe das Paket expand-region in der Paketliste von melpa. Sehr nützlich, ich bin überrascht, dass es in Emacs nicht Standard ist oder zumindest in CEDET gebündelt ist. Danke für den Tipp!
Chip Grandits
Chip Grandits: Dies hängt davon ab, ob die Autoren ihr Paket mit der entsprechenden Urheberrechtszuweisung an die FSF senden. Es kann kein Standardteil von Emacs sein, wenn die Autoren es nicht eingereicht haben.
Phils
2

Hier ist eine Funktion, die ich extrahiert mouse-set-regionhabe und die beim Doppelklicken die Markierung übernimmt:

(defun ora-mark-like-double-mouse-1 ()
  (interactive)
  (let ((bnd (mouse-start-end (point) (point) 1)))
    (goto-char (car bnd))
    (push-mark)
    (set-mark (point))
    (goto-char (cadr bnd))))
abo-abo
quelle