13

当我退出 Emacs 时,我有一个关于如何“优雅地退出 SLIME”的问题。这是我的配置文件的相关部分:

;; SLIME configuration

(setq inferior-lisp-program "/usr/local/bin/sbcl")
(add-to-list 'load-path "~/Scripts/slime/")
(require 'slime)
(slime-setup)

;; configure SLIME to gracefully quit when emacs
;; terminates

(defun slime-smart-quit ()
  (interactive)
  (when (slime-connected-p)
    (if (equal (slime-machine-instance) "Gregory-Gelfonds-MacBook-Pro.local")
 (slime-quit-lisp)
      (slime-disconnect)))
  (slime-kill-all-buffers))

(add-hook 'kill-emacs-hook 'slime-smart-quit)

据我所知,每当我退出 Emacs 时,这应该会自动终止 SLIME 及其相关进程。但是,每次我退出时,我仍然得到提示:

Proc       Status   Buffer  Command
----       ------   ------  -------
SLIME Lisp    open      *cl-connection* (network stream connection to 127.0.0.1)
inferior-lisp run      *inferior-lisp* /usr/local/bin/sbcl


Active processes exist; kill them and exit anyway? (yes or no) 

有人可以对我的配置中缺少的内容有所了解吗?

提前致谢。

4

9 回答 9

25

我知道这不完全符合您的要求,但也许这对像我这样的其他菜鸟会有帮助。

你可以执行一个SLIME 命令来退出,所以你会留下一个漂亮、干净的 emacs。

在 SLIME 缓冲区中,键入,(逗号)。你被放置在 minibuffer 中,SLIME 询问要执行哪个命令。输入sayoonara并点击Enter。您应该看到 SLIME 退出,迷你缓冲区提到“连接已关闭”。并且您被放置在 *scratch* 缓冲区中。

我想知道是否有某种方法可以从您的 .emacs 中简单地调用此“sayoonara”命令,而不是手动取消连接所有内容。

于 2010-08-04T02:40:21.587 回答
5

根据手册页,“一旦 save-buffers-kill-emacs 完成所有文件保存和确认,它就会调用 kill-emacs 来运行这个钩子中的函数。” 所以在调用钩子之前检查活动进程。

例如,一个可行的解决方案是制作自己的 kill-emacs 命令

(defun kill-emacs-slime ()
  (interactive)
  (when (slime-connected-p)
    (if (equal (slime-machine-instance) "Gregory-Gelfonds-MacBook-Pro.local")
        (slime-quit-lisp)
      (slime-disconnect)))
  (slime-kill-all-buffers)
  (save-buffers-kill-emacs))

然后将其绑定到您的退出键

(global-set-key (kbd "C-x C-c") 'kill-emacs-slime)

(我假设你的函数正确地退出了 SLIME 并关闭了它的缓冲区,我还没有测试过)。

于 2010-11-16T17:49:41.167 回答
3

问题是活动进程的检查(以及确认终止的查询)将在kill-emacs-hooks有机会完成其工作之前被激活。

一个非常笨拙的解决方案:

(defadvice save-buffers-kill-terminal (before slime-quit activate)
  (slime-smart-quit)
  (sleep-for 1))

该函数slime-quit-lisp是异步的;返回后需要时间完成,因此sleep-for.

于 2010-11-16T13:16:50.000 回答
2

@Alex - 我发现你的方法是退出 SLIME 的最干净的方法。但是,需要以这种方式编辑配置文件才能使用它。

(require 'slime-autoloads)
(slime-setup '(slime-fancy)) ; load contrib packages

一旦以这种方式设置,然后:

  1. 逗号 (,)调出 minibuffer
  2. 输入quitsayoonara干净地退出。

PS:在启动时检查 SLIME 配置 - http://common-lisp.net/project/slime/doc/html/Loading-Contribs.html

于 2010-12-06T22:01:27.123 回答
2

调试问题的一种方法是调试函数。

将光标放在'slime-smart-quit例程内并键入M-x edebug-defun. 然后像往常一样退出 Emacs。然后 Emacs lisp 调试器edebug会提示您。这是一个非常容易使用的调试器(输入?帮助)。

单步执行代码,看看它在哪里没有按照您的预期执行。

用于q退出调试器,然后进行更改,然后M-x edebug-defun再次调试新版本。

重复直到你找到成功,或者有更多关于这个问题的信息。

于 2010-02-25T21:38:02.417 回答
1

我觉得每次关闭 Emacs 时都必须同意杀死所有进程很烦人,所以我想出了这个功能

(defun emacs-forget-buffer-process ()
  "Emacs will not query about this process when killing."
  (let ((p (get-buffer-process (current-buffer))))
    (when p
      (set-process-query-on-exit-flag p nil))))

当 Emacs 关闭时,这会使进程静默死亡。像这样使用它

(add-hook 'slime-inferior-process-start-hook #'emacs-forget-buffer-process)
(add-hook 'slime-repl-mode-hook #'emacs-forget-buffer-process)

我将它用于我拥有的所有类似 repl 的缓冲区,包括 octave、python、scheme、shell 和 haskell 的 ghci。到目前为止,当这些 repl 被无声地杀死时,没有发生任何不好的事情,所以我认为这个解决方案还不错,尽管可能并不优雅。

于 2012-04-19T19:32:51.157 回答
0

这是我使用的更通用的解决方案。它不仅适用于 SLIME,还适用于其他东西,例如 python、终端、lisp 等。

(defadvice save-buffers-kill-emacs (around no-query-kill-emacs activate)
  "Prevent annoying \"Active processes exist\" query when you quit Emacs."
  (flet ((process-list ())) ad-do-it))
于 2012-05-04T13:48:58.490 回答
0

这花了我一辈子。如果您打开了两个窗口,请切换到粘液窗口并点击 cx 0 以杀死该窗口。然后就可以通过cx cc正常杀掉emacs窗口了。

于 2019-10-17T05:22:09.970 回答
-1

不不不。https://stackoverflow.com/a/10780124/539797;任何其他杀死进程缓冲区的方法充其量都是粗鲁的,如果不是对儿童和小狗造成危险的话。

于 2012-06-01T19:38:32.890 回答