Afficher quelque chose dans la ligne de mode actif au lieu de toutes les lignes de mode

10

J'ai mis en place un indicateur org-timer dans la ligne de mode avec cela.

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

   )))

Je veux que cet indicateur org-timer soit affiché dans la ligne de mode actif uniquement, au lieu de toutes les lignes de mode. Comment faire?

stardiviner
la source
@lawlist Vous ne comprenez pas votre code. Je ne sais pas comment appliquer sur mon cas.
stardiviner
1
Le redisplaymoteur est capable de vérifier chaque fenêtre dans certaines circonstances (par exemple, lorsque la ligne de mode est rafraîchie naturellement ou lorsqu'elle est forcée de se rafraîchir). Lorsque le mode-line-formatcontient la fonction (selected-window), une fenêtre différente sera renvoyée lorsque l'affichage réaffiche les différentes fenêtres. Cette valeur peut être comparée à une valeur préenregistrée - par exemple, le post-command-hookpeut être utilisé pour enregistrer le dernier connu selected-windowet cette valeur peut ensuite être comparée avec une fonction à l'intérieur du mode-line-format. Donc, j'utilise le PCH pour enregistrer / stocker le selected-window.
lawlist
@lawlist J'ai vérifié votre code, mais je n'ai pas trouvé d'utilisation générale pour mon cas. Si je change d'autre chose au lieu de org-timer. Que devrais-je faire? J'espère d'une manière plus générale. Même cela m'a inspiré. Pouvez-vous me donner plus exactement un exemple de code? Parce que je l'ai trouvé différent 'face, mais je dois changer la chaîne d'affichage.
stardiviner
Je n'ai pas essayé cela, mais cette question ressemble à celle-ci: emacs.stackexchange.com/q/13842/115
Kaushal Modi

Réponses:

7

Dans l'exemple suivant, le mot "ACTIVE" apparaîtra dans la ligne de mode de la fenêtre active, et toutes les autres fenêtres afficheront le mot "INACTIVE" dans la ligne de mode.

Assurez-vous d'essayer cet exemple avec emacs -Qpour vérifier qu'il fonctionne comme annoncé. Par la suite, personnalisez-le selon vos besoins.

Ajoutez des crochets supplémentaires au besoin pour appeler 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")))
liste des lois
la source