Как запустить сервер emacs, только если он не запущен?

#emacs #configuration #mutt

#emacs #конфигурация #mutt

Вопрос:

Я хотел бы использовать emacsclient для редактирования электронных писем в Mutt.

Я добавил это в .emacs

(server-start)

И в .muttrc я добавил

set editor="emacsclient -nw %s"

Кажется, они работают. Когда я запускаю второй Emacs, он жалуется, что сервер уже запущен, поэтому выдает ошибки. Как убедиться, что это делается (server-start) только в том случае, если сервер еще не запущен?

Спасибо

Ответ №1:

Этот код запускает сервер, только если он не запущен:

 (load "server")
(unless (server-running-p) (server-start))
  

Комментарии:

1. Это единственный вариант, который работает в Windows в настоящее время, поскольку emacs --daemon говорится , что эта платформа не поддерживает флаг -daemon.

2. @legends2k, в Windows вы тоже можете сделать emacs --funcall server-start , но я согласен, что это лучше и работает кроссплатформенно.

3. Когда я отправляю эти строки в init.el, M-x возвращается Error reading from stdin . Есть ли какой-либо способ устранить эту проблему?

4. Я обнаружил, что это (load "server") приводило к ошибкам при попытке использовать magit (в частности, в Windows). Использование (require 'server) вместо этого предотвращает эти ошибки.

Ответ №2:

Демон emacs может быть запущен автоматически очень простым способом. Просто добавьте это в свой файл .bashrc/.zshrc / что угодно

 export ALTERNATE_EDITOR=""
  

Теперь при вызове emacsclient (используя либо --tty , либо --create-frame ) сервер будет запущен (с emacs --daemon помощью), если он еще не запущен.

Я также нахожу этот псевдоним оболочки удобным:

 alias e='emacsclient --tty'
  

Обратите внимание, что начиная с Emacs 23 это предпочтительный способ использования Emacs в режиме демона. (start-server) в настоящее время в основном устарел.

Комментарии:

1. Это хорошее решение. emacsclient -c также работает и поддерживает графические клиенты. Однако, как бы вы поступили, открыв файл в существующем фрейме emacs (скажем, в другом терминале). В настоящее время у меня вызывается скрипт bash, e который проверяет, является ли первый аргумент -o (для other), и выполняется emacsclient без -c , если он выполняется. Есть ли лучший способ, используя псевдоним, который вы можете переопределить -t и заставить существующий фрейм открыть файл?

2. @edam не уверен, что вы нашли свой ответ, но звучит так, как будто вы хотите переключить -t на emacsclient. Это немного сложно определить, потому что ваш комментарий, похоже, стирает различие между неграфическим экземпляром emacs в терминале и оконным графическим экземпляром. -t для первого, -c для второго.

3. @Daniel: Я разобрался. Вот мой скрипт, с помощью которого я запускаю emacs . Вы можете запустить его следующим образом: $ e -o /path/to/file чтобы отправить файл другому emacs, уже запущенному в другом месте (что полезно). И он определяет, когда он запускается внутри оболочки в emacs (в противном случае результаты будут плохими!). Он всегда запускает emacs в терминале, хотя вы можете легко удалить -nw в конце, чтобы изменить это.

4. Можете ли вы предоставить какую-либо ссылку на утверждение о том, что «это предпочтительный способ использования Emacs в режиме демона» и что » (start-server) в настоящее время в основном устарел»? Я не вижу, чтобы это упоминалось ни в самой последней документации, ни где-либо еще. Спасибо.

5. Согласен, я не уверен, что это правда, когда я запускаю emacs с помощью -c или -t, это фактически говорит мне запустить сервер. «Чтобы запустить сервер в Emacs, введите «M-x server-start».» таким образом, это звучит так, как будто это предпочтительный способ.

Ответ №3:

Немного запоздалый ответ, но вот решение, которое работает для меня. Всякий раз, когда я запускаю emacsclient, я использую emacsclient -a '' -c -a '' команду emacsclient попытаться подключиться к существующему серверу, и если сервер не существует, запустите его, а затем подключитесь к нему.

Комментарии:

1. -a '' Вариант отличный. Обратите внимание, что -c всегда создается новый фрейм. Если обычно требуется отредактировать файл в существующем фрейме emacs, поэтому я опускаю эту опцию

Ответ №4:

Избегайте проблемы все вместе с помощью

 emacs --daemon
  

в любой оболочке или терминале, чтобы Emacs работал в фоновом режиме. Этот способ emacsclient всегда удобен, поскольку всегда есть сервер Emacs для подключения.

Поскольку речь идет о Emacs, существует также функция, которая запускает сервер только при необходимости, но я не могу сейчас точно вспомнить ее название. Я использую --daemon опцию с удовольствием, вполне довольный собой.

Комментарии:

1. Я не могу не согласиться, красота emacs --daemon сияет, когда я помещаю это в мои стандартные настройки запуска приложений в Ubuntu /usr/bin/emacs --daemon , и всякий раз, когда я запускаю свою машину, я могу быстро записать плавающую идею в свой шаблон capture в emacs, нажав Super I (сочетание клавиш emacsclient -c --eval '(progn (org-capture) (delete-other-windows) (setq-local kill-buffer-hook (lambda () (delete-frame))))' ), и я получаю красивую рамку emacs, сообщающую мне, какие раздражающие идеи вы хотите выбросить из моей головы.

2. должны ли мы работать emacs --daemon как emacs --daemon amp; в фоновом режиме?

3. Я думаю, что это исчезнет само по себе, поэтому, если вы скажете, emacs --daemon что вы получите свое приглашение обратно. Попробуйте это и выполните следующие действия с emacsclient -nw !

4. emacsclient -nw keep возвращает emacsclient: connect: Connection refused сообщение об ошибке, не уверен, почему

5. Тогда у вас нет запущенного демона.

Ответ №5:

Добавьте это в свой .bashrc / .zshrc

 if ! ps -e -o args | grep -q '^emacs --daemon$'; then
  emacs --daemon
else
  echo "Emacs server Online"
fi
  

Обновление: теперь я предпочитаю использовать эту строку вместо:

 if ! ps -e -o args | grep -i 'emacs' | grep 'daemon'; then
  

потому что имя процесса будет зависеть от вашего компьютера или способа установки emacs.


Теперь ваша оболочка запустит deamon при запуске, но только если он еще не запущен. Меньше времени ожидания при первом запуске emacsclient -t , и это быстрее, чем позволять emacs --daemon проверять, запущен ли он уже.

В качестве альтернативы вы могли бы просто добавить:

 eval 'emacsclient -e "(server-running-p)"'
  

Комментарии:

1. Мне нужно было использовать ps -xe -o args | grep -q '^emacs --daemon' во FreeBSD, потому что без опции x ps не показывал бы emacs —daemon, а также печатал номер версии, поэтому я опустил $ в конце.