如何优雅地关闭 emacs 守护进程? [已关闭]

问题描述 投票:0回答:9

登录 Ubuntu 后,我使用 Ubuntu 的启动程序启动 Emacs(版本 23)[1] 守护进程。然后,每当我需要编辑某些内容时,我都会启动 Emacs 客户端。当然,当我从 Ubuntu 注销时,它会说 Emacs 仍在运行。我需要在某处附加一个脚本来告诉 Gnome 在我注销/关闭时关闭 emacs。

  1. 脚本应该是什么样子? “kill-emacs”似乎不起作用。

  2. 我应该把这个脚本放在哪里?启动程序(系统->会话菜单)面板中没有任何看起来有用的东西。我更喜欢在用户帐户中工作的东西,而不是破解 PostSession 脚本或其他具有 root 访问权限的东西。

[1]:这是一个主要由程序员使用的软件工具,也是本论坛的主题。

emacs ubuntu emacs23
9个回答
44
投票

ShreevatsaR 是对的,答案是

kill-emacs
save-buffers-kill-emacs
,两者都是交互式的,因此可以使用
M-x save-buffers-kill-emacs
从 Emacs 中运行。这可能是最好的方法,因为您将保存修改后的文件。

另一种选择是制作一个像这样的 shell 文件:

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

您可以从任何您喜欢的地方运行(菜单图标、面板等)。


22
投票

这个 linuxquestions.org 页面有一个可以在登录期间运行的 Python 脚本,用于侦听 Gnome 在关闭期间发出的“拯救自己”事件。您可以修改它来执行以下操作:

emacsclient -e '(save-buffers-kill-emacs)'

官方文档:https://www.emacswiki.org/emacs/EmacsAsDaemon#toc8


10
投票

ShreevatsaR 的另一个附录:python 脚本就像一个魅力,但我建议使用

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)'

7
投票

如果您使用 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

请注意:这张纸条是我从其他地方拿来的,但不记得在哪里了。


4
投票

我认为在 /etc/init.d 中使用脚本是一个更干净的解决方案。 检查这里了解更多详情 http://www.emacswiki.org/emacs/EmacsAsDaemon


3
投票

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
投票

您可以将

emacsclient -e "(kill-emacs)"
放在 GDM 的 PostSession 目录中或直接放在默认脚本中:

/etc/gdm/PostSession/Default

另请参阅 GDM 文档


1
投票

也许最通用的解决方案是将脚本放在系统 PostSession 目录中,该脚本运行 ~/.logout-d 或类似目录中的每个可执行脚本。然后你可以把你喜欢的任何脚本放在 ~/.logout-d 中,它们将在注销时运行。

脚本可能就像

run-parts ~/.logout.d
一样简单。

注意:未经测试,尽管我确实使用了一个可以执行

run-parts ~/.autostart.d
功能的启动脚本,并且一直运行良好。

编辑:当然,修改上面的 python 脚本来执行相同的命令也同样容易,但我个人不喜欢为整个会话加载脚本只是为了在注销时运行命令的想法。


-2
投票

只需打开一些终端即可

pkill -TERM emacs

© www.soinside.com 2019 - 2024. All rights reserved.