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

当且仅当区域在Emacs中处于活动状态时,标记是否处于活动状态?,emacs,elisp,selection,region,textselection,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. So

无论是否启用瞬态标记模式,“标记处于活动状态”是否与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))
两者之间的关系是什么

  • 区域高亮显示(即该区域采用不同的背景色)

  • 区域是活跃的

  • 马克是活跃的

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

  • 区域处于活动状态=标记处于活动状态。但它不一定被强调

  • 如果激活和瞬态标记模式处于启用状态,则该区域将高亮显示

  • 如果使用鼠标或Shift+光标键设置该区域,即即使暂时标记模式已关闭,也会临时高亮显示该区域

  • 但如果区域为空,则不会看到任何突出显示

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

    但最近人们有时并不是这样说的。原因与“临时瞬态标记模式”有关(请参阅Elisp手册,节点
    标记


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

    侧注。下面是一种跟踪mark active何时为真的方法。评估以下代码:

    (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我的监视标记激活模式
    以启用监视标记激活。背景色为灰色90,而“标记活动”为真,否则为白色。再次键入
    M-x我的手表标记激活模式
    将其关闭

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