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-fdie 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-fdie Sie sich entschieden haben , gelten auch für alle anderen Navigationsbefehle, die Sie ebenfalls verwenden.
C-fnach M-lnicht dem Bereich erstrecken , weil es keinen aktiver Bereich am Ende ist M-l(die gebunden ist downcase-wordStandard).
M-lvom OP genannte nicht die Standardbindung ( downcase-word) ist, sondern die benutzerdefinierte Bindung vonmy-mark-current-line
C-S-fist analog zuC-SPC(Aktivieren einer Region) +C-f(Navigation). Sie können wahrscheinlich das bekommen, was Sie wollen, indem SieC-fan 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-fdirekt binden anforward-char. Beachten Sie, dass , wenn Sie jemals Emacs im Terminal - Modus verwenden,C-fundC-S-fwerden beide verhalten sich wieC-fwie das Terminal zwischen den beiden nicht unterscheiden.