Запуск emacsclient со скриптом

Запуск emacsclient со скриптом

Я пытаюсь сделать скрипт, чтобы определить, emacsclientследует ли запускать с -ncили -t. Скрипт такой (основанный наэта версия):

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

Однако эта emacs --batch -Q ...строка занимает столько же времени, сколько и использование голого emacsэкземпляра. Если я закомментирую эту строку, то вместо чистого экрана при выполнении под tty я ничего не получу. Можно ли ускорить обнаружение?

Я уже запустил демон emacs с использованием пользовательского модуля systemd. Я хочу emacsclient:

  • оставатьсяв терминале(то есть не открывать окно графического интерфейса) при вызове с файлом (например, вызвано git-commit) или при отсутствии графической среды (например, вызвано в tty) и продолжить работу до выхода ( C-x C-c)
  • открыть окно графического интерфейса при вызове без файла (ведет себя как простой emacsвызов; когда я делаю это с emacsclientфайлом, он сообщает мне, что требуется входной файл) и немедленно вернуться.

решение1

Этот скрипт из Arch Wiki

Этот вызов, emacsкоторый (fboundp 'tool-bar-mode)проверяет, включает ли ваша сборка Emacs поддержку GUI. Можно собрать Emacs без нее, чтобы сэкономить немного оперативной памяти и дискового пространства¹, но это необычно. Если вас не волнует совместимость со сборками Emacs, в которых отсутствует поддержка GUI, забудьте об этой части.

Таким образом, у вас остается

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

И даже этот уровень сложности необходим только в том случае, если вы хотите, чтобы вызов emacsclientвозвращался немедленно, если он открывает новое окно GUI. (Если он запущен в терминале, то он должен продолжать работать, пока вы не закончите использовать этот терминал.) Вам решать, нравится ли вам такое поведение. Если нет, то вы можете просто запустить

emacsclient -a "" "$@"

И если вы в любом случае запустите Emacs с вашей сессией, например, как systemd unit, то вам не нужно сообщать, emacsclientчтобы запустить его. Итак, у нас остается

emacsclient "$@"

что я не могу упростить еще больше.

Ваше дополнительное требование

  • оставаться в терминале (…) если вызван с файлом (…) или когда графическая среда отсутствует (…)
  • открыть окно графического интерфейса при вызове без файла (…) и немедленно вернуться

Для этого вам нужно проверить, был ли скрипт вызван с аргументами. Я предполагаю, что если вы передаете любую emacsclientопцию (например --eval, ), это считается аргументом.

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

¹ Отсутствие поддержки GUI означает, что вам не нужно устанавливать требуемые библиотеки. Программа emacsне может запуститься, если библиотеки, которые она запрашивает, отсутствуют, даже если она не собирается использовать функции GUI в этом конкретном сеансе.

Связанный контент