6

无论是否启用了瞬态标记模式,“标记处于活动状态”是否与 Emacs 中的“区域处于活动状态”的含义相同?所以激活标记和激活区域是一样的吗?

我很困惑,因为这两个短语似乎在许多地方可以互换使用,而 region-active-p 的定义似乎采取的立场是,当且仅当启用瞬态标记模式并且标记处于活动状态时,区域才被认为是活动的。

(defun region-active-p ()
  "Return t if Transient Mark mode is enabled and the mark is active.

Some commands act specially on the region when Transient Mark
mode is enabled.  Usually, such commands should use
`use-region-p' instead of this function, because `use-region-p'
also checks the value of `use-empty-active-region'."
  (and transient-mark-mode mark-active))

之间有什么关系

  • 区域被突出显示(即该区域具有不同的背景颜色)

  • 区域活跃

  • 标记处于活动状态

何时启用瞬态标记模式,何时禁用?

4

2 回答 2

7
  1. 区域处于活动状态 = 标记处于活动状态。但不一定要突出显示。

  2. 如果活动和瞬态标记模式打开,则该区域会突出显示。

  3. 如果您使用鼠标或使用 Shift + 光标键设置该区域,也会临时突出显示该区域,即,即使瞬态标记模式已关闭。

除非该区域为空,否则您将看不到任何突出显示。

从我的角度来看,“活动”仅适用于瞬态标记模式。关闭模式时没有任何意义。其行为取决于区域是否处于活动状态的任何函数仅在启用 tm-mode 时才会这样做。正如 Emacs 手册(节点Persistent Mark)所说:“当瞬态标记模式关闭时,标记永远不会被停用”

但最近有时不是这样说的。原因与“临时瞬态标记模式”有关(参见 Elisp 手册,节点The Mark)。

(请记住,如果缓冲区中还没有任何标记,那么那里也没有区域。)

于 2013-09-09T14:34:27.073 回答
0

边注。这是一种跟踪标记活动何时为真的方法。评估以下代码:

(defun my-message-mark-active ()
  (set-background-color
   (if mark-active "grey90" "white")))
(defvar my-watch-mark-active-mode nil)
(defun my-watch-mark-active-mode ()
  (interactive)
  (if my-watch-mark-active-mode
      (progn
        (cancel-timer my-watch-mark-active-mode)
        (setq my-watch-mark-active-mode nil)
        (message "off"))
    (setq my-watch-mark-active-mode
          (run-with-idle-timer 0.1 t #'my-message-mark-active))
    (message "on")))

然后键入M-x my-watch-mark-active-mode以打开观看标记活动。背景颜色为 gray90,而 mark-active 为 true,否则为白色。再次键入M-x my-watch-mark-active-mode以将其关闭。

这将有助于验证在启用瞬态标记模式时,当且仅当区域被突出显示时,标记才处于活动状态。这也将验证当瞬态标记模式被禁用时,标记活动在某个时候变为真,然后永远不会变为假,这是每个缓冲区。

于 2013-09-10T12:08:58.293 回答