O emacsclient
programa permite um sinalizador --no-wait
(abreviado como -n
) que fará com que o servidor emacs visite o arquivo especificado e retorne imediatamente.
emacsclient -n ~/.bashrc
Se eu fornecer um editor alternativo, ele ainda funcionará nos casos em que não houver servidor Emacs em execução
emacsclient -n -a "/usr/local/bin/emacs" ~/.bashrc
No entanto, isso me dá um comportamento inconsistente, porque nos casos em que o servidor está sendo executado, essa chamada retornará imediatamente. Nos casos em que não há servidor em execução e o editor alternativo é usado, a chamada se torna uma chamada de bloqueio e não retornará até que eu saia do Emacs.
Existe uma maneira de dizer emacs
(em oposição a emacsclient
) para criar um novo quadro e depois retornar?
emacsclient
server
nispio
fonte
fonte
-a ''
"iniciar o daemon Emacs e tentar novamente o emacsclient"?-a ''
iniciará um daemon em vez de um servidor. Em seguida, ele tenta abrir um terminal Emacs, mas como eu forneci a-n
opção, ele não fica aberto. Ele apenas volta para a concha.Respostas:
Descrição
O comportamento padrão ao chamar o emacsclient é um pouco conservador. Confira este comentário no emacsclient.c :
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 é poremacsclient -n -a '' FILE
que não satisfaz o que você está procurando quando nenhum servidor está em execução.-a ''
lógica inicia um daemon.emacsclient
ele diz para criar um novo quadro de terminal, porque esse é o padrão, a menos que você esteja avaliando o elisp.-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: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
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.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.
Conclusão
Talvez haja um compromisso? Este é o melhor que eu poderia inventar. Você o define como seu $ EDITOR.
fonte
Não tenho certeza de como fazer isso estritamente no Emacs, mas felizmente existem outras maneiras de obter o que você descreve.
Se você não tem algo
.emacs
para iniciar um servidor, sempre pode criar um pequeno script que inicie o Emacs com o arquivo que você deseja editar e inicie o servidor bifurcado.Algo como:
E depois passe isso para
-a
.No entanto ...
Se você tiver o servidor iniciado no seu
.emacs
computador, não precisará criar um script; você tem uma opção um pouco mais concisa:O e comercial fará o segundo plano do processo e devolva instantaneamente o seu shell, mesmo quando o Emacs for iniciado pela primeira vez.
Pode ser necessário
disown
o processo se o bash matar trabalhos na saída. Se for esse o caso, basta adicionardisown
a no final:No Windows, o equivalente mais próximo seria o
start
comando " " ...Portanto, como a sugestão de script acima, você provavelmente teria que criar um arquivo em lotes que contenha algo como:
E então aponte o
-a
argumento para ele.Isso deve executar o arquivo em lotes e retornar imediatamente após iniciar o Emacs com o arquivo apropriado.
fonte
&
foi a primeira coisa que tentei. Infelizmente, o texto a seguir é enviado parastderr
: e os blocos de terminais aguardando o término do processo:emacsclient: can't find socket; have you started the server? To start the server in Emacs, type "M-x server-start".
Acho que osemacsclient
garfos estão em segundo plano, mas ele invoca oemacs
que é aberto em primeiro plano.emacs --eval '(server-start)' $* &
talvez? Dessa forma, o servidor inicia, você obtém seu terminal eemacsclient
possui um servidor ao qual pode se conectar.emacs
da maneira normal. Me ocorre que a maioria das pessoas provavelmente não teria essa configuração, então essa é a primeira parte da resposta. Espero que ajude..!