Tampilkan sesuatu dalam garis mode aktif, bukan semua garis mode

10

Saya mengatur indikator org-timer di baris mode dengan ini.

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

   )))

Saya ingin indikator pengatur waktu ini hanya ditampilkan di baris mode aktif , bukan semua baris mode. Bagaimana cara melakukannya?

stardiviner
sumber
@lawlist Tidak dapat memahami kode Anda. Tidak tahu cara mengajukan permohonan pada kasus saya.
stardiviner
1
The redisplaymesin ini mampu memeriksa setiap jendela dalam keadaan tertentu (misalnya, ketika mode-line di-refresh secara alami, atau ketika dipaksa untuk menyegarkan). Ketika mode-line-formatberisi fungsi (selected-window), jendela yang berbeda akan dikembalikan saat menampilkan kembali mengunjungi berbagai jendela. Nilai itu dapat dibandingkan dengan nilai pra-rekam - misalnya, post-command-hookdapat digunakan untuk mencatat yang terakhir diketahui selected-windowdan nilai itu nantinya dapat dibandingkan dengan fungsi di dalam mode-line-format. Jadi, saya menggunakan PCH untuk merekam / menyimpan selected-window.
lawlist
@lawlist Saya sudah memeriksa kode Anda, tetapi belum menemukan penggunaan umum untuk kasus saya. Jika saya berubah ke hal lain, bukan org-timer. Apa yang harus saya lakukan? Saya harap cara yang lebih umum. Bahkan itu menginspirasi saya. Bisakah Anda memberi saya lebih tepatnya contoh kode? Karena saya merasa set berbeda 'face, Tapi saya perlu mengubah tampilan string.
stardiviner
Saya belum mencoba ini, tetapi pertanyaan ini mirip dengan yang ini: emacs.stackexchange.com/q/13842/115
Kaushal Modi

Jawaban:

7

Dalam contoh berikut, kata "AKTIF" akan muncul di baris mode dari jendela yang aktif, dan semua jendela lain akan menampilkan kata "TIDAK aktif" di baris mode.

Pastikan untuk mencoba contoh ini dengan emacs -Qmemverifikasi bahwa itu berfungsi seperti yang diiklankan. Setelah itu, sesuaikan sesuai kebutuhan.

Tambahkan kait tambahan sesuai kebutuhan untuk menelepon 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")))
daftar hukum
sumber