Alterar o modo-linha-buffer-id face para janelas inativas

8

Existe uma face do Emacs que pode ser usada para controlar a cor dos nomes de buffer inativos?

Normalmente, ao definir o rosto, mode-line-buffer-idtodas as janelas são afetadas.

Neste exemplo, o arquivo mode-linepossui um fundo claro, então defino mode-line-buffer-idpara um muito mais escuro #333.

linha de modo com ID de buffer escuro em fundo claro

A idéia é inverter a combinação de cores para for mode-line-inactive.

Embora isso seja possível para a maior parte do texto na linha de modo das janelas inativas, os nomes dos buffers ficam ilegíveis, pois ainda são controlados pela mode-line-buffer-idface.

modo-linha-inativo com id de buffer escuro em fundo escuro

Acredito que definir mode-line-inactiveum pano de fundo mais claro contornaria o problema, mas esse não é o resultado que desejo alcançar.


fonte
Aqui está um link para um exemplo que personaliza vários aspectos do modo de linha: amitp.blogspot.com/2011/08/emacs-custom-mode-line.html
lawlist
Você pode remapear a cara quando as alterações de buffer ativos, conforme descrito aqui: emacs.stackexchange.com/a/14658/780
glucas

Respostas:

3

Não tenho certeza se você ainda está procurando uma resposta ou não, mas esse foi o único resultado que obtive no Google enquanto tentava fazer isso sozinho.

De qualquer forma, por qualquer motivo que o Emacs chama distant-foregroundassim, a única coisa que você realmente precisa fazer é adicionar :distant-foreground $colour-of-choiceà sua cara.

Valentijn
fonte
1

Aqui está uma variação de outra resposta que pode ajudar. Este exemplo remapeia mode-line-buffer-idpara ficar verde em buffers inativos.

(defun toggle-mode-line-buffer-id-face (window)
  "Update the `mode-line-buffer-id' face in WINDOW dependening on
whether the window is selected."
  (with-current-buffer (window-buffer window)
(if (eq (current-buffer) (window-buffer (selected-window)))
    (face-remap-reset-base 'mode-line-buffer-id)
  (face-remap-set-base 'mode-line-buffer-id '(:foreground "green")))))

(add-hook 'buffer-list-update-hook (lambda () (walk-windows #'toggle-mode-line-buffer-id-face nil t)))

Atualização: conforme observado nos comentários, isso não resolve completamente o problema. Quando você tem várias janelas visíveis visitando o mesmo buffer, todas elas compartilham a mesma face.

glucas
fonte
Infelizmente, um buffer pode ser visível em mais de uma janela, onde uma pode estar ativa e outra inativa.
precisa saber é o seguinte
É verdade que o remapeamento de face se aplica ao buffer e não à janela.
glucas
1

Essa é uma variação das outras respostas, com essa distinção entre janelas ativas e inativas. Se um buffer estiver visível em mais de uma janela, somente a janela ativa terá ml-active-window-facee as outras janelas terão ml-inactive-window-face.

(defvar ml-selected-window nil)

(defun ml-record-selected-window ()
  (setq ml-selected-window (selected-window)))

(defun ml-update-all ()
  (force-mode-line-update t))

(add-hook 'post-command-hook 'ml-record-selected-window)

(add-hook 'buffer-list-update-hook 'ml-update-all)

(defface ml-active-window-face
   '((t (:foreground "red")))
   "Face for active buffer identification.")

(defface ml-inactive-window-face
   '((t (:foreground "green")))
   "Face for inactive buffer identification.")

(defun ml-propertized-buffer-identification (fmt)
  "Return a list suitable for `mode-line-buffer-identification'.
FMT is a format specifier such as \"%12b\".  This function adds
text properties for face, help-echo, and local-map to it."
  (list (propertize fmt
        'face
          (if (eq ml-selected-window (selected-window))
            'ml-active-window-face
            'ml-inactive-window-face)
        'help-echo
        (purecopy "Buffer name
mouse-1: Previous buffer\nmouse-3: Next buffer")
        'mouse-face 'mode-line-highlight
        'local-map mode-line-buffer-identification-keymap)))

(setq-default mode-line-buffer-identification
  '(:eval (ml-propertized-buffer-identification "%12b")))

Exemplo

lista de leis
fonte
0

Não tenho certeza se é possível. Parece que a linha de modo é atualizada somente quando sua janela é selecionada (teste usando chamadas para comprovar messageisso). E o código que faz isso é o código C, não o Lisp.

Você pode usar uma expressão condicional na definição de mode-line-buffer-identification, para que a face a ser usada seja computada dinamicamente. Mas não conheço nenhuma função ou variável que você possa usar para testar se uma determinada janela possui uma linha de modo inativa.

Você não pode usar selected-window, por exemplo, porque isso sempre aponta para a janela com a linha de modo ativa.

Aqui está um exemplo de atualização dinâmica baseada no nome do buffer. Não é o que você deseja, mas pelo menos mostra o que você pode fazer. Se você puder encontrar uma maneira de testar se a janela que está sendo atualizada está selecionada, poderá substituí-la pelo teste de nome do buffer. (Mas minha impressão é que apenas a janela selecionada recebe sua linha de modo atualizada.)

(setq-default mode-line-buffer-identification
              '(:eval
                (list (propertize "%b"
                       'face (if ;; NOPE (eq (selected-window) (get-buffer-window (current-buffer)))
                                 (eq (current-buffer) (get-buffer "some-buffer"))
                                 'mode-line-buffer-id
                               'some-other-face)
                       'help-echo "Buffer name mouse-1: Previous buffer\nmouse-3: Next buffer"
                       'mouse-face 'mode-line-highlight
                       'local-map mode-line-buffer-identification-keymap))))

Outra coisa que você pode tentar é aconselhar a função format-mode-line. Aparentemente, distingue uma janela com uma linha de modo ativa de uma com uma linha de modo inativa. Mas também está codificado em C, então duvido que você vá muito longe ao aconselhá-lo. Testa a variável C Qmode_line_inactive, FWIW.

Eu sugiro fazer essa pergunta em uma das listas de discussão do Emacs (por exemplo [email protected]), se você não receber uma resposta satisfatória aqui. Parece que seria bom poder fazer o que você solicitou. +1 para a pergunta, em qualquer caso.

Desenhou
fonte
1
Apenas para completar a resposta de Drew, a detecção ativa do buffer e as faces específicas do modo-linha-ID-buffer para buffers ativos e inativos são feitas em powerline . Se você deseja investigar o código, um bom ponto de partida é a função powerline-default-theme definida em powerline-themes.el
deb0ch