Crea emacsclient crea un frame solo se non ce n'è già uno


11

Come posso emacsclient -a '' -ncreare un nuovo frame solo se non ce n'è già uno?

Il problema con la -cbandiera è che crea sempre una nuova cornice. Il problema senza di esso è che se non ci sono frame aperti, si aprirà nella riga di comando.

Se riesco a verificare se esiste un frame Emacs aperto dalla shell, posso chiamare con o senza a -cseconda di quello per ottenere il comportamento che desidero. Provai:

$ emacsclient -a '' --eval '(frames-on-display-list)'
(#<frame F1 0xba2740>)

Ottengo sempre lo stesso risultato.

Potrei usare file temporanei o pgrep, ma quegli approcci sono molto inclini agli errori.

Questo è simile a questa domanda , ma non è un duplicato, dal momento che l'OP era soddisfatto della necessità di avere un frame aperto prima di chiamare emacsclient.


1
La stessa domanda superuser.com/questions/358037/... con elisp, bashe shrisposte.
Konstantin Morenko,

Risposte:


3

Ho finito per fare questo script basato su questo

#!/bin/bash -e

if [[ "$DISPLAY" ]]; then
        frame=`emacsclient -a '' -e "(member \"$DISPLAY\" (mapcar 'terminal-name (frames-on-display-list)))" 2>/dev/null`
        [[ "$frame" == "nil" ]] && opts='-c' # if there is no frame open create one
        [[ "${@/#-nw/}" == "$@" ]] && opts="$opts -n" # don't wait unless we've asked to run in a terminal
else
        opts='-nw'
fi

exec emacsclient -a '' $opts "$@"

Se non è presente alcun display, si apre con -nw. Se $DISPLAYimpostato, cerca i frame in quel display per vedere se è necessario crearne uno nuovo.

Modifica: l'ho modificato in modo da poter specificare manualmente -nwse si desidera aprire in un terminale anche se è presente un display.


1
Minore nitpick: $@ dovrebbe essere citato .
pastore

0

Puoi usare:

emacsclient -s server_name -e '(+ 1 0)' >/dev/null 2>&1

per verificare se il server Emacs "server_name"è già in esecuzione. Se il comando restituisce il codice di uscita 0, è in esecuzione. In tal caso, basta usare il emacsclientcomando:

emacsclient -s server_name -n file_name.txt

Se non è in esecuzione, è possibile aprire un nuovo server Emacs con ad esempio:

emacs --eval '(setq server-name "server_name")' --eval '(server-start)' file_name.txt &

Ma in questo modo una volta chiusa la shell ucciderai il server, giusto? L' emacsclient -a ''avvio emacs --daemonse necessario, che persiste anche se si chiude il guscio.
spelufo,

@spelufo Il server non viene ucciso uccidendo la shell. Nota &alla fine del comando; significa eseguire il server come processo in background ..
Håkon Hægland

Il che lo forks sullo sfondo della shell corrente. Non viene ucciso quando torni indietro la shell, ma viene ucciso quando chiudi completamente quella shell ( C-d).
spelufo,

Il demone continua a funzionare anche se chiudi tutti i tuoi terminali. Continuerebbe a funzionare solo se server-startavvia il server come processo daemon. Cosa ottieni se avvii emacs in quel modo e poi chiudi tutti gli emacs e i terminali, quindi apri un nuovo terminale ed esegui pgrep emacs?
spelufo,

@spelufo In realtà è ancora in esecuzione dopo C-d. L'ho provato ora usando gnome-terminalUbuntu 14.10 .. Penso che ti riferisci a un'istanza in esecuzione dopo aver chiuso tutti i frame di Emacs? Quindi, ciò richiederebbe un processo daemon sì ..
Håkon Hægland il
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.