【问题标题】:Interaction between transient-mark-mode and cua-mode?瞬态标记模式和cua模式之间的交互?
【发布时间】:2018-02-09 16:02:11
【问题描述】:

我正在编写一些自定义函数来以特定方式移动点,但我遇到了正确管理标记和区域的问题。 出于说明目的,这里有几行代码实际上并没有多大作用,它们只是将 [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] 会暂时启用瞬态标记(瞬态标记模式 =(仅 .OLDVAL)。然后,任何未移​​动的光标移动命令都会停用标记,瞬态标记模式会恢复为 OLDVAL在随后的 [home] 调用中可以观察到
  2. 不同之处在于移动的光标移动键使标记保持活动状态,而瞬态标记暂时启用。在最后一次出现 [home] 时,在进入我的自定义函数时仍然可以观察到 transient-mark-mode = (only .OLDVAL)

现在,在 emacs 24.3 和更早的版本中,当 cua-mode 被禁用时,我仍然会得到相同的行为。 但是当启用 cua-mode 时,在场景 #2 中会发生一些我不明白的事情。在这种情况下,似乎存在一些交互,并且某些东西(CUA ?)会停用标记并将瞬态标记模式恢复为 OLDVAL。谁能解释发生了什么,甚至可能更好,如何编写我的自定义函数,以便它在所有情况下都具有所需的行为? (emacs 24 或 25,是否启用 cua 模式)

【问题讨论】:

    标签: emacs dot-emacs cua-mode


    【解决方案1】:

    我相信我已经有了答案。 显然有两个问题。

    第一个与 emacs 24.3 及更早版本中 cua--post-command-handler-1 的实现有关,其中包含以下内容:

      ;; 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 和更早版本中)。 不过,在启用 cua-mode 后手动强制 'shift-select-mode' 到 t 似乎不是一个可行的选择,因为在这种情况下,通常的 shift-selection(根本不涉及我的自定义 [home])完全搞砸了.

    虽然我可以模糊地理解为什么事情不起作用,但我仍然完全不清楚如何在我的 .emacs 中编写可以与 24.3 和 24.4 版本一起使用的自定义函数

    【讨论】:

      猜你喜欢
      • 2010-10-28
      • 2021-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-27
      相关资源
      最近更新 更多