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

pro*_*ave 47 emacs ubuntu emacs23

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

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

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

hax*_*ney 32

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

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

#!/bin/bash
emacsclient -e "(kill-emacs)"
Run Code Online (Sandbox Code Playgroud)

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

  • 我认为提问者想要的是可以放在GNOME被要求注销时自动执行的地方.(实际上它更像是Gnome/Ubuntu/X问题,而不是Emacs问题.) (2认同)
  • `sudo killall emacs` 也有效@haxney (2认同)

gen*_*ack 14

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

emacsclient -e '(save-buffers-kill-emacs)'
Run Code Online (Sandbox Code Playgroud)

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


wil*_*ert 9

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

emacsclient -e '(let ((last-nonmenu-event nil))(save-buffers-kill-emacs))'
Run Code Online (Sandbox Code Playgroud) 作为命令.将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)))
Run Code Online (Sandbox Code Playgroud)

然后:

emacsclient -e '(shutdown-emacs-server)'
Run Code Online (Sandbox Code Playgroud)


小智 5

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


cig*_*ig0 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
Run Code Online (Sandbox Code Playgroud)

(它以与上面已经建议的方式相同的方式杀死守护进程.)

您可以将单元文件命名为〜/ .config/systemd/user/emacs.service,以便它绑定到您的用户而不是以root身份运行它; 管理它:

$ systemctl --user {enable,disable,start,restart,stop} emacs.service

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

  • 它来自 Emacs wiki。http://www.emacswiki.org/emacs/EmacsAsDaemon (2认同)