Gibt es eine Möglichkeit, die Farbe des aktiven Fensters zu ändern?

14

Um fokussierte Fenster besser von nicht fokussierten Fenstern zu unterscheiden, würde ich gerne die Randfarbe dieses Fensters ändern. Beim Erkennen der Option "Anpassen mit Rand-Keyword" wurde nur festgestellt, wie die Hintergrundfarbe geändert werden kann, ohne dass unterschiedliche Farben für aktive und nicht aktive Farben festgelegt werden können. Ist das überhaupt möglich? Danke.

sandric
quelle
Ich bin mir nicht sicher über den Rand, aber Sie können die Moduszeile für inaktive Fenster ändern. versuchen Sie es M-x customize-face mode-line-inactive.
Tyler
3
Es scheint rahmenlokal zu sein, daher sieht es so aus, als wäre die Antwort nein. Ich habe versucht, (face-remap-add-relative 'fringe '((:background "yellow")))was für andere Gesichter für die pufferlokale Verwendung ausreicht, aber es wirkt sich auf alle Fenster im Rahmen aus, soweit dies fringebetroffen ist. Neben den Vorschlag von @Tyler, können Sie die Cursor auch so anpassen, dass es nur im aktiven Fenster erscheint - die Variable sehencursor-in-non-selected-windows
lawlist
Ich kenne mich mit Modeline aus, danke. Ich wollte es mir nur klarer machen.
Sandric
Hier sind einige zusätzliche Ideen, die dazu beitragen, dass das aktive Fenster mehr visuelle Aufmerksamkeit erregt: (1) Passen Sie den Hintergrund der Moduszeile der inaktiven Fenster an die Pufferfarbe an , damit die inaktive Moduszeile weniger auffällt: stackoverflow.com/ a / 20936397/2112489 und (2) Ändern der Farbe bestimmter Textkomponentenmode-line-format in den aktiven und inaktiven Fenstern: emacs.stackexchange.com/a/22682/2287
lawlist

Antworten:

6

Da Sie "Fokusfenster besser unterscheiden" möchten, können Sie dies auch auf andere Weise tun, anstatt nur die Randfarbe des aktiven Fensters zu ändern.

Ich kombiniere drei Möglichkeiten, um zwischen aktiven und inaktiven Fenstern besser unterscheiden zu können.

  1. Verwenden Sie für die aktiven und inaktiven Fenster unterschiedliche Farben der Moduszeile.
  2. Markieren Sie die aktuelle Linie, in der sich der Punkt im aktiven Fenster befindet.
  3. Verwenden Sie für die aktiven und inaktiven Fenster unterschiedliche Hintergrundfarben.

Beachten Sie, dass alle oben genannten ausgewählten Farben gut zu Ihrem Emacs-Thema passen sollten.

Hier sind alle drei Möglichkeiten:

  1. Verwenden Sie für die aktiven und inaktiven Fenster unterschiedliche Farben der Moduszeile:

    (custom-set-faces
     '(mode-line ((t (:background "dim gray" :foreground "white"))))
     '(mode-line-inactive ((t (:background nil)))))
    
  2. Markieren Sie die aktuelle Linie, in der sich der Punkt im aktiven Fenster befindet:

    (global-hl-line-mode 1)
    ;; underline the current line
    (set-face-attribute hl-line-face nil :underline t)
    
  3. Verwenden Sie unterschiedliche Hintergrundfarben für die aktiven und inaktiven Fenster:

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

Sie können die Farben in den Codefragmenten so ändern, dass sie gut zu Ihrem Emacs-Thema passen.

Dies ist der letzte Screenshot:

Screenshot von drei Möglichkeiten zusammen

Und es gibt eine weitere Funktion, mit der Sie das aktive Fenster manuell flashen können:

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

Sie können die Tastenkombination im Code-Snippet ändern. Wenn Sie das aktive Fenster anzeigen möchten, drücken Sie die Taste. Das aktive Fenster ist blau. Nachdem Sie den Mauszeiger bewegt haben, ist die Farbe verschwunden.

CodyChan
quelle
0

Ich hatte das gleiche problem Ich habe auf den Smart-Line-Modus zurückgegriffen und ihn angepasst, damit ich Farben erhalte, die im aktiven Fenster sehr unterschiedlich sind. Hier ist ein Beispielframe. Das aktive Fenster ist das mit der schwarzen Linie mit goldenen Buchstaben.

Bildbeschreibung hier eingeben

Stellen Sie sicher, dass Sie eine Smart-Mode-Leitung benötigen, bevor Sie diesen Code verwenden. Ich empfehle Ihnen, es an die Farben anzupassen, die Sie benötigen:

(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
quelle
0

Sie können versuchen, das aktuell ausgewählte Fenster wie folgt hervorzuheben. Beachten Sie, dass dies nicht funktioniert, wenn die Puffer in mehreren Fenstern gleich sind. Dadurch werden alle anderen Fenster mit Ausnahme des ausgewählten Fensters abgeblendet.

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