Existe uma maneira de mudar a cor da margem da janela ativa?

14

Para distinguir melhor entre a janela focada e o descanso que não é, eu gostaria de mudar a cor da franja dessa janela. Descobrindo personalizar com a palavra-chave com franja, descobri apenas como alterar sua cor bg sem a capacidade de definir cores diferentes para cores ativas e não ativas. É possível de alguma forma? Valeu.

sandric
fonte
Não tenho certeza sobre a margem, mas você pode alterar a linha de modo para janelas inativas. tente M-x customize-face mode-line-inactive.
Tyler
3
Parece ser frame-local, então parece que a resposta é não. Eu tentei o (face-remap-add-relative 'fringe '((:background "yellow")))que, para outras faces, é suficiente para o uso local do buffer, mas afeta todas as janelas do quadro no que diz fringerespeito. Além da sugestão de @Tyler, você também pode personalizar o cursor para que ele aparece em janelas ativas única - ver a variávelcursor-in-non-selected-windows
lawlist
Eu sei sobre modeline, thx. Eu só queria deixar mais claro para mim.
Sandric
Aqui estão algumas idéias adicionais para ajudar a tornar a janela ativa atrair mais atenção visual: (1) fazer o plano de fundo da linha de modo das janelas inativas corresponder à cor do buffer, para que a linha de modo inativa se torne menos perceptível: stackoverflow.com/ a / 20936397/2112489 e (2) alterando a cor de certos componentes textuais das mode-line-formatjanelas ativas e inativas: emacs.stackexchange.com/a/22682/2287
lawlist

Respostas:

6

Como você deseja "Para distinguir melhor entre a janela focada", você pode usar outras maneiras de fazer isso, em vez de apenas alterar a cor da janela ativa.

Combino três maneiras de distinguir melhor entre janelas ativas e inativas.

  1. Use cores diferentes da linha de modo para as janelas ativas e inativas.
  2. Destaque a linha atual em que o ponto está na janela ativa.
  3. Use cores de fundo diferentes para as janelas ativas e inativas.

Observe que todas as cores escolhidas mencionadas acima devem estar funcionando bem com o seu tema Emacs.

Aqui estão as três maneiras:

  1. Use cores diferentes da linha de modo para as janelas ativas e inativas:

    (custom-set-faces
     '(mode-line ((t (:background "dim gray" :foreground "white"))))
     '(mode-line-inactive ((t (:background nil)))))
    
  2. Destaque a linha atual em que o ponto está na janela ativa:

    (global-hl-line-mode 1)
    ;; underline the current line
    (set-face-attribute hl-line-face nil :underline t)
    
  3. Use cores de fundo diferentes para as janelas ativas e inativas:

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

Você pode alterar as cores nos trechos de código para funcionar bem com o seu tema Emacs.

Esta é a captura de tela final:

Captura de tela de três maneiras juntas

E há outra função que você pode usar manualmente para exibir a janela ativa:

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

Você pode alterar a combinação de teclas no trecho de código; quando quiser mostrar a janela ativa, pressionar a tecla, a janela ativa ficará azul; depois que você mover o ponto, a cor desaparecerá.

CodyChan
fonte
0

Eu tive o mesmo problema. Eu comecei a usar o modo de linha inteligente e personalizá-lo para obter cores muito distintas na janela ativa. Aqui está um quadro de amostra. A janela ativa é aquela com a linha de modo preto com letras douradas.

insira a descrição da imagem aqui

Verifique se você precisa da linha de modo inteligente antes de usar este código. Eu recomendo que você o personalize com as cores necessárias:

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

Você pode tentar fazer algo como o seguinte para destacar a janela selecionada no momento. Cuidado para que isso não funcione se os buffers em várias janelas forem os mesmos. Isso escurece todas as outras janelas, exceto a selecionada.

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