Quero poder invocar o Emacs a partir da linha de comando e iniciar o Emacs gráfico, se não estiver em execução, ou visitar um arquivo em um Emacs já em execução. Tentei fazer isso com o emacsclient
que sei ser a maneira "certa" de fazer isso, mas tive muitos problemas com ele no OS X, ele falhou aleatoriamente ou o emacs --daemon
processo travou durante o desligamento ou a reinicialização da máquina, e descamação geral. Enquanto eu gostaria que isso funcionasse, no momento, na open -a
verdade, funciona muito melhor, exceto por este problema que descreverei abaixo:
Usando open -a
assim:
$ open -a Emacs file.txt
iniciará o Emacs se não estiver em execução e visite o arquivo. Mas se eu fizer isso quando o buffer atual não estiver, *scratch*
o arquivo será aberto em um novo quadro (ou seja, uma nova janela do sistema).
Aqui está uma sessão de exemplo:
$ open -a Emacs file.txt
Isso inicia o Emacs e abre o arquivo.txt, então há um único quadro com esse buffer. Se eu mudar para o *scratch*
buffer, faça o seguinte:
$ open -a Emacs file1.txt
Ele abre esse arquivo no mesmo quadro. Agora há um único quadro com este arquivo aberto, e se eu fizer isso:
$ open -a Emacs file2.txt
Ele abre um novo quadro, resultando em dois quadros abertos ao mesmo tempo.
Eu tentei mexer com argumentos de linha de comando para o Emacs usando o --args
switch para open
, mas isso não parece funcionar para chamadas subseqüentes, por exemplo:
$ open -a Emacs --args --eval='(print "foo")'
$ open -a Emacs --args --eval='(print "bar")'
Isso apenas imprime "foo" no buffer de mensagens ... na segunda vez que o Emacs é trazido para o primeiro plano, mas nenhuma mensagem é impressa.
Não sei como se open
comunica com aplicativos que já estão em execução. Alguém sabe como eu poderia descobrir? Ou existe alguma maneira de obter um log muito mais detalhado do que está acontecendo do que o Messages
buffer? Nada interessante é impresso nesse buffer durante a sessão acima, então não sei como eu poderia hackear alguns Emacs Lisp para fazer o que eu quero ...
Obrigado!
emacsclient
novamente, e iniciá-lo (server-start)
no meu init.el
parece estar funcionando melhor do que emacs --daemon
na inicialização, que é o que eu estava tentando na primeira vez que tentei emacsclient
.
find-file
e, em seguida, definiriadebug-on-error
para verificar o rastreamento de pilha para obter alguma pista sobre como o Emacs está sendo chamado. Adicionar um errofind-file
pode ser tão simples quanto copiar a definição da função para o buffer scratch lisp e adicionar uma chamadaerror
nele (por exemplo:(error "cause stack trace")
NUNCA ALTERAR O ARQUIVO DE ORIGEMfind-file
- sempre faça isso em um buffer scratch!