Нормальным поведением Emacs, когда активен режим переходных меток, является то, что когда вы делаете выбор смещением, то, если следующая команда является движением без смещения, метка деактивируется. Например, после команд M-l(чтобы отметить текущую строку с помощью функции ниже) и C-f, метка деактивируется. Как подражать этому поведению из elisp после (set-mark-command nil)?
Например:
(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)
Теперь сделайте Ml Cf и регион будет расти, но вместо этого я хочу поведение по умолчанию, то есть регион будет деактивироваться при Cf, и расти с CSf.
РЕДАКТИРОВАТЬ : следует использовать функцию, отличную от команды set-mark-command, которая позволяет это? Я не мог найти ни одного.
C-fбудут применяться ко всем другим командам навигации, которые вы используете.
C-fпосле M-lне расширяет регион, потому что нет активного региона в конце M-l(который связан downcase-wordпо умолчанию).
M-lуказанная OP является не привязкой по умолчанию ( downcase-word), а пользовательской привязкойmy-mark-current-line
C-S-fаналогичноC-SPC(активация региона) +C-f(навигация). Вы, вероятно, можете получить то, что хотите, связавшисьC-fс функцией-оболочкой, которая сначала деактивирует область, если она активна, а затем переходит к тому, чтоC-fделает (forward-char); и привязатьC-S-fнепосредственно кforward-char. Обратите внимание, что если вы когда-либо будете использовать emacs в режиме терминала,C-fиC-S-fоба будут вести себя так,C-fкак если бы терминал не мог различить два.