Descrição
O comportamento padrão ao chamar o emacsclient é um pouco conservador. Confira este comentário no
emacsclient.c :
/* Unless we are certain we don't want to occupy the tty, send our
tty information to Emacs. For example, in daemon mode Emacs may
need to occupy this tty if no other frame is available. */
A partir de sua descrição e comentários, parece que você está tentando iniciar o servidor Emacs sob demanda enquanto também usa a -n
sinalização. O comentário "por exemplo" aqui é por emacsclient -n -a '' FILE
que não satisfaz o que você está procurando quando nenhum servidor está em execução.
- A
-a ''
lógica inicia um daemon.
- Depois,
emacsclient
ele diz para criar um novo quadro de terminal, porque esse é o padrão, a menos que você esteja avaliando o elisp.
- A
-n
lógica mata imediatamente esse novo quadro de terminais.
Se você pudesse alterar a Etapa 2 para criar um novo quadro gráfico por padrão,
emacsclient -n -a '' FILE
faça o que quiser.
Solução Elisp
Você pode fazer com que o Emacs crie um novo quadro gráfico por padrão, se você aconselhar a função da seguinte server-process-filter
maneira:
(defadvice server-process-filter (before prefer-graphical activate)
;; STRING is a sequence of commands sent from emacsclient to the server.
(when (and
;; Check that we're editing a file, as opposed to evaluating elisp.
(string-match "-file" string)
;; Check that there are no frames beyond the Emacs daemon's terminal.
(daemonp)
(null (cdr (frame-list)))
(eq (selected-frame) terminal-frame)
;; Check that we have a graphical display.
;; `display-graphic-p' doesn't work here.
(getenv "DISPLAY"))
(setq string (concat
;; STRING must be all one line, but comes to us
;; newline-terminated. Strip off the trailing newline.
(replace-regexp-in-string "\n$" "" string)
;; Add the commands to create a graphical frame.
"-window-system "
"-display " (getenv "DISPLAY")
;; Add back the newline.
"\n"))))
Coloque isso no seu arquivo init, então, como disse, emacsclient -n -a '' FILE
e Bob é seu tio.
Compare com a Solução Shell
Por um lado, posso apontar algumas vantagens em usar essa abordagem de defadvice em comparação com o
script sugerido por Archenoth
#!/bin/bash
emacs --eval '(server-start)' $* &
como o editor alternativo. Com o defadvice:
save-buffers-kill-terminal
( C-x C-c
por padrão) se comporta de maneira consistente em todos os quadros. Ele nunca mata o processo Emacs, porque cada quadro é sempre um quadro de cliente.
- O quadro terminal do daemon fica pendurado. Comandos como
find-grep
esse que são projetados para processos externos se comportam melhor quando o terminal burro está lá. Pelo menos, experimento menos dores de cabeça relacionadas à fuga de conchas.
Por outro lado ... sim.
- Esse script de shell é lindamente simples.
- Aconselhar o protocolo de comunicação do Emacs não é.
Conclusão
Talvez haja um compromisso? Este é o melhor que eu poderia inventar. Você o define como seu $ EDITOR.
#!/bin/sh
emacsclient -e "(frames-on-display-list \"${DISPLAY}\")" 1>/dev/null 2>/dev/null
if [ "$?" = "1" ]; then
emacsclient -c -n -a "" "$@"
else
emacsclient -n "$@"
fi
-a ''
"iniciar o daemon Emacs e tentar novamente o emacsclient"?