Executando o emacsclient com um script

Executando o emacsclient com um script

Estou tentando fazer um script para determinar se emacsclientdevo rodar com -ncou -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 emacsinstâ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 emacsuma chamada simples; quando faço isso, emacsclientele informa que o arquivo de entrada é necessário) e retorne imediatamente.

Responder1

Esse script do Arch Wiki

Esta invocação emacsverifica (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 emacsclientretorne 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 emacsclientpara 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 emacsclientopçã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 emacsprograma 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.

informação relacionada