当且仅当区域在Emacs中处于活动状态时,标记是否处于活动状态?

时间:2013-09-09 12:40:21

标签: emacs elisp selection region textselection

“标记是否处于活动状态”只是意味着与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))

之间的关系是什么
  • 区域突出显示(即区域的背景颜色不同)

  • 区域有效

  • 标记已激活

当启用瞬态标记模式时,以及何时禁用它?

2 个答案:

答案 0 :(得分:6)

  1. 区域处于活动状态=标记处于活动状态。但它未必突出显示。

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

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

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

    从我的观点来看,“有效”仅适用于瞬态标记模式。模式关闭时没有任何意义。任何行为取决于该区域是否处于活动状态的函数都会这样做 当t-m-mode启用时。正如Emacs手册(节点Persistent Mark)所说:“何时 瞬态标记模式关闭,标记从不取消激活“

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

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

答案 1 :(得分: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以启用观看标记 - 活动状态。背景颜色为灰色90而标记活动为真,否则为白色。再次输入M-x my-watch-mark-active-mode即可将其关闭。

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