Emacs apre i file in un nuovo frame quando viene aperto con "open -a"


20

Voglio essere in grado di invocare Emacs dalla riga di comando e avviare Emacs grafico se non è in esecuzione o visitare un file in un Emacs già in esecuzione. Ho provato a farlo con quello emacsclientche so essere il modo "giusto" per farlo, ma ho avuto molti problemi con esso su OS X, si sarebbe bloccato in modo casuale o il emacs --daemonprocesso si sarebbe bloccato durante l'arresto o il riavvio della macchina, e sfaldamento generale. Anche se mi piacerebbe farlo funzionare, al momento open -afunziona davvero molto meglio, tranne per questo problema che descriverò di seguito:

Usando open -acosì:

$ open -a Emacs file.txt

avvierà Emacs se non è in esecuzione e visiterà il file. Ma se lo faccio quando il buffer corrente non è *scratch*il file viene aperto in un nuovo frame (cioè una nuova finestra di sistema).

Ecco una sessione di esempio:

$ open -a Emacs file.txt

Questo avvia Emacs e apre file.txt, quindi c'è un singolo frame con questo buffer. Se passo al *scratch*buffer e faccio questo:

$ open -a Emacs file1.txt

Apre questo file nello stesso frame. Ora c'è un singolo frame con questo file aperto, e se lo faccio:

$ open -a Emacs file2.txt 

Apre un nuovo frame, risultando in due frame aperti contemporaneamente.

Ho provato a armeggiare con arg dalla riga di comando a Emacs usando l' --argsopzione to open, ma questo non sembra funzionare per le chiamate successive, ad esempio:

$ open -a Emacs --args --eval='(print "foo")'
$ open -a Emacs --args --eval='(print "bar")'

Questo stampa solo "pippo" nel buffer dei messaggi ... la seconda volta che Emacs viene portato in primo piano ma non viene stampato alcun messaggio.

Non sono sicuro di come opencomunica con le applicazioni che sono già in esecuzione, qualcuno sa come potrei scoprirlo? O c'è un modo per ottenere un registro molto più dettagliato di ciò che sta accadendo rispetto al Messagesbuffer? Nulla di interessante è stampato su quel buffer durante la sessione precedente, quindi non so come potrei hackerare alcuni Emacs Lisp per fare quello che voglio ...

Grazie!


Non so nulla di OSX, quindi non posso fornire nulla di concreto. Se dovessi eseguire il debug di questo, però, aggiungerei qualche errore di sintassi find-filee quindi impostare debug-on-errorto e verificare la traccia dello stack per qualche indizio su come viene invocato Emacs. Aggiungere un errore a find-filepotrebbe essere semplice come copiare la definizione della funzione nel buffer scratch lisp e aggiungere una chiamata al suo errorinterno (ad es (error "cause stack trace"). NON CAMBIARE MAI IL FILE SORGENTE find-file- Fallo sempre con un bucher scratch!
Joe Casadonte

@ Grazie Grazie! È una buona idea, lo terrò a mente per il futuro. Alla fine ho provato a usarlo di emacsclientnuovo, e iniziare con il (server-start)mio init.elsembra funzionare meglio rispetto emacs --daemonall'avvio, che è quello che avevo provato la prima volta che ho provato emacsclient.
michiakig,

Risposte:


26

La risposta è qui: variabile emacs da "aprire con" nel frame originale

È una modifica alle impostazioni predefinite nelle versioni più recenti di emacs. Inserisci:

(setq ns-pop-up-frames nil)

nel file .emacs.

Molto felice di averlo trovato.


Questo è stato molto utile! Insieme ad un alias le open -a /Applications/Emacs.app $1cose sembrano funzionare bene! Nota che avvio il server nel mio init, ad esempio per avere emacs disponibili per git.
Dror,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.