在登录Ubuntu时,我使用Ubuntu的Startup程序启动Emacs(版本23)守护程序.然后,每当我需要编辑某些内容时,我就会启动Emacs客户端.当我从Ubuntu注销时,它说Emacs当然还在运行.我需要在某处附加一个脚本来告诉Gnome在我注销/关闭时关闭emacs.
1)脚本应该是什么样的?"kill-emacs"似乎不起作用.
2)我应该把这个脚本放在哪里?启动程序(系统 - >会话菜单)面板中没有任何内容看起来很有用.我更喜欢在用户帐户中使用的东西,而不是使用root访问权攻击PostSession脚本或其他东西.
ShreevatsaR是对的,答案是kill-emacs
或者save-buffers-kill-emacs
,两者都是交互式的,因此可以在Emacs中运行M-x save-buffers-kill-emacs
.这可能是最好的方法,因为您可以保存修改过的文件.
另一种方法是制作一个这样的shell文件:
#!/bin/bash emacsclient -e "(kill-emacs)"
您可以从任何地方(菜单图标,面板等)运行.
这个linuxquestions.org页面有一个Python脚本,可以在登录期间运行,监听Gnome在关机期间发出的"自己保存"事件.你可以修改它来做:
emacsclient -e '(save-buffers-kill-emacs)'
官方文档:https://www.emacswiki.org/emacs/EmacsAsDaemon#toc8
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)'
我认为在/etc/init.d中使用脚本是一个更清洁的解决方案.点击此处了解更多详情 http://www.emacswiki.org/emacs/EmacsAsDaemon
如果您使用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
请注意:我从别的地方拿了这张纸条,不记得在哪里.