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


无论

是否启用了瞬态标记模式,"标记处于活动状态"是否与Emacs中的"区域处于活动状态"的含义相同?因此激活标记与激活区域相同吗?

我很困惑,因为两个短语似乎在许多地方可以互换使用,而区域-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))

两者之间有什么关系

  • 区域突出显示(即区域处于不同的背景颜色)

  • 区域处于活动状态

  • 标记处于活动状态

分别启用瞬态标记模式和禁用瞬态标记模式?

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

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

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

除了如果该区域为空,则不会看到任何突出显示。

在我看来,"主动"仅适用于瞬态标记模式。当模式关闭时,它没有任何意义。其行为取决于区域是否处于活动状态的任何函数都仅执行此操作启用 T-M 模式时。正如Emacs手册(节点Persistent Mark)所说:"当瞬态标记模式已关闭,标记永远不会停用"

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

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

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

(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 将其关闭。

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

最新更新