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 emacsclient
che 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 --daemon
processo si sarebbe bloccato durante l'arresto o il riavvio della macchina, e sfaldamento generale. Anche se mi piacerebbe farlo funzionare, al momento open -a
funziona davvero molto meglio, tranne per questo problema che descriverò di seguito:
Usando open -a
così:
$ 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' --args
opzione 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 open
comunica 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 Messages
buffer? 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!
emacsclient
nuovo, e iniziare con il (server-start)
mio init.el
sembra funzionare meglio rispetto emacs --daemon
all'avvio, che è quello che avevo provato la prima volta che ho provato emacsclient
.
find-file
e quindi impostaredebug-on-error
to e verificare la traccia dello stack per qualche indizio su come viene invocato Emacs. Aggiungere un errore afind-file
potrebbe essere semplice come copiare la definizione della funzione nel buffer scratch lisp e aggiungere una chiamata al suoerror
interno (ad es(error "cause stack trace")
. NON CAMBIARE MAI IL FILE SORGENTEfind-file
- Fallo sempre con un bucher scratch!