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-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ć.C-f
, dotyczyłoby również wszystkich innych poleceń nawigacyjnych, których używasz.C-f
afterM-l
nie rozszerza regionu, ponieważ na końcu nie ma aktywnego regionuM-l
(który jestdowncase-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
Odpowiedzi:
Ponieważ translacja shift i tymczasowa aktywacja znaku są obsługiwane przez pętlę poleceń, będziesz musiał wywołać interaktywne wersje funkcji ruchu, aby uzyskać od nich odpowiednie zachowanie wyboru zmiany:
Aktualizacja:
Od czasu napisania powyższej odpowiedzi poświęciłem trochę czasu, aby dowiedzieć się więcej o tym, jak wybór zmiany biegów naprawdę działa pod maską. Ustawia wartość symbolu,
transient-mark-mode
która ma być komórką przeciwną formularza(only . OLDVAL)
, gdzieOLDVAL
jest wartością przed wyborem przesunięcia.Poniższe rozwiązanie pozwala uniknąć użycia
call-interactively
aktywując znak w razie potrzeby i ustawiając odpowiednią wartośćtransient-mark-mode
. Zasadniczo uważam to rozwiązanie za mniej hackowe niż pierwsze.Jako bonus ma teraz opcjonalną liczbę powtórzeń i rozszerzy bieżący wybór w obu kierunkach, jeśli znak jest już aktywny.
źródło