Как изящно завершить работу демона emacs?

40

При входе в Ubuntu я запускаю демон Emacs (версия 23), используя программы запуска Ubuntu. Затем я запускаю клиенты Emacs, когда мне нужно что-то редактировать. Когда я выхожу из Ubuntu, он говорит, что Emacs все еще работает, конечно. Мне нужно прикрепить script где-нибудь, чтобы сообщить Gnome о завершении работы emacs, когда я выхожу из системы /shutdown.

1) Что должно выглядеть script? "kill-emacs", похоже, не работает.

2) Где я должен поместить этот script? Нет ничего в панели запуска программы (System- > Sessions), которая выглядит полезной. Я бы предпочел что-то, что работает в учетной записи пользователя, вместо того, чтобы взломать PostSession script или что-то еще с правами доступа root.

  • 3
    [Пока вы ждете реального ответа] Что-то вроде: emacsclient -e "(kill-emacs)" сделает это. (Возможно, вы захотите использовать save-buffers-kill-emacs; сначала запрашивается подтверждение.)
  • 0
    Работает ли то, что говорит ShreevatsaR в .bash_logout? Я забыл. Это срабатывает только при выходе из оболочки входа в систему?
Показать ещё 2 комментария
Теги:
emacs
emacs23

9 ответов

13
Лучший ответ

Эта страница linuxquestions.org содержит Python script, который можно запустить во время входа в систему, который прослушивает событие "сохранить себя", которое Gnome испускает во время выключения. Вы можете изменить это, чтобы выполнить операцию "emacsclient -e" (save-buffers-kill-emacs).

(N.b. Я фактически не протестировал сам script)

  • 0
    Я протестировал его под Ubuntu 11.10, и он отлично работает!
  • 0
    Если в вашей системе нет события «save your», вы можете подделать его, запустив сценарий оболочки при запуске, который прерывает EXIT и читает из fifo, который вы создали для этой цели. Сценарий будет простаивать до перехвата, а затем сможет запускать любую назначаемую вами функцию, например, вызывающую emacsclient -e "(save-buffers-kill-emacs)"
24

ShreevatsaR прав, ответ kill-emacs или save-buffers-kill-emacs, оба из которых являются интерактивными и поэтому могут запускаться из Emacs с помощью M-x save-buffers-kill-emacs. Вероятно, это лучший способ сделать это, так как вы сможете сохранить измененные файлы.

Другой альтернативой является создание файла оболочки следующим образом:

#!/bin/bash
emacsclient -e "(kill-emacs)"

Что вы можете запускать из любого места, где захотите (значок меню, панель и т.д.).

  • 2
    Я думаю, что спрашивающий хочет что-то, что можно поместить в место, которое будет автоматически выполнено, когда GNOME попросят выйти из системы. (Так что на самом деле это больше вопрос Gnome / Ubuntu / X, чем вопрос Emacs.)
  • 0
    Есть ли определенный сигнал, что демон emacs будет прослушивать завершение работы?
Показать ещё 1 комментарий
9

Еще одно дополнение к ShreevatsaR: python script работает как шарм, но я бы предложил использовать

emacsclient -e '(let ((last-nonmenu-event nil))(save-buffers-kill-emacs))'
как команда. Установка last-nonmenu-event на nil силы emacs в режим мыши, поэтому вы получаете "приятные" диалоговые окна вместо подсказок в минибуфере.

Или еще более причудливый (где-то в вашей конфигурации emacs):

(defun shutdown-emacs-server () (interactive)
  (when (not (eq window-system 'x))
    (message "Initializing x windows system.")
    (x-initialize-window-system)
    (when (not x-display-name) (setq x-display-name (getenv "DISPLAY")))
    (select-frame (make-frame-on-display display '((window-system . x))))
  )
  (let ((last-nonmenu-event nil)(window-system "x"))(save-buffers-kill-emacs)))

а затем:

emacsclient -e '(shutdown-emacs-server)'
  • 0
    Работает ли он, если запущен в терминале? Он все время говорит мне: ОШИБКА : утверждение не выполнено: (не инициализировано x)
5

Если вы используете systemd, вам может быть интересен этот файл устройства, который позволяет вам грамотно управлять сервером Emacs из вашей консоли/удаленной системы:

[Unit]
Description=Emacs: the extensible, self-documenting text editor

[Service]
Type=forking
ExecStart=/usr/bin/emacs --daemon
ExecStop=/usr/bin/emacsclient --eval "(kill-emacs)"
Restart=always

# Remove the limit in startup timeout, since emacs
# cloning and building all packages can take time
TimeoutStartSec=0

[Install]
WantedBy=default.target

(он убивает демона тем же самым способом, о котором уже говорилось выше).

Вы можете поместить и назвать файл блока, например, ~/.config/systemd/user/emacs.service, чтобы он привязывался к вашему пользователю, вместо этого выполнял его как root; для управления им:

$systemctl --user {включить, отключить, запустить, перезапустить, остановить} emacs.service

Обратите внимание: я взял эту записку из другого места, не могу вспомнить, где это было.

5

Я думаю, что использование script в /etc/init.d является более чистым решением. Подробнее здесь. http://www.emacswiki.org/emacs/EmacsAsDaemon

  • 1
    Возможно, но только если вы единственный пользователь этой машины. Даже тогда кажется немного глупым указывать пользователю способ, представленный там.
2

ответ от willert содержит небольшую ошибку. он должен выглядеть как


(defun shutdown-emacs-server () (interactive)
  (when (not (eq window-system 'x))
    (message "Initializing x windows system.")
    (x-initialize-window-system)
    (when (not x-display-name) (setq x-display-name (getenv "DISPLAY")))
    (select-frame (make-frame-on-display x-display-name '((window-system . x))))
  )
  (let ((last-nonmenu-event nil)(window-system "x"))(save-buffers-kill-emacs)))
1

Возможно, самым общим решением было бы разместить script в системной папке PostSession, которая запускает каждый исполняемый файл script в ~/.logout-d или что-то подобное. Затем вы можете поместить все скрипты в ~/.logout-d, и они будут запущены при выходе из системы.

script может быть таким же простым, как run-parts ~/.logout.d.

Примечание. Непроверенный, хотя я использую startup script, который делает run-parts ~/.autostart.d, и это работает отлично навсегда.

Edit: Конечно, было бы так же легко изменить приведенный выше python script для выполнения той же самой команды, но мне лично не нравится идея загрузки script для всего моего сеанса только для запуска команды при выходе из системы.

1

вы можете поместить emacsclient -e "(kill-emacs)" в каталог GDM PostSession или непосредственно по умолчанию script:

/etc/gdm/PostSession/Default

см. также Документация GDM.

  • 0
    Спасибо, но мой пост говорит, что я не хотел использовать PostSession, потому что для его изменения требуется (AFAIK) доступ с правами root. Если пользователь может что-то добавить в автозапуск, должен быть способ добавить что-то в «автоотключение».
-2

Просто откройте терминал и pkill -TERM emacs

  • 1
    Посмотрите этот ответ, почему это не решение.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню