如何优雅地退出SLIME和Emacs?

时间:2010-02-25 20:57:59

标签: emacs elisp dot-emacs slime

当我退出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) 

有人可以从我的配置中找到我缺少的东西吗?

提前致谢。

9 个答案:

答案 0 :(得分:23)

我知道这并不是你要求的,但也许这对我这样的其他新手很有帮助。

您可以执行 SLIME命令退出,这样您就可以获得一个漂亮,干净的emacs。

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

我想知道是否有一些方法可以简单地从.emacs中调用这个“sayoonara”命令,而不是手动取消所有内容。

答案 1 :(得分:4)

根据manual page on this,“一旦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并关闭它的缓冲区,我还没有测试过它。)

答案 2 :(得分:3)

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

一个非常愚蠢的解决方案:

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

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

答案 3 :(得分:2)

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

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

逐步查看代码,看看它没有按预期执行的操作。

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

重复直到找到成功为止,或者为问题提供更多信息。

答案 4 :(得分:2)

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

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

一旦这样设置:

  1. 逗号(,)以显示迷你缓冲区
  2. 键入退出 sayoonara 以便彻底退出。
  3. PS:在启动时检查此SLIME配置 - http://common-lisp.net/project/slime/doc/html/Loading-Contribs.html

答案 5 :(得分: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。到目前为止,没有什么不好的事情发生,当这些复制品被无声地杀死,所以我认为这个解决方案并不坏,虽然可能不是很优雅。

答案 6 :(得分:0)

这是我使用的更通用的解决方案。 它不仅适用于SLIME,也适用于其他内容,例如: python,terminal,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))

答案 7 :(得分:0)

这使我永远。如果您打开了两个窗口,请切换到史莱姆窗口,然后按c-x 0杀死该窗口。然后,您可以通过c-x c-c正常杀死emacs窗口。

答案 8 :(得分:-1)

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