如何优雅地退出SLIME和Emacs?

Gre*_*ond 13 emacs elisp slime dot-emacs

当我退出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)
Run Code Online (Sandbox Code Playgroud)

据我所知,每当我退出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) 
Run Code Online (Sandbox Code Playgroud)

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

提前致谢.

Ale*_*son 23

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

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

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

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

  • 我更喜欢'退出'到'sayoonara'.它更短:-) (4认同)

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

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

(global-set-key (kbd "C-x C-c") 'kill-emacs-slime)
Run Code Online (Sandbox Code Playgroud)

(我假设您的函数正确退出 SLIME 并关闭其缓冲区,我尚未对其进行测试)。


Tre*_*son 2

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

将光标置于'slime-smart-quit例程内并键入M-x edebug-defun。然后像平常一样退出 Emacs。然后 Emacs lisp 调试器edebug应该会提示您。这是一个非常容易使用的调试器(键入?以获取帮助)。

单步调试代码,看看它在哪里没有达到您期望的效果。

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

重复直到您成功,或者获得有关该问题的更多信息。