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-f
die Sie sich entschieden haben , gelten auch für alle anderen Navigationsbefehle, die Sie ebenfalls verwenden.
C-f
nach M-l
nicht dem Bereich erstrecken , weil es keinen aktiver Bereich am Ende ist M-l
(die gebunden ist downcase-word
Standard).
M-l
vom OP genannte nicht die Standardbindung ( downcase-word
) ist, sondern die benutzerdefinierte Bindung vonmy-mark-current-line
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.