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.