Temas diferentes para quadros gráficos e terminais ao usar o daemon Emacs

20

Estou tentando alcançar o seguinte comportamento no Emacs24:

Gosto de usar um tema diferente (solarizado-escuro vs. solarizado-luz), dependendo de eu me conectar ao servidor em execução com um quadro de terminal

% emacsclient -t

ou com um quadro gtk

% emacsclient -c

Isso parece ter funcionado no Emacs mais antigo, mas no Emacs atual eu não consegui encontrar uma maneira. Eu já verifiquei o SO (por exemplo, /programming//q/18904529/152439 e respostas) e as listas de discussão (por exemplo, https://lists.gnu.org/archive/html/help-gnu-emacs/ 2012-02 / msg00227.html e https://lists.gnu.org/archive/html/help-gnu-emacs/2012-02/msg00237.html ).

Minha configuração atual é assim:

(add-to-list 'custom-theme-load-path "~/.emacs.d/themes/solarized")
(if (daemonp)
  (add-hook 'after-make-frame-functions
    (lambda (frame)
      (select-frame frame)
      (if (display-graphic-p frame)
        (load-theme 'solarized-light t)
        (load-theme 'solarized-dark t)
      )
    )
  )
  (load-theme 'solarized-light t)
)

O problema com isso é que, se eu tiver um quadro gráfico aberto e, em seguida, abrir um quadro de terminal emacsclient -t, o tema escuro-solarizado será aplicado ao novo quadro de terminal (correto) e ao quadro gráfico já aberto (que deve ser deixado intocado, idealmente). O equivalente acontece quando um quadro terminal já está aberto e eu abro um novo quadro gráfico com emacsclient -c.

EDIT: Caso isso não seja possível com o Emacs24 atual, existem planos para torná-lo possível novamente?

andreas-h
fonte
1
Afaik (a partir de outra pesquisa com esse mesmo objetivo), a antiga implementação do tema de cores permitiu algumas configurações por buffer. Com o emacs 24, veio um suporte de tema interno (conhecido como deftheme ou load-theme), que não suporta isso: o tema é o mesmo para toda a sessão do emacs. Para esse tipo de configuração, talvez você possa gerenciar um hack aceitável sempre carregando solarized-dark e usando o sinalizador -rv para iniciar os quadros gráficos, mas estará longe de ser perfeito.
T. Verron
Uma solução alternativa é executar clientes separados para o terminal e a GUI, conforme discutido aqui: emacs.stackexchange.com/q/41/93 Dependendo do seu fluxo de trabalho, essa pode não ser uma solução viável. Funciona para mim porque estou executando diferentes tipos de tarefas em cada uma, com pouca ou nenhuma sobreposição.
Nispio 12/12
Se o tema interno do emacs24 não atender às suas necessidades, você sempre poderá usar o color-theme.elIIRC que possui configurações de cores dependentes do quadro. Não há grande vantagem em usar os recursos de temas embutidos além da onipresença.
Vamsi 12/10
2
O color-theme-buffer-local fornece suporte a temas buffer-local para os color-themesistemas temáticos Emacs 24. Minha versão do tema solarizado também suporta os dois sistemas, se você decidir seguir esse caminho.
Sanityinc # 13/14
@sanityinc Obrigado; Estou usando o Emacs 24.3 e parece haver alguns problemas, consulte github.com/vic/color-theme-buffer-local/issues/5 . Mas vou ficar de olho no projeto.
andreas-h

Respostas:

8

Você não pode fazer isso usando temas diferentes. A solução é criar um tema com diferentes definições de face, dependendo do terminal. Se você olhar um exemplo font-lock-comment-face, verá como ele funciona. Em vez de especificar, ((class color) (min-colors 88) (background dark))você também pode especificar (type tty)ou (type graphic)etc. O manual tem mais informações .

(defface font-lock-comment-face
  '((((class grayscale) (background light))
 :foreground "DimGray" :weight bold :slant italic)
(((class grayscale) (background dark))
 :foreground "LightGray" :weight bold :slant italic)
(((class color) (min-colors 88) (background light))
 :foreground "Firebrick")
(((class color) (min-colors 88) (background dark))
 :foreground "chocolate1")
(((class color) (min-colors 16) (background light))
 :foreground "red")
(((class color) (min-colors 16) (background dark))
 :foreground "red1")
(((class color) (min-colors 8) (background light))
 :foreground "red")
(((class color) (min-colors 8) (background dark))
 :foreground "yellow")
(t :weight bold :slant italic))
  "Font Lock mode face used to highlight comments."
  :group 'font-lock-faces)

Eu acho que você poderia escrever uma função que pega dois temas e produz um tema mesclado, com faces de um tema sendo atribuídas (type tty)e faces de outro tema sendo atribuídas, (type graphic)onde ambos os temas originais são usados t.

Alex Schröder
fonte
6

O color-theme-buffer-local fornece suporte ao tema buffer-local para os sistemas de tema color-theme e Emacs 24. Minha versão do tema solarizado também suporta os dois sistemas, se você decidir seguir esse caminho.

sanityinc
fonte
obrigado pelo ponteiro para a sua versão do solarized, eu realmente gosto!
Andreas-h
2

Você pode definir condições para personalizações de face, como "modo terminal" ou "cores mínimas" no editor de personalização:

Ao personalizar um rosto, clique no botão [State] e selecione "Show all display specs". Depois, você pode configurar as condições para uma maior especialização do rosto.

Aqui está uma variante mínima para definir a cor do plano de fundo como preto quando o quadro é um tty:

(custom-set-faces
 '(default (
            (((type tty) (min-colors 256))
             (:background "black"))
            (t
             (:background "#181a26")))
    ))
TheJJ
fonte