Ubah mode-line-buffer-id face untuk windows tidak aktif

8

Apakah ada wajah Emacs yang dapat digunakan untuk mengontrol warna nama buffer tidak aktif?

Biasanya ketika mengatur wajah mode-line-buffer-idsemua jendela terpengaruh.

Dalam contoh ini mode-linememiliki latar belakang yang terang, jadi saya mengatur mode-line-buffer-idke yang lebih gelap #333.

mode-line dengan buffer-id gelap pada latar belakang terang

Idenya adalah untuk membalikkan kombinasi warna untuk untuk mode-line-inactive.

Meskipun ini mungkin untuk sebagian besar teks dalam mode-line windows tidak aktif, nama buffer menjadi tidak dapat dibaca karena masih dikontrol oleh mode-line-buffer-idwajah.

mode-line-inactive dengan dark buffer-id pada background gelap

Saya percaya bahwa pengaturan mode-line-inactiveke latar belakang yang lebih ringan akan mengatasi masalah, tapi itu bukan hasil yang ingin saya capai.


sumber
Berikut ini tautan ke contoh yang mengkustomisasi berbagai aspek dari mode-line: amitp.blogspot.com/2011/08/emacs-custom-mode-line.html
lawlist
Anda dapat memetakan wajah ketika buffer aktif berubah seperti yang dijelaskan di sini: emacs.stackexchange.com/a/14658/780
glucas

Jawaban:

3

Saya tidak yakin apakah Anda masih mencari jawaban atau tidak, tetapi ini adalah satu-satunya hasil yang saya dapatkan di Google saat mencoba melakukan ini sendiri.

Apa pun alasan Emacs menyebutnya, distant-foregroundjadi satu-satunya hal yang benar-benar perlu Anda lakukan adalah menambahkan :distant-foreground $colour-of-choiceke wajah Anda.

Valentijn
sumber
1

Berikut variasi jawaban lain yang mungkin bisa membantu. Contoh ini mode-line-buffer-iddibuat kembali menjadi hijau di buffer tidak aktif.

(defun toggle-mode-line-buffer-id-face (window)
  "Update the `mode-line-buffer-id' face in WINDOW dependening on
whether the window is selected."
  (with-current-buffer (window-buffer window)
(if (eq (current-buffer) (window-buffer (selected-window)))
    (face-remap-reset-base 'mode-line-buffer-id)
  (face-remap-set-base 'mode-line-buffer-id '(:foreground "green")))))

(add-hook 'buffer-list-update-hook (lambda () (walk-windows #'toggle-mode-line-buffer-id-face nil t)))

Pembaruan: Seperti disebutkan dalam komentar, ini tidak sepenuhnya menyelesaikan masalah. Ketika Anda memiliki beberapa jendela yang terlihat mengunjungi buffer yang sama, mereka semua akan berbagi wajah yang sama.

glukas
sumber
Sayangnya, buffer dapat terlihat di lebih dari satu jendela, di mana satu bisa aktif dan satu tidak aktif.
Lindydancer
Benar, memetakan ulang wajah berlaku untuk buffer dan bukan jendela.
glucas
1

Ini adalah variasi dari jawaban lain, dengan yang ini membedakan antara windows aktif dan tidak aktif. Jika buffer terlihat di lebih dari satu jendela, hanya jendela aktif yang akan dimiliki ml-active-window-facedan semua jendela lainnya akan memilikinya ml-inactive-window-face.

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

(defface ml-active-window-face
   '((t (:foreground "red")))
   "Face for active buffer identification.")

(defface ml-inactive-window-face
   '((t (:foreground "green")))
   "Face for inactive buffer identification.")

(defun ml-propertized-buffer-identification (fmt)
  "Return a list suitable for `mode-line-buffer-identification'.
FMT is a format specifier such as \"%12b\".  This function adds
text properties for face, help-echo, and local-map to it."
  (list (propertize fmt
        'face
          (if (eq ml-selected-window (selected-window))
            'ml-active-window-face
            'ml-inactive-window-face)
        'help-echo
        (purecopy "Buffer name
mouse-1: Previous buffer\nmouse-3: Next buffer")
        'mouse-face 'mode-line-highlight
        'local-map mode-line-buffer-identification-keymap)))

(setq-default mode-line-buffer-identification
  '(:eval (ml-propertized-buffer-identification "%12b")))

Contoh

daftar hukum
sumber
0

Saya tidak yakin itu mungkin. Tampaknya garis mode diperbarui hanya ketika jendelanya dipilih (pengujian menggunakan panggilan untuk messagemenghapus ini). Dan kode yang melakukan ini adalah kode C, bukan Lisp.

Anda dapat menggunakan ekspresi kondisional dalam definisi mode-line-buffer-identification, sehingga wajah yang digunakan dihitung secara dinamis. Tapi saya tidak tahu fungsi atau variabel apa pun yang dapat Anda gunakan untuk menguji apakah jendela yang diberikan memiliki mode-line tidak aktif.

Anda tidak dapat menggunakan selected-window, misalnya, karena itu selalu menunjuk ke jendela dengan jalur mode aktif.

Berikut adalah contoh pembaruan dinamis yang didasarkan pada nama buffer. Bukan apa yang Anda inginkan, tetapi setidaknya menunjukkan kepada Anda apa yang dapat Anda lakukan. Jika Anda dapat menemukan cara untuk menguji apakah jendela yang diperbarui dipilih maka Anda dapat menggantikannya dengan tes nama buffer. (Tapi kesan saya adalah hanya jendela yang dipilih yang memperbarui baris mode.)

(setq-default mode-line-buffer-identification
              '(:eval
                (list (propertize "%b"
                       'face (if ;; NOPE (eq (selected-window) (get-buffer-window (current-buffer)))
                                 (eq (current-buffer) (get-buffer "some-buffer"))
                                 'mode-line-buffer-id
                               'some-other-face)
                       'help-echo "Buffer name mouse-1: Previous buffer\nmouse-3: Next buffer"
                       'mouse-face 'mode-line-highlight
                       'local-map mode-line-buffer-identification-keymap))))

Hal lain yang mungkin Anda coba adalah fungsi menasihati format-mode-line. Tampaknya memang membedakan sebuah jendela dengan jalur mode aktif dari satu dengan jalur mode tidak aktif. Tetapi kode juga dalam C, jadi saya ragu Anda akan sangat jauh dengan menasihati itu. Ini menguji variabel C Qmode_line_inactive, FWIW.

Saya sarankan mengajukan pertanyaan ini di salah satu milis Emacs (mis. [email protected]), Jika Anda tidak mendapatkan jawaban yang memuaskan di sini. Sepertinya itu baik untuk dapat melakukan apa yang Anda minta. +1 untuk pertanyaan, dalam hal apa pun.

Drew
sumber
1
Hanya untuk menyelesaikan jawaban Drew, deteksi buffer aktif dan wajah mode-line-buffer-id khusus untuk buffer aktif dan tidak aktif dilakukan di powerline . Jika Anda ingin menyelidiki kode, titik awal yang baik adalah fungsi powerline-default-theme yang didefinisikan dalam powerline-themes.el
deb0ch