Normalne zachowanie Emacsa, gdy aktywny jest tryb znaku przejściowego, polega na tym, że po dokonaniu wyboru shift, znak jest nieaktywny, jeśli następne polecenie jest ruchem bez zmiany. Na przykład po poleceniach M-l
(aby zaznaczyć bieżącą linię za pomocą funkcji poniżej) i C-f
znak jest wyłączony. Jak naśladować to zachowanie z elisp po (set-mark-command nil)
?
Na przykład:
(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)
Teraz wykonaj Ml Cf, a region będzie się rozwijał, ale zamiast tego chcę, aby zachowanie domyślne, tj. Region dezaktywował się, gdy Cf, i rozwijał się wraz z CSf.
EDYCJA : czy należy użyć funkcji innej niż set-mark-command, która na to pozwala? Nie mogłem znaleźć.
C-f
, dotyczyłoby również wszystkich innych poleceń nawigacyjnych, których używasz.
C-f
after M-l
nie rozszerza regionu, ponieważ na końcu nie ma aktywnego regionu M-l
(który jest downcase-word
domyślnie związany).
M-l
przywołane przez OP nie jest domyślnym powiązaniem ( downcase-word
), ale niestandardowym wiązaniemmy-mark-current-line
C-S-f
jest analogiczne doC-SPC
(aktywowanie regionu) +C-f
(nawigacja). Prawdopodobnie możesz uzyskać to, co chcesz, łączącC-f
się z funkcją otoki, która najpierw dezaktywuje region, jeśli jest aktywny, a następnie przechodzi do robienia tego coC-f
robi (forward-char
); i wiążą sięC-S-f
bezpośrednio zforward-char
. Zauważ, że jeśli kiedykolwiek użyjesz emacsa w trybie terminalaC-f
iC-S-f
oba będą się zachowywać, ponieważC-f
terminal nie może ich rozróżnić.