51

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

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

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

4

9 回答 9

35

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

另一种选择是制作这样的 shell 文件:

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

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

于 2009-07-22T21:38:31.943 回答
20

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

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

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

于 2009-08-02T22:43:46.150 回答
9

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

emacsclient -e '(let ((last-nonmenu-event nil))(save-buffers-kill-emacs))'
作为命令。将 last-nonmenu-event 设置为 nil 会强制 emacs 进入鼠标模式,因此您会在 minibuffer 中获得“不错的”对话框而不是提示。

或者更花哨(在你的 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)'
于 2010-02-16T04:20:34.093 回答
7

如果您使用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 {启用、禁用、启动、重启、停止} emacs.service

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

于 2015-02-24T19:28:53.440 回答
4

我认为在 /etc/init.d 中使用脚本是一个更干净的解决方案。在此处查看更多详细信息 http://www.emacswiki.org/emacs/EmacsAsDaemon

于 2009-12-16T18:16:25.220 回答
2

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)))
于 2010-11-29T12:18:29.430 回答
1

您可以放入emacsclient -e "(kill-emacs)"GDM 的 PostSession 目录或直接放入 Default 脚本中:

/etc/gdm/PostSession/Default

另请参阅GDM 文档

于 2009-07-23T06:12:42.270 回答
1

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

该脚本可能像run-parts ~/.logout.d.

注意:未经测试,尽管我确实使用了一个启动脚本run-parts ~/.autostart.d,并且一直运行良好。

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

于 2009-11-02T04:31:41.330 回答
-2

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

于 2012-07-29T04:16:44.950 回答