Я пытаюсь сделать скрипт, чтобы определить, 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 в этом конкретном сеансе.