Emacsclient: один единственный процесс Emacs все время от запуска и никогда не закрывать и лучше скрыть GUI

9

Так как emacsclient может обрабатывать длительное время загрузки пакетов с большой долей уверенности, я действительно хочу сохранить хотя бы один процесс emacs, и большую часть времени только один процесс emacs , открыть как фоновый процесс и лучше скрыть графический интерфейс.

Прямо сейчас я определил следующую функцию в .bashrc:

emc () 
{ 
    if [[ $# -eq 0 ]]; then
        emacs --eval "(suspend-frame)" &
        return
    fi
    args=($*);
    setsid emacsclient -c -e "(find-file \"${args[*]}\")"
}

А также иметь следующую строку в .bashrc:

emc

Поэтому каждый раз, когда я открываю оболочку, у меня будет новый процесс emacs.

Проблема в том, что после открытия многих оболочек у меня будет много дополнительных ненужных процессов emacs. Тем не менее, я хочу поддерживать только один процесс emacs все время от запуска, лучше скрыть графический интерфейс .

phonycollectibles
источник
5
Я не знаком с практикой, emacs --eval "(suspend-frame)"а не emacs --daemon( emacswiki.org/emacs/EmacsAsDaemon ). Есть ли причина, по которой вы решили не вызывать emacs в качестве демона? Вы можете использовать что-то вроде, pgrep -U `whoami` emacs || emacs --daemon &чтобы убедиться, что оно работает.
ebpa
Посмотрите сценарии MJ Wall для использования клиента Emacs.
Тяньсян Сюн

Ответы:

13

Я делаю это, запуская демон emacs при входе в систему. Где вы разместите эту команду, зависит от вашего менеджера рабочего стола. Я использую i3, который настроен для запуска сценария при входе в систему, который включает в себя следующее:

emacs --daemon &

При этом emacs всегда работает в фоновом режиме, и я открываю новый клиент с emacsclient -c -nпривязкой к удобному связыванию клавиш в оконном менеджере. Если вы работаете в терминале, вам нужно всего лишь простой псевдоним , как alias emc='emacsclient', возможно , с -n, -cили -tаргументы, в зависимости от того, как вы его используете.

Изучите опции для emacsclient в руководстве: ( (emacs) Опции emacsclient , доступные из Emacs через C-h r m emacsclient options <enter>). Вы можете использовать этот -aфлаг для автоматического запуска демона emacs, если он еще не запущен, и -cили -tдля открытия нового фрейма или терминального клиента, вместо повторного использования существующего (в том же сеансе):

'-А КОМАНДА'
'--Alternate-редактор = КОМАНДА'
     Укажите команду для запуска, если emacsclient не может связаться с Emacs.
     Это полезно при запуске emacsclient в скрипте.

     В качестве специального исключения, если COMMAND является пустой строкой, тогда
     'emacsclient' запускает Emacs в режиме демона (как 'emacs --daemon') и
     затем пытается подключиться снова.

'-C'
'--Create-кадр'
     Создайте новый графический «кадр клиента» вместо использования существующего
     Рамка Emacs. Смотрите ниже об особом поведении «Cx C-c» в
     кадр клиента. Если Emacs не может создать новый графический фрейм (например,
     если он не может подключиться к X-серверу), он пытается создать текст
     терминал клиентского фрейма, как если бы вы указали опцию '-t'
     вместо.

'-T'
'--Tty'
'-Nw'
     Создайте новый клиентский фрейм на текущем текстовом терминале вместо
     используя существующий фрейм Emacs. Это ведет себя так же, как '-c'
     вариант, описанный выше, за исключением того, что он создает текстовый терминал
     рамка (* примечание Неоконные терминалы: :).
Тайлер
источник
4

Если вы используете операционную систему, в которой используется диспетчер служб systemd (который в настоящее время включает большинство дистрибутивов GNU / Linux), то лучшим решением может быть использование systemd для запуска демона Emacs при загрузке. Вы можете сделать это, создав файл $HOME/.config/systemd/user/emacs.serviceсо следующим содержимым:

[Unit]
Description=Emacs text editor
Documentation=info:emacs man:emacs(1) https://gnu.org/software/emacs/

[Service]
Type=simple
ExecStart=/usr/bin/emacs --fg-daemon
ExecStop=/usr/bin/emacsclient --eval "(kill-emacs)"
Environment=SSH_AUTH_SOCK=%t/keyring/ssh
Restart=on-failure

[Install]
WantedBy=default.target

Затем вы должны запустить сервис и установить его автоматический запуск для всех будущих загрузок:

$ systemctl enable --user emacs
$ systemctl start --user emacs

Теперь вы можете использовать emacsclientкак обычно. Если вы обычно запустить его с -n, -cили -tвариантов, вы можете установить псевдоним в вашей оболочке. Вы также можете установить переменные окружения EDITORи / или так, как вам нравится. Например, в Bash вы можете добавить в свой файл следующее:VISUALemacsclient.bashrc

alias emc="emacsclient -c"
export VISUAL="emacsclient -c"
export EDITOR="emacsclient -t"

Если вам когда-нибудь понадобится остановить демон Emacs, вы можете сделать это следующим образом:

$ systemctl stop --user emacs

И если вы хотите навсегда остановить его запуск при загрузке:

$ systemctl disable --user emacs
Psychonaut
источник
1
возможно, эту ссылку на EmacsWiki следует признать: EmacsAsDaemon
HongboZhu
0

То, как я это делаю, очень похоже на предыдущий ответ, определив псевдоним в моем .bashrc для emacs --daemon

alias ds="emacs --daemon"

Помимо этого, у меня есть сочетание клавиш ctrl-alt-Eдля emacsclient -c. Когда я хочу начать работать с emacs, я открываю терминал, dsпечатаю и вызываю каждый экземпляр emacsclient с помощью своего ярлыка.

Надеюсь, это кому-нибудь поможет.

Нидиш Нараянаа
источник