当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何正常关闭emacs守护进程?》经验,为你挑选了5个好方法。

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

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

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



1> haxney..:

ShreevatsaR是对的,答案是kill-emacs或者save-buffers-kill-emacs,两者都是交互式的,因此可以在Emacs中运行M-x save-buffers-kill-emacs.这可能是最好的方法,因为您可以保存修改过的文件.

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

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

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


我认为提问者想要的是可以放在GNOME被要求注销时自动执行的地方.(实际上它更像是Gnome/Ubuntu/X问题,而不是Emacs问题.)

2> genehack..:

这个linuxquestions.org页面有一个Python脚本,可以在登录期间运行,监听Gnome在关机期间发出的"自己保存"事件.你可以修改它来做:

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

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



3> willert..:

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



4> 小智..:

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



5> cig0..:

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

请注意:我从别的地方拿了这张纸条,不记得在哪里.

推荐阅读
有风吹过best
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有