Взаимодействие между режимом переходной метки и режимом 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)

Итак, теперь давайте рассмотрим два сценария:

  1. [home] - любые клавиши перемещения курсора без сдвига - [home]
  2. [home] - любые сдвинутые клавиши перемещения курсора - [home]

В emacs 24.4 и более поздних версиях все работает так, как я ожидал:

  1. Первое появление [home] временно включает временную метку (transient-mark-mode = (только. OLDVAL). Затем метка деактивируется любой командой перемещения курсора без сдвига, и режим переходной метки восстанавливается до OLDVAL, как это может быть наблюдается при последующем вызове [home]
  2. Разница в том, что смещенные клавиши перемещения курсора оставляют метку активной, а переходную метку временно разрешают. При последнем появлении [home] все еще можно заметить, что transient-mark-mode = (только. OLDVAL) при входе в мою пользовательскую функцию

Теперь в emacs 24.3 и более ранних версиях я по-прежнему получаю такое же поведение при отключенном cua-mode. Но когда включен cua-mode, в сценарии №2 происходит то, чего я не понимаю. В этом случае, кажется, есть какое-то взаимодействие, и что-то (CUA?) Деактивирует метку и восстанавливает временный режим метки в OLDVAL. Может ли кто-нибудь объяснить, что происходит, и, возможно, даже лучше, как написать мою пользовательскую функцию, чтобы она имела желаемое поведение при любых обстоятельствах? (emacs 24 или 25, включен режим cua или нет)


person DaveC    schedule 31.08.2017    source источник


Ответы (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, похоже, не является жизнеспособным вариантом, поскольку обычный shift-selection (без участия моего custom [home] вообще) в этом случае полностью провален .

Хотя я смутно понимаю, почему что-то не работает, мне все еще совершенно неясно, как писать собственные функции в моих .emacs, которые могут работать с версиями 24.3, а также 24.4

person DaveC    schedule 01.09.2017