Apakah ada cara untuk mengubah warna pinggiran jendela aktif?

14

Untuk lebih membedakan antara jendela fokus dan istirahat yang tidak, saya ingin mengubah warna pinggiran jendela ini. Menemukan penyesuaian dengan kata kunci pinggiran Saya hanya menemukan cara mengubah warna bg tanpa kemampuan untuk mengatur warna yang berbeda untuk yang aktif dan yang tidak aktif. Apakah mungkin? Terima kasih.

sandric
sumber
Saya tidak yakin tentang pinggiran, tetapi Anda dapat mengubah mode-line untuk windows tidak aktif. coba M-x customize-face mode-line-inactive.
Tyler
3
Tampaknya menjadi bingkai-lokal, jadi sepertinya jawabannya tidak. Saya mencoba (face-remap-add-relative 'fringe '((:background "yellow")))yang untuk wajah lain cukup untuk penggunaan buffer-lokal, tetapi mempengaruhi semua jendela dalam bingkai sejauh yang fringebersangkutan. Selain saran @Tyler, Anda juga dapat menyesuaikan kursor sehingga hanya muncul di jendela aktif - lihat variabelcursor-in-non-selected-windows
hukum
Saya tahu tentang modeline, thx. Saya hanya ingin membuatnya lebih jelas bagi saya.
sandric
Berikut adalah beberapa ide tambahan untuk membantu membuat jendela aktif menarik lebih banyak perhatian visual: (1) membuat latar belakang garis mode dari jendela tidak aktif cocok dengan warna buffer sehingga garis mode tidak aktif menjadi kurang terlihat: stackoverflow.com/ a / 20936397/2112489 dan (2) mengubah warna komponen tekstual tertentu di mode-line-formatdalam jendela aktif dan tidak aktif: emacs.stackexchange.com/a/22682/2287
lawlist

Jawaban:

6

Karena Anda ingin "Untuk lebih membedakan antara jendela fokus", Anda dapat menggunakan cara lain untuk melakukan itu alih-alih hanya mengubah warna pinggiran jendela aktif.

Saya menggabungkan tiga cara untuk membedakan lebih baik antara jendela aktif dan tidak aktif.

  1. Gunakan berbagai warna garis mode untuk jendela aktif dan tidak aktif.
  2. Sorot garis saat ini di mana titik tersebut berada di jendela aktif.
  3. Gunakan warna latar belakang yang berbeda untuk jendela aktif dan tidak aktif.

Perhatikan bahwa semua warna yang dipilih di atas harus bekerja dengan baik dengan tema Emacs Anda.

Inilah tiga cara:

  1. Gunakan berbagai warna garis mode untuk jendela aktif dan tidak aktif:

    (custom-set-faces
     '(mode-line ((t (:background "dim gray" :foreground "white"))))
     '(mode-line-inactive ((t (:background nil)))))
    
  2. Sorot baris saat ini di mana titiknya ada di jendela aktif:

    (global-hl-line-mode 1)
    ;; underline the current line
    (set-face-attribute hl-line-face nil :underline t)
    
  3. Gunakan warna latar belakang yang berbeda untuk jendela aktif dan tidak aktif:

    (defun highlight-selected-window ()
      "Highlight selected window with a different background color."
      (walk-windows (lambda (w)
                      (unless (eq w (selected-window))
                        (with-current-buffer (window-buffer w)
                          (buffer-face-set '(:background "#111"))))))
      (buffer-face-set 'default))
    (add-hook 'buffer-list-update-hook 'highlight-selected-window)
    

Anda dapat mengubah warna dalam cuplikan kode agar berfungsi dengan baik dengan tema Emacs Anda.

Ini adalah tangkapan layar terakhir:

Cuplikan layar dari tiga cara bersama

Dan ada fungsi lain yang dapat Anda gunakan secara manual untuk mem-flash jendela aktif:

(global-set-key (kbd "<f12>") 'flash-active-buffer)
(make-face 'flash-active-buffer-face)
(set-face-attribute 'flash-active-buffer-face nil
                    :background "blue" :foreground nil)
(defun flash-active-buffer ()
  (interactive)
  (run-at-time "100 millisec" nil
               (lambda (remap-cookie)
                 (face-remap-remove-relative remap-cookie))
               (face-remap-add-relative 'default 'flash-active-buffer-face)))

Anda dapat mengubah pengikat tombol di snipet kode, saat Anda ingin menampilkan jendela aktif, tekan tombol, jendela aktif akan berwarna biru, setelah Anda menggerakkan titik Anda, warnanya akan hilang.

CodyChan
sumber
0

Saya memiliki masalah yang sama. Saya menggunakan mode garis pintar dan menyesuaikannya sehingga saya mendapatkan warna yang sangat khas di jendela aktif. Ini adalah kerangka sampel. Jendela aktif adalah jendela dengan garis mode hitam dengan huruf emas.

masukkan deskripsi gambar di sini

Pastikan Anda memerlukan smart-mode-line sebelum menggunakan kode ini. Saya sarankan Anda menyesuaikannya dengan warna yang Anda butuhkan:

(deftheme smart-mode-line-dmg "dmg theme for smart-mode-line.")
(custom-theme-set-faces
 'smart-mode-line-dmg
                                        ; '(mode-line-inactive ((t :inverse-video nil)))
                                        ; '(mode-line     ((t :inverse-video nil)))
 '(mode-line     ((t :foreground "grey70" :background "black" :inverse-video nil)))
 '(mode-line-inactive  ((t :foreground "black" :background "white" :inverse-video nil)))
 '(sml/global    ((t :inherit font-lock-preprocessor-face)))
 '(sml/filename  ((t :inherit sml/global :foreground "gold" :weight bold)))
 '(sml/prefix    ((t :inherit (font-lock-variable-name-face sml/global))))
 '(sml/read-only ((t :inherit (font-lock-type-face sml/not-modified))))
 '(sml/modes     ((t :foreground nil :inherit sml/filename :weight normal))))

(sml/setup)
dmg
sumber
0

Anda dapat mencoba melakukan sesuatu seperti berikut untuk menyorot jendela yang saat ini dipilih. Berhati-hatilah karena ini tidak berfungsi jika buffer di banyak jendela sama. Ini meredupkan semua jendela lain kecuali yang dipilih.

(defvar dim-window-face
  '((t  (:background "grey40")))
  "Face for a dimmed window in the current frame.")

(defvar current-window-face
  '((t  (:background "black")))
  "Face for a dimmed window in the current frame.")

(defvar window->overlay (make-hash-table)
  "A hash table of window to dimmed overlay.")

(defun dim-windows ()
  "Dim all windows except the `selected-window' in current frame."
  (interactive)
  (walk-windows (lambda (w)
                  ;; Delete existing overlay on window W
                  (when-let ((ol (gethash w window->overlay)))
                    (delete-overlay ol))
                  (let ((ol (make-overlay (window-start w)
                                          (window-end w)
                                          (window-buffer w))))
                    (overlay-put ol 'face (if (eql (selected-window) w)
                                              current-window-face
                                            dim-window-face))
                    (puthash w ol window->overlay)))))
narendraj9
sumber