O Emacs abre arquivos em um novo quadro quando aberto com "open -a"

20

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!

michiakig
fonte
Eu não sei nada sobre o OSX, então não posso fornecer nada concreto. Se eu depurar isso, porém, lançaria algum erro de sintaxe find-filee, em seguida, definiria debug-on-errorpara verificar o rastreamento de pilha para obter alguma pista sobre como o Emacs está sendo chamado. Adicionar um erro find-filepode ser tão simples quanto copiar a definição da função para o buffer scratch lisp e adicionar uma chamada errornele (por exemplo: (error "cause stack trace")NUNCA ALTERAR O ARQUIVO DE ORIGEM find-file- sempre faça isso em um buffer scratch!
Joe Casadonte
@ Joe Thanks! Essa é uma boa idéia, vou ter em mente para o futuro. Na verdade, acabei tentando usar 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.
Michiakig

Respostas:

26

A resposta está aqui: variável emacs para "abrir com" no quadro original

É uma alteração nas configurações padrão nas versões mais recentes do emacs. Adicionar:

(setq ns-pop-up-frames nil)

para o arquivo .emacs.

Muito feliz por ter encontrado isso.

Colin
fonte
Isso foi muito útil! Juntamente com um apelido, as open -a /Applications/Emacs.app $1coisas parecem funcionar bem! Note que inicio o servidor no meu init, para ter o emacs disponível para o git, por exemplo.
Dror