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 emacsclientque sei ser a maneira "certa" de fazer isso, mas tive muitos problemas com ele no OS X, ele falhou aleatoriamente ou o emacs --daemonprocesso 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 -averdade, funciona muito melhor, exceto por este problema que descreverei abaixo:
Usando open -aassim:
$ 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 --argsswitch 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 opencomunica 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 Messagesbuffer? 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!
emacsclientnovamente, e iniciá-lo (server-start)no meu init.elparece estar funcionando melhor do que emacs --daemonna inicialização, que é o que eu estava tentando na primeira vez que tentei emacsclient.
find-filee, em seguida, definiriadebug-on-errorpara verificar o rastreamento de pilha para obter alguma pista sobre como o Emacs está sendo chamado. Adicionar um errofind-filepode ser tão simples quanto copiar a definição da função para o buffer scratch lisp e adicionar uma chamadaerrornele (por exemplo:(error "cause stack trace")NUNCA ALTERAR O ARQUIVO DE ORIGEMfind-file- sempre faça isso em um buffer scratch!