如何正常closuresemacs守护进程?

loginUbuntu时,我使用Ubuntu的启动程序启动Emacs(第23版)守护进程。 然后,当我需要编辑某些东西时,我会启动Emacs客户端。 当我从Ubuntu注销时,它说Emacs当然还在运行。 我需要在某处添加一个脚本来告诉Gnome在注销/closures时closuresemacs。

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

2)我应该把这个脚本放在哪里? 在启动程序(系统 – >会话菜单)中没有任何东西看起来很有用。 我更喜欢用户的帐户中的东西,而不是黑客PostSession脚本或其他的根访问。

这个linuxquestions.org页面有一个Python脚本,可以在login时运行,监听关机过程中Gnome发出的“保存”事件。 你可以修改它来做“emacsclient -e”(save-buffers-kill-emacs)“'的东西。

(铌我没有实际testing脚本自己…)

ShreevatsaR是正确的,答案是kill-emacssave-buffers-kill-emacs ,它们都是交互式的,所以可以使用Mx save-buffers-kill-emacs在Emacs中运行。 这可能是最好的办法,因为你将得到保存修改后的文件。

另一种方法是制作一个如下所示的shell文件:

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

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

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

 emacsclient -e '(let ((last-nonmenu-event nil))(save-buffers-kill-emacs))' 

作为命令。 将最后一个非菜单事件设置为零会强制emacs进入鼠标模式,因此您可以在“小”缓冲区中获得“漂亮”的对话框而不是提示。

或者更奇特(你的emacsconfiguration中的某个地方):

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

我认为在/etc/init.d中使用脚本是一个更清洁的解决scheme。 点击这里查看更多详情http://www.emacswiki.org/emacs/EmacsAsDaemon

如果你使用systemd,你可能会对这个单元文件感兴趣,这个文件可以让你从控制台/远程系统中正常地pipe理一个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身份运行它; pipe理它:

$ systemd –user {enable,disable,start,restart,stop} emacs.service

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

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

你可以把emacsclient -e "(kill-emacs)"放在GDM的PostSession目录下,或直接放在Default脚本中:

 /etc/gdm/PostSession/Default 

另请参阅GDM文档 。

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

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

注意:未经testing,虽然我使用启动脚本run-parts ~/.autostart.d ,并一直工作得很好。

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

只需打开一些terminal和pkill -TERM emacs