Inicie dois daemons emacs separados para console e GUI

14

Normalmente, inicio o emacs com a GUI e inicio um servidor imediatamente (server-start). Agora eu posso facilmente abrir documentos na minha sessão emacs existente a partir do terminal via emacsclient -n <file>ou no Navegador de Arquivos.

De tempos em tempos, no entanto, quero executar o emacs dentro do meu terminal usando emacsclient -t. Isso acontece com mais freqüência ao gravar logs de confirmação do git ou executar outras tarefas muito pequenas. Nesses casos, o fato de o meu arquivo init ter sido carregado em uma instância da GUI do emacs significa que eu não recebo nenhuma das minhas personalizações específicas do TTY emacs.

Eu sei que posso correr

emacs -nw -q -l "some-custom-init-file.el"

mas isso recarregará todos os pacotes sempre. Posso ter o melhor dos dois mundos? Existe uma maneira de configurar um "daemon TTY" para que eu possa usar personalizações separadas para executar dentro do terminal e visitar o arquivo em uma janela existente do emacs?

nispio
fonte
1
Você pode apontar para um exemplo de suas personalizações diferentes entre os modos TTY e GUI?
Stsquad 23/09/14
1
@stsquad Um realmente simples é que eu uso uma margem esquerda no modo GUI, mas como a margem não existe no modo TTY, não há espaço entre os números das linhas e o texto. Isso pode ser corrigido (setq linum-format "%d ")no arquivo de personalização TTY. Além disso, meu tema de cores sempre parece estranho no modo TTY, por isso vou escolher um tema diferente para o TTY. Na verdade, não tenho muitas diferenças no momento, mas agora que sei que posso ter servidores diferentes, a lista pode aumentar.
Nispio 23/09/14
@nispio: Eu sugiro que você M-x report-emacs-bugsolicite novos recursos, como a capacidade de ter diferentes temas de rosto em TTY e em quadros de GUI (na verdade, um tema pode especificar cores completamente diferentes para esses tipos de quadros, para que você também possa ajustar seu tema) . Usar vários daemons para esses casos separados é apenas uma solução alternativa para a falta de funcionalidade correspondente no Emacs.
Stefan

Respostas:

14

Use emacs --daemon=your-server-name -l "custom-init-file"para iniciar um novo servidor e emacsclient -nw -s your-server-nameconectar-se a ele a partir do próprio terminal. A seção Usando o Emacs como servidor no manual possui mais opções de inicialização.

Vamsi
fonte
Isso funciona! Existe uma boa maneira de matar um servidor iniciado dessa maneira, além de procurar e excluir o arquivo do servidor?
Nispio 23/09/14
(Eu tinha para adicionar uma -qchave para manter o meu padrão init.elde correr antes que o arquivo de inicialização personalizada.)
nispio
2
Faz o emacsclient -s your-server-name -e "(kill-emacs)"que você quer? O exemplo acima chama apenas emacsclient e evals (kill-emacs). Você poderia substituir (kill-emacs)com (save-buffers-kill-emacs)bem.
Vamsi 23/09
Eu costumava ter um init.el comum para o terminal e gui emacs e carregava arquivos personalizados separados para personalizações individuais. Daí eu perdi o-q
Vamsi
1
Essas soluções também corrigiram um problema que tive ao usar 'emacsclient -t' com mutt e, em uma área de trabalho separada, 'emacsclient -c'. Simplificando: o daemon estava travando quando o 'emacsclient -c' foi acionado antes do 'emacsclient -t'. Obrigado, Vamsi
Boccaperta-IT
9

Além da resposta do @ Vamsi, você pode obter muitos dos mesmos benefícios enquanto executa apenas um único servidor anexando conselhos make-frame-command.

Por exemplo, enquanto estiver rodando no terminal, quero que a cor do plano de fundo seja black(que mapeie #202020), mas quero usar #202020no modo gráfico. Eu implementei isso com:

(defadvice make-frame-command (after make-frame-change-background-color last activate)
  "Adjusts the background color for different frame types. 
Graphical (X) frames should have the theme color, while terminal frames should match the terminal color (which matches the theme color...but terminal frames can't directly render this color)"
    (if (display-graphic-p)
        (set-background-color "#202020")
      (set-background-color "black")))

Você pode obter muita quilometragem disso usando make-variable-frame-local( set-background-coloro quadro acima já é local do quadro).

Não sei se esse é o melhor padrão, mas se você tiver relativamente poucas diferenças entre o Emacs no modo TTY e no modo X, ele poderá facilitar o gerenciamento da configuração.

O código acima foi retirado do meu .emacs.d .

J David Smith
fonte
Fiquei me perguntando se havia alguma maneira de "detectar" em que modo estou em uma base por quadro.
nispio 24/09/14
1
Isso fará isso. (display-graphic-p)tse o quadro atual é gráfico, nilcaso contrário. Como os quadros não podem ser movidos entre gráficos e não (afaik), anexar conselhos à criação de quadros garante que o estado desejado seja alcançado para o quadro fornecido.
J David Smith
Esta é definitivamente a resposta mais conveniente.
Malabarba
4

Você não precisa de um conselho para alterar as configurações de diferentes quadros em execução no mesmo daemon do emacs. Basta usar o gancho after-make-frame-functionsassim

(defvar my/ttheme 'tango-dark)
(defvar my/gtheme 'tango)
(defun my/frame-configuration (frame)
  "configure the current frame depending on the frame type"
  (with-selected-frame frame
    (if (display-graphic-p)
        (progn
          (message "after-make-frame-functions hook: window system")
          (set-frame-size frame 115 60)
          ;; other settings for a graphical frame
          (load-theme my/gtheme t))
      (message "after-make-frame-functions hook: text console")
      (load-theme my/ttheme t)
      (set-frame-parameter frame 'menu-bar-lines 0))))

(add-hook 'after-make-frame-functions 'my/frame-configuration)

;; normal start without daemon
(if (not (daemonp))
  (my/frame-configuration (selected-frame)))

A definição desta maneira tem o bônus adicional, que define a configuração de quadro desejada, mesmo que você não inicie no modo daemon.

Infelizmente, o load-themequadro não é local e, portanto, os outros quadros também ficam coloridos se você realmente usar temas diferentes para quadros gráficos e de texto.

Informações sobre bônus: configure seus terminais com pelo menos 256 cores para obter a sensação real do tema selecionado. Use uma configuração como esta em um dos seus arquivos de inicialização do shell:

TERM=xterm-256color
export TERM
Uwe Koloska
fonte
Nem todos os terminais suportam 256 cores, por exemplo, o xfce4-terminal ainda tem apenas 8 (mudei para sakura para as cores bonitas).
Unhammer