Ejecutando emacsclient con un script

Ejecutando emacsclient con un script

Estoy intentando crear un script para determinar si emacsclientdebo ejecutarlo con -nco -t. El guión es así (basado enEsta versión):

#!/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

Sin embargo, la emacs --batch -Q ...línea lleva tanto tiempo como usar una emacsinstancia básica. Si comento esta línea, no obtengo nada en lugar de una pantalla limpia cuando se ejecuta bajo un tty. ¿Es posible hacer la detección más rápida?

Ya inicié un demonio de emacs usando una unidad de usuario systemd. Yo quiero emacsclient:

  • permaneceren la terminal(es decir, no abra una ventana GUI) si se le llama con un archivo (p. ej., llamado por git-commit) o cuando no hay un entorno gráfico presente (p. ej., llamado mientras está en tty) y continúa ejecutándose hasta salir ( C-x C-c)
  • Abra una ventana GUI cuando se le llame sin un archivo (se comporte como una simple emacsllamada; cuando hago esto emacsclientme dice que se requiere un archivo de entrada) y regrese inmediatamente.

Respuesta1

Ese guión de Arch Wiki

Esta invocación de emacsesas comprobaciones (fboundp 'tool-bar-mode)prueba si su compilación de Emacs incluye soporte para GUI. Es posible construir Emacs sin él para ahorrar un poco de RAM y espacio en disco¹, pero es poco común. A menos que le importe la compatibilidad con las compilaciones de Emacs que carecen de soporte para GUI, olvídese de esta parte.

Te quedas así con

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

E incluso ese nivel de complejidad es necesario sólo si desea que la llamada regrese emacsclientinmediatamente si abre una nueva ventana GUI. (Si se está ejecutando en la terminal, entonces debe seguir ejecutándose hasta que termine de usar esa terminal). Depende de usted decidir si le gusta este comportamiento. Si no lo haces, simplemente puedes ejecutar

emacsclient -a "" "$@"

Y si inicia Emacs con su sesión de todos modos, por ejemplo, como una unidad systemd, entonces no necesita indicarle emacsclientque lo inicie. Entonces nos quedamos con

emacsclient "$@"

que no puedo simplificar más.

Su requisito adicional

  • permanecer en la terminal (…) si se le llama con un archivo (…) o cuando el entorno gráfico no está presente (…)
  • abra una ventana GUI cuando se le llame sin un archivo (...) y regrese inmediatamente

Para eso necesitas probar si el script fue llamado con argumentos. Voy a suponer que si pasa cualquier emacsclientopción (por ejemplo --eval), eso cuenta como argumento.

if [ $# -ne 0 ]; then
  emacsclient -nw "$@"
elif [ -n "$DISPLAY" ]; then
  emacsclient -c -n
else
  emacsclient -c
fi

¹ La falta de compatibilidad con GUI significa que no es necesario tener instaladas las bibliotecas necesarias. El emacsprograma no puede iniciarse si las bibliotecas que incluye no están presentes, incluso si no va a utilizar las funciones de GUI en esa sesión en particular.

información relacionada