Existe-t-il un moyen de changer la couleur de la frange de la fenêtre active?

14

Pour mieux distinguer entre la fenêtre focalisée et le repos qui ne le sont pas, j'aimerais changer la couleur des franges de cette fenêtre. Découvrir la personnalisation avec le mot-clé frange J'ai trouvé seulement comment changer sa couleur bg sans possibilité de définir des couleurs différentes pour les couleurs actives et non actives. Est-ce possible du tout? THX.

sandric
la source
Je ne suis pas sûr de la frange, mais vous pouvez changer la ligne de mode pour les fenêtres inactives. essayez M-x customize-face mode-line-inactive.
Tyler
3
Il semble que le cadre soit local, il semble donc que la réponse soit non. J'ai essayé (face-remap-add-relative 'fringe '((:background "yellow")))ce qui pour les autres visages est suffisant pour une utilisation locale du tampon, mais cela affecte toutes les fenêtres du cadre en ce qui fringeconcerne le. En plus de la suggestion de @Tyler, vous pouvez également personnaliser le curseur pour qu'il apparaisse uniquement dans les fenêtres actives - voir la variablecursor-in-non-selected-windows
lawlist
Je connais la modeline, thx. Je voulais juste que ce soit plus clair pour moi.
sandric
Voici quelques idées supplémentaires pour aider à attirer davantage l'attention visuelle sur la fenêtre active: (1) faire en sorte que l'arrière-plan de la ligne de mode des fenêtres inactives corresponde à la couleur du tampon afin que la ligne de mode inactive devienne moins visible: stackoverflow.com/ a / 20936397/2112489 et (2) changer la couleur de certains composants textuels de l' mode-line-formatintérieur des fenêtres actives et inactives: emacs.stackexchange.com/a/22682/2287
lawlist

Réponses:

6

Puisque vous voulez "Pour mieux distinguer la fenêtre focalisée", vous pouvez utiliser d'autres méthodes pour le faire au lieu de simplement changer la couleur des franges de la fenêtre active.

Je combine trois façons de mieux distinguer les fenêtres actives des fenêtres inactives.

  1. Utilisez différentes couleurs de ligne de mode pour les fenêtres actives et inactives.
  2. Mettez en surbrillance la ligne actuelle où le point se trouve dans la fenêtre active.
  3. Utilisez différentes couleurs d'arrière-plan pour les fenêtres actives et inactives.

Notez que toutes les couleurs choisies mentionnées ci-dessus devraient bien fonctionner avec votre thème Emacs.

Voici les trois façons:

  1. Utilisez différentes couleurs de ligne de mode pour les fenêtres actives et inactives:

    (custom-set-faces
     '(mode-line ((t (:background "dim gray" :foreground "white"))))
     '(mode-line-inactive ((t (:background nil)))))
    
  2. Mettez en surbrillance la ligne actuelle où le point est dans la fenêtre active:

    (global-hl-line-mode 1)
    ;; underline the current line
    (set-face-attribute hl-line-face nil :underline t)
    
  3. Utilisez différentes couleurs d'arrière-plan pour les fenêtres actives et inactives:

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

Vous pouvez modifier les couleurs dans les extraits de code pour bien fonctionner avec votre thème Emacs.

Voici la capture d'écran finale:

Capture d'écran de trois façons ensemble

Et il existe une autre fonction que vous pouvez utiliser manuellement pour flasher la fenêtre active:

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

Vous pouvez modifier la liaison de touches dans l'extrait de code, lorsque vous souhaitez afficher la fenêtre active, appuyez sur la touche, la fenêtre active sera bleue, après avoir déplacé votre point, la couleur aura disparu.

CodyChan
la source
0

J'ai eu le même problème. J'ai recouru à l'utilisation du mode ligne intelligente et à le personnaliser pour obtenir des couleurs très distinctives dans la fenêtre active. Voici un exemple de cadre. La fenêtre active est celle avec une ligne de mode noire avec des lettres dorées.

entrez la description de l'image ici

Assurez-vous que vous avez besoin d'une ligne de mode intelligent avant d'utiliser ce code. Je vous recommande de le personnaliser aux couleurs dont vous avez besoin:

(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
la source
0

Vous pouvez essayer de faire quelque chose comme ce qui suit pour mettre en surbrillance la fenêtre actuellement sélectionnée. Attention, cela ne fonctionne pas si les tampons dans plusieurs fenêtres sont identiques. Cela atténue toutes les autres fenêtres sauf celle sélectionnée.

(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
la source