Zeigen Sie etwas in der aktiven Moduszeile anstelle aller Moduszeilen an

10

Damit habe ich in der Moduszeile eine Org-Timer-Anzeige eingerichtet.

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

   )))

Ich möchte, dass diese Org-Timer-Anzeige nur in der aktiven Moduszeile anstelle aller Moduszeilen angezeigt wird. Wie es geht?

Stardiviner
quelle
@lawlist Kann deinen Code nicht verstehen. Ich weiß nicht, wie ich mich auf meinen Fall bewerben soll.
Stardiviner
1
Die redisplayEngine kann unter bestimmten Umständen jedes Fenster überprüfen (z. B. wenn die Moduszeile auf natürliche Weise aktualisiert wird oder wenn sie zum Aktualisieren gezwungen wird). Wenn das mode-line-formatdie Funktion enthält (selected-window), wird ein anderes Fenster zurückgegeben, wenn Redisplay die verschiedenen Fenster besucht. Dieser Wert kann mit einem zuvor aufgezeichneten Wert verglichen werden - z. B. kann der Wert post-command-hookverwendet werden, um den zuletzt bekannten selected-windowWert aufzuzeichnen, und dieser Wert kann später mit einer Funktion innerhalb des verglichen werden mode-line-format. Also benutze ich den PCH, um das aufzuzeichnen / zu speichern selected-window.
Lawlist
@lawlist Ich habe Ihren Code ausgecheckt, aber keine allgemeine Verwendung für meinen Fall gefunden. Wenn ich stattdessen zu etwas anderem wechsle org-timer. Was sollte ich tun? Ich hoffe einen allgemeineren Weg. Sogar es hat mich inspiriert. Können Sie mir ein genaueres Codebeispiel geben? Weil ich es anders eingestellt fand 'face, aber ich muss die Anzeigezeichenfolge ändern.
Stardiviner
Ich habe es nicht versucht, aber diese Frage sieht ähnlich aus wie diese: emacs.stackexchange.com/q/13842/115
Kaushal Modi

Antworten:

7

Im folgenden Beispiel wird das Wort "ACTIVE" in der Moduszeile des aktiven Fensters angezeigt, und in allen anderen Fenstern wird das Wort "INACTIVE" in der Moduszeile angezeigt.

Versuchen Sie dieses Beispiel emacs -Qunbedingt mit , um sicherzustellen, dass es wie angekündigt funktioniert. Passen Sie es anschließend nach Bedarf an.

Fügen Sie nach Bedarf zusätzliche Hooks hinzu, um aufzurufen 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")))
Gesetzesliste
quelle