Показывать что-то в строке активного режима вместо всех строк режима

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")))

   )))

Я хочу, чтобы этот индикатор таймера организации отображался только в строке активного режима , а не во всех строках режима. Как это сделать?

stardiviner
источник
@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
Modi

Ответы:

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")))
lawlist
источник