Я пишу несколько пользовательских функций для перемещения точки определенным образом, и у меня возникают проблемы с правильным управлением меткой и регионом. В целях иллюстрации, вот несколько строк кодов, которые на самом деле мало что делают, они просто привязывают клавишу [home] к пользовательской функции, которая проверяет, активна ли уже метка или нет - если нет, она временно включает временную метку. и ставит отметку. Во всех случаях он вызывает «начало строки», как и следовало ожидать.
(defmacro setq-local (var val)
(list 'set (list 'make-local-variable (list 'quote var)) val))
(defun my-beginning-of-line ()
(interactive)
(message "entering my-beginning-of-line: transient-mark-mode = %s" transient-mark-mode)
; Straight from "handle-shift-selection" in emacs 25.2
(unless (and mark-active (eq (car-safe transient-mark-mode) 'only))
(setq-local transient-mark-mode (cons 'only (unless (eq transient-mark-mode 'lambda) transient-mark-mode)))
(push-mark nil nil t))
(beginning-of-line)
(message "exiting my-beginning-of-line: transient-mark-mode = %s\n" transient-mark-mode))
(global-set-key [home] 'my-beginning-of-line)
Итак, теперь давайте рассмотрим два сценария:
- [home] - любые клавиши перемещения курсора без сдвига - [home]
- [home] - любые сдвинутые клавиши перемещения курсора - [home]
В emacs 24.4 и более поздних версиях все работает так, как я ожидал:
- Первое появление [home] временно включает временную метку (transient-mark-mode = (только. OLDVAL). Затем метка деактивируется любой командой перемещения курсора без сдвига, и режим переходной метки восстанавливается до OLDVAL, как это может быть наблюдается при последующем вызове [home]
- Разница в том, что смещенные клавиши перемещения курсора оставляют метку активной, а переходную метку временно разрешают. При последнем появлении [home] все еще можно заметить, что transient-mark-mode = (только. OLDVAL) при входе в мою пользовательскую функцию
Теперь в emacs 24.3 и более ранних версиях я по-прежнему получаю такое же поведение при отключенном cua-mode. Но когда включен cua-mode, в сценарии №2 происходит то, чего я не понимаю. В этом случае, кажется, есть какое-то взаимодействие, и что-то (CUA?) Деактивирует метку и восстанавливает временный режим метки в OLDVAL. Может ли кто-нибудь объяснить, что происходит, и, возможно, даже лучше, как написать мою пользовательскую функцию, чтобы она имела желаемое поведение при любых обстоятельствах? (emacs 24 или 25, включен режим cua или нет)