如何正常关闭emacs守护进程?

时间:2009-07-22 19:05:29

标签: emacs ubuntu emacs23

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

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

2)我应该把这个脚本放在哪里?启动程序(System-> Sessions菜单)面板中没有任何内容看起来很有用。我更喜欢在用户帐户中使用的东西,而不是使用root访问权攻击PostSession脚本或其他东西。

9 个答案:

答案 0 :(得分:31)

ShreevatsaR是对的,答案是kill-emacssave-buffers-kill-emacs,两者都是互动的,因此可以在Emacs中使用M-x save-buffers-kill-emacs运行。这可能是最好的方法,因为你可以保存修改过的文件。

另一种方法是制作一个这样的shell文件:

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

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

答案 1 :(得分:14)

This linuxquestions.org page有一个Python脚本,可以在登录期间运行,监听Gnome在关机期间发出的“自己保存”事件。您可以修改它来执行:

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

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

答案 2 :(得分:9)

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

答案 3 :(得分:5)

我认为在/etc/init.d中使用脚本是一个更清洁的解决方案。 点击此处了解更多详情 http://www.emacswiki.org/emacs/EmacsAsDaemon

答案 4 :(得分: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 {enable,disable,start,restart,stop} emacs.service

请注意:我从其他地方拿走了这张便条,不记得在哪里。

答案 5 :(得分:2)

willert的答案包含一个小bug。它必须看起来像


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

答案 6 :(得分:1)

您可以将emacsclient -e "(kill-emacs)"放在GDM的PostSession目录中,也可以直接放在默认脚本中:

/etc/gdm/PostSession/Default

另见GDM documentation

答案 7 :(得分:1)

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

脚本可能像run-parts ~/.logout.d一样简单。

注意:未经测试,虽然我确实使用了run-parts ~/.autostart.d的启动脚本,而且它一直运行良好。

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

答案 8 :(得分:-2)

只需打开一些终端pkill -TERM emacs

即可