Eu quero ser capaz de invocar o Emacs a partir da linha de comando e começar o Emacs gráfico se ele não estiver rodando ou visitar um arquivo em um Emacs já em execução. Eu tentei fazer isso com emacsclient
que eu sei que é a maneira "certa" de fazer isso, mas eu tive um monte de problemas com ele no OS X, seria aleatoriamente falha, ou o processo emacs --daemon
iria travar durante o fechamento para baixo ou reiniciar a máquina e descamação geral. Embora eu queira que isso funcione, no momento o open -a
funciona muito melhor, exceto por esse problema que descreverei abaixo:
Usando open -a
assim:
$ open -a Emacs file.txt
iniciará o Emacs se ele não estiver em execução e visitará o arquivo. Mas se eu fizer isso quando o buffer atual não for *scratch*
, o arquivo será aberto em um novo quadro (ou seja, uma nova janela do sistema).
Veja um exemplo de sessão:
$ open -a Emacs file.txt
Isso inicia o Emacs e abre o arquivo.txt, então há um único quadro com esse buffer nele. Se eu mudar para o buffer *scratch*
, e faça isso:
$ open -a Emacs file1.txt
Abre este 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 brincar com args de linha de comando para o Emacs usando a opção --args
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 só imprime "foo" no buffer de mensagem ... a segunda vez que o Emacs é trazido para o primeiro plano, mas nenhuma mensagem é impressa.
Não sei ao certo como open
se comunica com aplicativos que já estão em execução. Alguém sabe como posso descobrir? Ou há alguma maneira de obter um log mais detalhado do que está acontecendo do que o buffer Messages
? Nada de interessante é impresso nesse buffer durante a sessão acima, então eu não sei como eu poderia hackear algum Emacs Lisp para fazer o que eu quero ...
Obrigado!