Estou tentando fazer um script para determinar se emacsclient
devo rodar com -nc
ou -t
. O script é assim (baseado emEsta versão):
#!/bin/sh
if [ -z "$DISPLAY" ]; then
IS_GRAPHICAL=true
else
IS_GRAPHICAL=$(emacs --batch -Q --eval='(if (fboundp '"'"'tool-bar-mode) (message "true") (message "false"))' 2>&1)
fi
if $IS_GRAPHICAL; then
emacsclient -a "" -nc "$@"
else
emacsclient -a "" -t "$@"
fi
No entanto, a emacs --batch -Q ...
linha leva tanto tempo quanto usar uma emacs
instância simples. Se eu comentar esta linha, não recebo nada em vez de uma tela limpa quando isso é executado em um tty. É possível tornar a detecção mais rápida?
Já iniciei um daemon emacs usando uma unidade de usuário systemd. Eu quero emacsclient
:
- ficarno terminal(ou seja, não abra uma janela GUI) se for chamado com um arquivo (por exemplo, chamado por
git-commit
) ou quando um ambiente gráfico não estiver presente (por exemplo, chamado enquanto estiver em tty) e continue executando até sair (C-x C-c
) - abro uma janela GUI quando chamado sem um arquivo (comporte-se como
emacs
uma chamada simples; quando faço isso,emacsclient
ele informa que o arquivo de entrada é necessário) e retorne imediatamente.
Responder1
Esse script do Arch Wiki
Esta invocação emacs
verifica (fboundp 'tool-bar-mode)
se a sua construção do Emacs inclui suporte GUI. É possível construir o Emacs sem ele para economizar um pouco de RAM e espaço em disco¹, mas é incomum. A menos que você se preocupe com a compatibilidade com compilações do Emacs que não possuem suporte a GUI, esqueça esta parte.
Você fica assim com
if [ -n "$DISPLAY" ]; then
emacsclient -a "" -n -c "$@"
else
emacsclient -a "" "$@"
fi
E mesmo esse nível de complexidade é necessário apenas se você quiser que a chamada emacsclient
retorne imediatamente se abrir uma nova janela da GUI. (Se estiver rodando no terminal, ele deverá continuar rodando até você terminar de usar esse terminal.) Cabe a você decidir se gosta desse comportamento. Caso contrário, você pode simplesmente executar
emacsclient -a "" "$@"
E se você iniciar o Emacs com sua sessão de qualquer maneira, por exemplo, como uma unidade systemd, então você não precisa solicitar emacsclient
para iniciá-lo. Então ficamos com
emacsclient "$@"
que não posso simplificar ainda mais.
Seu requisito adicional
- permanecer no terminal (…) se for chamado com um arquivo (…) ou quando o ambiente gráfico não estiver presente (…)
- abra uma janela GUI quando chamada sem um arquivo (…) e retorne imediatamente
Para isso você precisa testar se o script foi chamado com argumentos. Vou assumir que se você passar qualquer emacsclient
opção (por exemplo --eval
), isso conta como um argumento.
if [ $# -ne 0 ]; then
emacsclient -nw "$@"
elif [ -n "$DISPLAY" ]; then
emacsclient -c -n
else
emacsclient -c
fi
¹ Sem suporte de GUI significa que você não precisa ter as bibliotecas necessárias instaladas. O emacs
programa não poderá ser iniciado se as bibliotecas que ele contém não estiverem presentes, mesmo que ele não vá usar os recursos da GUI naquela sessão específica.