Estoy intentando crear un script para determinar si emacsclient
debo ejecutarlo con -nc
o -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 emacs
instancia 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
emacs
llamada; cuando hago estoemacsclient
me dice que se requiere un archivo de entrada) y regrese inmediatamente.
Respuesta1
Ese guión de Arch Wiki
Esta invocación de emacs
esas 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 emacsclient
inmediatamente 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 emacsclient
que 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 emacsclient
opció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 emacs
programa 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.