Das normale Verhalten von Emacs, wenn der Transient-Mark-Modus aktiv ist, besteht darin, dass bei einer Shift-Auswahl die Markierung deaktiviert wird, wenn der nächste Befehl eine Nicht-Shift-Bewegung ist. Zum Beispiel wird nach den Befehlen M-l
(um die aktuelle Zeile mit der folgenden Funktion zu markieren) und C-f
die Markierung deaktiviert. Wie kann man dieses Verhalten von elisp nach emulieren (set-mark-command nil)
?
Beispielsweise:
(defun my-mark-current-line ()
(interactive)
(beginning-of-line)
(set-mark-command nil)
(end-of-line)
(forward-char))
(global-set-key (kbd "M-l") 'my-mark-current-line)
Jetzt wird Ml Cf und die Region wachsen, aber stattdessen möchte ich das Standardverhalten, dh die Region wird deaktiviert, wenn Cf, und mit CSf wachsen.
BEARBEITEN : Sollte eine andere Funktion als der Befehl set-mark-verwendet werden, die dies ermöglicht? Ich konnte keine finden.
C-S-f
ist analog zuC-SPC
(Aktivieren einer Region) +C-f
(Navigation). Sie können wahrscheinlich das bekommen, was Sie wollen, indem SieC-f
an eine Wrapper-Funktion binden , die zuerst eine Region deaktiviert, wenn sie aktiv ist, und dann fortfährt, was zu tunC-f
(forward-char
); undC-S-f
direkt binden anforward-char
. Beachten Sie, dass , wenn Sie jemals Emacs im Terminal - Modus verwenden,C-f
undC-S-f
werden beide verhalten sich wieC-f
wie das Terminal zwischen den beiden nicht unterscheiden.C-f
die Sie sich entschieden haben , gelten auch für alle anderen Navigationsbefehle, die Sie ebenfalls verwenden.C-f
nachM-l
nicht dem Bereich erstrecken , weil es keinen aktiver Bereich am Ende istM-l
(die gebunden istdowncase-word
Standard).M-l
vom OP genannte nicht die Standardbindung (downcase-word
) ist, sondern die benutzerdefinierte Bindung vonmy-mark-current-line
Antworten:
Da die Schichtübersetzung und die vorübergehende Aktivierung der Marke von der Befehlsschleife übernommen werden, müssen Sie die interaktiven Versionen der Bewegungsfunktionen aufrufen, um das entsprechende Schichtauswahlverhalten von ihnen zu erhalten:
Aktualisieren:
Seit ich die obige Antwort geschrieben habe, habe ich mir die Zeit genommen, etwas mehr darüber zu lernen, wie die Schichtauswahl wirklich unter der Haube funktioniert. Es setzt den Symbolwert
transient-mark-mode
als Konsolenzelle des Formulars(only . OLDVAL)
, wobeiOLDVAL
der Wert vor der Schichtauswahl ist.Die folgende Lösung vermeidet die Verwendung von,
call-interactively
indem die Markierung nach Bedarf aktiviert und der entsprechende Wert von eingestellt wirdtransient-mark-mode
. Grundsätzlich halte ich diese Lösung für weniger hackig als die erste.Als Bonus hat es jetzt eine optionale Wiederholungszahl und erweitert die aktuelle Auswahl in beide Richtungen, wenn die Markierung bereits aktiv ist.
quelle