При входе в Ubuntu я запускаю демон Emacs (версия 23), используя программы запуска Ubuntu. Затем я запускаю клиенты Emacs, когда мне нужно что-то редактировать. Когда я выхожу из Ubuntu, он говорит, что Emacs все еще работает, конечно. Мне нужно прикрепить script где-нибудь, чтобы сообщить Gnome о завершении работы emacs, когда я выхожу из системы /shutdown.
1) Что должно выглядеть script? "kill-emacs", похоже, не работает.
2) Где я должен поместить этот script? Нет ничего в панели запуска программы (System- > Sessions), которая выглядит полезной. Я бы предпочел что-то, что работает в учетной записи пользователя, вместо того, чтобы взломать PostSession script или что-то еще с правами доступа root.
Эта страница linuxquestions.org содержит Python script, который можно запустить во время входа в систему, который прослушивает событие "сохранить себя", которое Gnome испускает во время выключения. Вы можете изменить это, чтобы выполнить операцию "emacsclient -e" (save-buffers-kill-emacs).
(N.b. Я фактически не протестировал сам script)
EXIT
и читает из fifo, который вы создали для этой цели. Сценарий будет простаивать до перехвата, а затем сможет запускать любую назначаемую вами функцию, например, вызывающую emacsclient -e "(save-buffers-kill-emacs)"
ShreevatsaR прав, ответ kill-emacs
или save-buffers-kill-emacs
, оба из которых являются интерактивными и поэтому могут запускаться из Emacs с помощью M-x save-buffers-kill-emacs
. Вероятно, это лучший способ сделать это, так как вы сможете сохранить измененные файлы.
Другой альтернативой является создание файла оболочки следующим образом:
#!/bin/bash
emacsclient -e "(kill-emacs)"
Что вы можете запускать из любого места, где захотите (значок меню, панель и т.д.).
Еще одно дополнение к 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)'
Если вы используете 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
Обратите внимание: я взял эту записку из другого места, не могу вспомнить, где это было.
Я думаю, что использование script в /etc/init.d является более чистым решением. Подробнее здесь. http://www.emacswiki.org/emacs/EmacsAsDaemon
ответ от 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)))
Возможно, самым общим решением было бы разместить script в системной папке PostSession, которая запускает каждый исполняемый файл script в ~/.logout-d или что-то подобное. Затем вы можете поместить все скрипты в ~/.logout-d, и они будут запущены при выходе из системы.
script может быть таким же простым, как run-parts ~/.logout.d
.
Примечание. Непроверенный, хотя я использую startup script, который делает run-parts ~/.autostart.d
, и это работает отлично навсегда.
Edit: Конечно, было бы так же легко изменить приведенный выше python script для выполнения той же самой команды, но мне лично не нравится идея загрузки script для всего моего сеанса только для запуска команды при выходе из системы.
вы можете поместить emacsclient -e "(kill-emacs)"
в каталог GDM PostSession или непосредственно по умолчанию script:
/etc/gdm/PostSession/Default
см. также Документация GDM.
Просто откройте терминал и pkill -TERM emacs