Взаимодействие между режимом переходных меток и режимом cua?
Я пишу несколько пользовательских функций для перемещения точки особым образом, и я сталкиваюсь с проблемами для правильного управления маркой и регионом. В целях иллюстрации, вот несколько строк кода, которые на самом деле ничего не делают, они просто привязывают клавишу [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] все еще можно наблюдать, что transient-mark-mode = (only . OLDVAL) при входе в мою пользовательскую функцию
Теперь, в emacs 24.3 и более ранних версиях, я все еще получаю то же поведение, когда отключен режим cua. Но когда включен режим cua, то, что я не понимаю, происходит в сценарии № 2. В этом случае, кажется, есть некоторое взаимодействие, и что-то (CUA?) Деактивирует марку и восстанавливает режим переходной метки в OLDVAL. Может кто-нибудь объяснить, что происходит, и, возможно, даже лучше, как написать мою пользовательскую функцию, чтобы она имела желаемое поведение при любых обстоятельствах? (emacs 24 или 25, режим cua включен или нет)
1 ответ
Я считаю, что у меня есть начало ответа. Есть две проблемы, по-видимому.
Первый связан с реализацией cua -post-command-handler-1 в emacs 24.3 и более ранних версиях, который содержит это:
;; Disable transient-mark-mode if rectangle active in current buffer.
(if (not (window-minibuffer-p (selected-window)))
(setq transient-mark-mode (and (not cua--rectangle)
(if cua-highlight-region-shift-only
(not cua--explicit-region-start)
t))))
Вторая проблема является общей для "cua-mode": когда она включена, кажется, она меняет "shift-select-mode" на "nil" (в emacs 24.3 и более ранних версиях). Ручное принудительное переключение 'shift-select-mode' к t после включения cua-mode, по-видимому, не является жизнеспособным вариантом, так как обычный сдвиг-выбор (без моего пользовательского [home] вообще) вообще облажался в этом случае,
Хотя я смутно понимаю, почему что-то не работает, мне все еще совершенно непонятно, как писать собственные функции в моих.emacs, которые могут работать как с версиями 24.3, так и с 24.4.