在活动模式行而不是所有模式行中显示内容


10

为此,我在模式行中设置了一个组织计时器。

(setq-default
 mode-line-format
 (quote
  (
   ;; org-timer
   (:eval
    (unless (not org-timer-countdown-timer)
      (propertize (let* ((rtime (decode-time
                                 (time-subtract
                                  (timer--time org-timer-countdown-timer)
                                  (current-time))))
                         (rmins (nth 1 rtime))
                         (rsecs (nth 0 rtime)))
                    (format "🕔 %d:%d" rmins rsecs))
                  'face '(:foreground "cyan" :weight bold)
                  'help-echo "org-timer")))

   )))

我希望此组织计时器指示器仅在活动模式行中显示,而不是在所有模式行中显示。怎么做?



@lawlist无法理解您的代码。不知道如何申请我的案子。
stardiviner

1
redisplay引擎是能够检查在某些情况下,每个窗口(例如,当模式行自然被刷新,或当它被强制刷新)。当mode-line-format包含函数时(selected-window),随着重新显示访问各个窗口,将返回另一个窗口。可以将该值与预先记录的值进行比较-例如,post-command-hook可以使用selected-window将该值与记录的最后一个值进行比较,然后将该值与内部的函数进行比较mode-line-format。因此,我使用PCH记录/存储selected-window
法律列表

@lawlist我已经签出了您的代码,但是没有发现我的案例的一般用法。如果我改用其他东西代替org-timer。我该怎么办?我希望有一个更一般的方法。即使它确实启发了我。您能给我更准确的代码示例吗?因为我发现它的设置不同'face,但是我需要更改显示字符串。
stardiviner

我没有尝试过,但是这个问题看起来与此类似:emacs.stackexchange.com/q/13842/115
Kaushal Modi

Answers:


7

在以下示例中,单词“ ACTIVE”将出现在活动窗口的模式行中,而所有其他窗口将在模式行中显示单词“ INACTIVE”。

确保尝试使用此示例,emacs -Q以验证其是否如广告所示正常工作。之后,根据需要对其进行自定义。

根据需要添加其他挂钩ml-update-all

(defvar ml-selected-window nil)

(defun ml-record-selected-window ()
  (setq ml-selected-window (selected-window)))

(defun ml-update-all ()
  (force-mode-line-update t))

(add-hook 'post-command-hook 'ml-record-selected-window)

(add-hook 'buffer-list-update-hook 'ml-update-all)

(setq-default mode-line-format
  '(:eval
      (if (eq ml-selected-window (selected-window))
        "ACTIVE"
        "INACTIVE")))
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.