Executando o emacsclient com um script

1

Estou tentando criar um script para determinar se emacsclient deve ser executado com -nc ou -t . O script é assim:

#!/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 linha emacs --batch -Q ... demora tanto quanto usar uma instância emacs nua. Se eu comentar esta linha, no entanto, eu não recebo nada em vez de uma limpeza de tela quando isso é executado sob um tty. É possível tornar a detecção mais rápida?

EDIT : Eu já iniciei o daemon emacs por uma unidade de usuário do systemd. Eu quero que emacsclient seja uma janela (X11) quando lançado via dmenu ou gmrun , mas no terminal quando lançado no terminal (do shell ou git ).

EDIT2 : não me expressei claramente. Eu quero que o script se comporte assim:

  • permanecer no terminal (isto é, não abrir uma janela GUI) se chamado com um arquivo (por exemplo, chamado por git-commit ) ou quando o ambiente gráfico não estiver presente (por exemplo, chamado em tty) e não retorne até sair ( C-x C-c )
  • abra uma janela da GUI quando chamada sem um arquivo (se comportar como emacs chamada nua; quando eu fizer isso com emacsclient , ele me diz que o arquivo de entrada é necessário) e retorne imediatamente.
por Johnson Steward 16.02.2016 / 02:41

1 resposta

1

Esse script do Wiki do Arch

Essa invocação de emacs que verifica (fboundp 'tool-bar-mode) está testando se sua compilação do Emacs inclui suporte a 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 as compilações do Emacs que não têm suporte a GUI, esqueça esse bit.

Você fica com

if [ -n "$DISPLAY" ]; then
  emacsclient -a "" -n -c "$@"
else
  emacsclient -a "" "$@"
fi

E até mesmo esse nível de complexidade é necessário apenas se você quiser que a chamada para emacsclient retorne imediatamente se ela abrir uma nova janela da GUI. (Se ele estiver sendo executado no terminal, ele deverá continuar em execução até você terminar de usar esse terminal.) Cabe a você decidir se você gosta desse comportamento. Se você não, então você pode simplesmente executar

emacsclient -a "" "$@"

E se você iniciar o Emacs com sua sessão, por exemplo, como uma unidade systemd, você não precisa dizer emacsclient para iniciá-lo. Então ficamos com

emacsclient "$@"

que eu não posso simplificar ainda mais.

Seu requisito adicional

  • stay in the terminal (…) if called with a file (…) or when graphical environment isn't present (…)
  • open a GUI window when called without a file (…) and return immediately

Para isso, você precisa testar se o script foi chamado com argumentos. Suponho que, se você passar qualquer opção emacsclient (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

¹ Nenhum suporte a GUI significa que você não precisa ter as bibliotecas necessárias instaladas. O programa emacs não pode ser iniciado se as bibliotecas não estiverem presentes, mesmo que não use os recursos da GUI naquela sessão específica.

    
por 18.02.2016 / 02:25