Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

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

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

Ответ 3

Еще одно дополнение к 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)'

Ответ 4

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

Ответ 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

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

Ответ 6

ответ от 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)))

Ответ 7

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

/etc/gdm/PostSession/Default

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

Ответ 8

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

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

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

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

Ответ 9

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