Нормальным поведением 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
как если бы терминал не мог различить два.