Нормальным поведением 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-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
как если бы терминал не мог различить два.C-f
будут применяться ко всем другим командам навигации, которые вы используете.C-f
послеM-l
не расширяет регион, потому что нет активного региона в концеM-l
(который связанdowncase-word
по умолчанию).M-l
указанная OP является не привязкой по умолчанию (downcase-word
), а пользовательской привязкойmy-mark-current-line
Ответы:
Поскольку преобразование смены и временная активация метки обрабатываются командным циклом, вам потребуется вызывать интерактивные версии функций перемещения, чтобы получить от них соответствующее поведение выбора смены:
Обновить:
С тех пор как я написал ответ выше, я потратил немного времени на то, чтобы узнать, как на самом деле работает выбор смены. Это устанавливает значение символа,
transient-mark-mode
чтобы быть cons-ячейкой формы(only . OLDVAL)
, гдеOLDVAL
является значением до выбора сдвига.Приведенное ниже решение позволяет избежать использования
call-interactively
, активируя метку по мере необходимости и устанавливая соответствующее значениеtransient-mark-mode
. По сути, я считаю, что это решение менее опасно, чем первое.В качестве бонуса теперь он имеет дополнительный счетчик повторов и расширит текущий выбор в любом направлении, если отметка уже активна.
источник