¿Hay alguna manera de cambiar el color de la franja de la ventana activa?

14

Para distinguir mejor entre la ventana enfocada y el descanso que no existen, me encantaría cambiar el color marginal de esta ventana. Al descubrir personalizar con palabra clave marginal, solo encontré cómo cambiar su color bg sin la capacidad de establecer diferentes colores para los activos y no activos. ¿Es posible en absoluto? Gracias.

sandric
fuente
No estoy seguro sobre el margen, pero puede cambiar la línea de modo para ventanas inactivas. tratar M-x customize-face mode-line-inactive.
Tyler
3
Parece ser frame-local, por lo que parece que la respuesta es no. Intenté (face-remap-add-relative 'fringe '((:background "yellow")))cuál para otras caras es suficiente para el uso local del búfer, pero afecta a todas las ventanas en el marco en lo que fringerespecta a la. Además de la sugerencia de @Tyler, también puede personalizar el cursor para que aparezca solo en ventanas activas - vea la variablecursor-in-non-selected-windows
leyes
Sé sobre modeline, gracias. Solo quería dejarlo más claro para mí.
sandric
Aquí hay un par de ideas adicionales para ayudar a que la ventana activa atraiga más atención visual: (1) hacer que el fondo de la línea de modo de las ventanas inactivas coincida con el color del búfer para que la línea de modo inactiva se vuelva menos notable: stackoverflow.com/ a / 20936397/2112489 y (2) cambiando el color de ciertos componentes textuales mode-line-formatdentro de las ventanas activas e inactivas: emacs.stackexchange.com/a/22682/2287
leyes

Respuestas:

6

Como desea "Para distinguir mejor entre la ventana enfocada", puede usar otras formas de hacerlo en lugar de simplemente cambiar el color marginal de la ventana activa.

Combino tres formas de distinguir mejor entre ventanas activas e inactivas.

  1. Use diferentes colores de línea de modo para las ventanas activas e inactivas.
  2. Resalte la línea actual donde está el punto en la ventana activa.
  3. Use diferentes colores de fondo para las ventanas activas e inactivas.

Tenga en cuenta que todos los colores elegidos mencionados anteriormente deberían funcionar bien con su tema Emacs.

Aquí están las tres formas:

  1. Use diferentes colores de línea de modo para las ventanas activas e inactivas:

    (custom-set-faces
     '(mode-line ((t (:background "dim gray" :foreground "white"))))
     '(mode-line-inactive ((t (:background nil)))))
    
  2. Resalte la línea actual donde está el punto en la ventana activa:

    (global-hl-line-mode 1)
    ;; underline the current line
    (set-face-attribute hl-line-face nil :underline t)
    
  3. Use diferentes colores de fondo para las ventanas activas e inactivas:

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

Puede cambiar los colores en los fragmentos de código para que funcionen bien con su tema de Emacs.

Esta es la captura de pantalla final:

Captura de pantalla de tres formas juntas

Y hay otra función que puede usar manualmente para mostrar la ventana activa:

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

Puede cambiar la combinación de teclas en el fragmento de código, cuando desee mostrar la ventana activa, presione la tecla, la ventana activa será azul, después de mover su punto, el color desaparecerá.

CodyChan
fuente
0

Yo tuve el mismo problema. Recurrí al uso del modo de línea inteligente y lo personalicé para obtener colores que son muy distintivos en la ventana activa. Aquí hay un marco de muestra. La ventana activa es la que tiene una línea de modo negro con letras doradas.

ingrese la descripción de la imagen aquí

Asegúrese de requerir una línea de modo inteligente antes de usar este código. Te recomiendo que lo personalices a los colores que necesitas:

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

Puede intentar hacer algo como lo siguiente para resaltar la ventana seleccionada actualmente. Tenga en cuenta que esto no funciona si los búferes en varias ventanas son iguales. Esto atenúa todas las demás ventanas excepto la seleccionada.

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