Faça com que o emacsclient crie um quadro apenas se ainda não houver um

11

Como posso emacsclient -a '' -ncriar um novo quadro apenas se já não houver um?

O problema com o -csinalizador é que ele cria um novo quadro sempre. O problema é que, se não houver um quadro aberto, ele será aberto na linha de comando.

Se eu puder verificar se há um quadro Emacs aberto no shell, posso ligar com ou sem, -cdependendo disso, para obter o comportamento que desejo. Eu tentei:

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

Eu sempre obtenho o mesmo resultado.

Eu poderia usar arquivos temporários ou pgrep, mas essas abordagens são muito propensas a erros.

Isso é semelhante a essa pergunta , mas não é uma duplicata, pois o OP estava satisfeito em ter que abrir um quadro antes de ligar emacsclient.

spelufo
fonte
1
A mesma pergunta superuser.com/questions/358037/... com elisp, bashe shrespostas.
Konstantin Morenko

Respostas:

3

Acabei fazendo esse script com base nisso

#!/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 não houver visor, ele abre com -nw. Se $DISPLAYestiver definido, ele procura quadros na tela para ver se precisa criar um novo.

Editar: modifiquei para que você possa especificar manualmente -nwse deseja abrir em um terminal, mesmo que exista um monitor.

spelufo
fonte
1
Nitpick menor: $@ deve ser citado .
precisa saber é o seguinte
0

Você pode usar:

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

para verificar se o servidor Emacs "server_name"já está em execução. Se o comando retornar o código de saída 0, ele está sendo executado. Nesse caso, basta usar o emacsclientcomando:

emacsclient -s server_name -n file_name.txt

Se não estiver em execução, você pode abrir um novo servidor Emacs com, por exemplo:

emacs --eval '(setq server-name "server_name")' --eval '(server-start)' file_name.txt &
Håkon Hægland
fonte
Mas assim que você fechar o shell, você matará o servidor, certo? As emacsclient -a ''partidas emacs --daemonse necessário, que persiste mesmo se você fechar o shell.
Spelufo
@ spelufo O servidor não é morto matando o shell. Observe o &no final do comando; isso significa para executar o servidor como um processo de fundo ..
Håkon Hægland
O que o bifurca no fundo do shell atual. Ele não é morto quando você recupera seu shell, mas é morto quando você fecha esse shell completamente ( C-d).
Spelufo
O daemon continua funcionando mesmo se você fechar todos os seus terminais. Ele continuaria em execução se server-startiniciar o servidor como processo daemon. O que você ganha se iniciar o emacs dessa maneira e depois fechar todos os emacs e terminais, abrir um novo terminal e executar pgrep emacs?
Spelufo
@spelufo Na verdade, ele ainda está correndo atrás C-d. Eu tentei isso agora usando gnome-terminalno Ubuntu 14.10 .. Acho que você está se referindo a uma instância em execução após fechar todos os quadros do Emacs? Então, que exigiria um processo daemon sim ..
Håkon Hægland