Czy istnieje sposób na zmianę koloru frędzli aktywnego okna?

15

Aby lepiej rozróżnić skupione okno od odpoczynku, które nie są, chciałbym zmienić kolor obramowania tego okna. Odkrywając dostosowywanie za pomocą słowa kluczowego frędzle, znalazłem tylko sposób zmiany jego koloru bg bez możliwości ustawiania różnych kolorów dla aktywnych i nieaktywnych. Czy to w ogóle możliwe? Dzięki.

sandryk
źródło
Nie jestem pewien co do grzywki, ale możesz zmienić linię trybu dla nieaktywnych okien. spróbuj M-x customize-face mode-line-inactive.
Tyler
3
Wygląda na lokalną ramkę, więc wygląda na to, że odpowiedź brzmi „nie”. Próbowałem, (face-remap-add-relative 'fringe '((:background "yellow")))która dla innych ścian jest wystarczająca do lokalnego użycia bufora, ale wpływa to na wszystkie okna w ramce fringe. Oprócz sugestii @Tyler możesz również dostosować kursor, aby cursor-in-non-selected-windows
pojawiał się
Wiem o modeline, thx. Chciałem tylko, żeby było to dla mnie bardziej jasne.
sandric
Oto kilka dodatkowych pomysłów, które sprawią, że aktywne okno przyciągnie większą uwagę wizualną: (1) dostosowanie tła linii trybu nieaktywnych okien do koloru bufora, tak aby nieaktywna linia trybu stała się mniej zauważalna: stackoverflow.com/ a / 20936397/2112489 i (2) zmiana koloru niektórych składników tekstowych mode-line-formatw aktywnych i nieaktywnych oknach: emacs.stackexchange.com/a/22682/2287
lista prawników

Odpowiedzi:

6

Ponieważ chcesz „Aby lepiej rozróżniać skupione okno”, możesz to zrobić na inne sposoby zamiast po prostu zmieniać kolor obramowania aktywnego okna.

Łączę trzy sposoby lepszego rozróżnienia między aktywnymi i nieaktywnymi oknami.

  1. Użyj różnych kolorów linii trybu dla aktywnych i nieaktywnych okien.
  2. Podświetl bieżącą linię, w której punkt znajduje się w aktywnym oknie.
  3. Użyj różnych kolorów tła dla aktywnych i nieaktywnych okien.

Pamiętaj, że wszystkie wybrane wyżej kolory powinny dobrze współpracować z Twoim motywem Emacsa.

Oto wszystkie trzy sposoby:

  1. Użyj różnych kolorów linii trybu dla aktywnych i nieaktywnych okien:

    (custom-set-faces
     '(mode-line ((t (:background "dim gray" :foreground "white"))))
     '(mode-line-inactive ((t (:background nil)))))
    
  2. Podświetl bieżącą linię, w której punkt znajduje się w aktywnym oknie:

    (global-hl-line-mode 1)
    ;; underline the current line
    (set-face-attribute hl-line-face nil :underline t)
    
  3. Użyj różnych kolorów tła dla aktywnych i nieaktywnych okien:

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

Możesz zmienić kolory we fragmentach kodu, aby dobrze współpracowały z motywem Emacsa.

To jest ostatni zrzut ekranu:

Zrzut ekranu z trzech sposobów razem

Jest też inna funkcja, której można ręcznie użyć do flashowania aktywnego okna:

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

Możesz zmienić przypisanie klawiszy we fragmencie kodu, gdy chcesz pokazać aktywne okno, naciśnij klawisz, aktywne okno będzie niebieskie, po przeniesieniu punktu kolor zniknie.

CodyChan
źródło
0

Miałem ten sam problem. Skorzystałem z trybu inteligentnej linii i dostosowałem go, aby uzyskać kolory, które są bardzo charakterystyczne w aktywnym oknie. Oto przykładowa ramka. Aktywne okno to okno z czarną linią trybu ze złotymi literami.

wprowadź opis zdjęcia tutaj

Przed użyciem tego kodu upewnij się, że potrzebujesz linii trybu inteligentnego. Zalecam dostosowanie go do potrzebnych kolorów:

(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
źródło
0

Możesz spróbować wykonać następujące czynności, aby podświetlić aktualnie wybrane okno. Uważaj, że to nie działa, jeśli bufory w wielu oknach są takie same. Spowoduje to przyciemnienie wszystkich innych okien oprócz wybranego.

(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
źródło