2010-02-25 43 views
11

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

;; 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的过程。然而,每次我离开,我仍然得到提示:

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) 

有人能摆脱一些见解,以什么我是从我的配置缺少什么?

在此先感谢。

+0

谁在乎快捷键?我们希望粘贴到emacs结束时退出SLIME的.emacs中。 – mcandre 2010-11-16 00:46:32

回答

2

调试问题的一种方法是调试该功能。

将光标放入'slime-smart-quit例程中,并输入M-x edebug-defun。然后像平常一样退出Emacs。 Emacs lisp调试器edebug会提示您。这是一个非常容易使用的调试器(请输入以获得帮助)。

逐句通过代码,看看它没有做你期望的事情。

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

重复,直到找到成功为止,或者获得更多关于该问题的信息。

21

我知道这不完全是你要求的,但也许这会对像我这样的其他noobs有帮助。

你可以执行一个SLIME命令退出,这样你就可以拥有一个干净利落的emacs了。

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

我不知道是否有一些方法可以简单地从您的.emacs中调用此“sayoonara”命令,而不是手动解除所有连接。

+4

我宁愿'退出'到'sayoonara'。它更短:-) – 2012-03-04 18:10:52

+1

也许是这样,但'sayoonara'是更酷的ψ('∇')ψ – rsenna 2013-09-25 02:04:00

+0

这终止了我的stumpwm会话。 :)我想我只需要'(粘液断开)'。 – daveloyall 2015-09-01 20:19:55

3

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

一个非常缺憾溶液:

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

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

4

根据manual page on this,“一旦save-buffers-kill-emacs完成了所有的文件保存和确认,它会调用kill-emacs来运行该钩子中的函数。”因此,在调用钩子之前检查活动进程。

一个可行的解决方案将是使自己杀死-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并关闭缓冲区,我没有测试过)。

1

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

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

一旦它建立这样,那么:

  1. 逗号(,)弹出迷你缓冲区
  2. 退出sayoonara完全退出。

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

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样的缓冲区,我有,其中包括八度,蟒蛇,方案,外壳和Haskell的ghci的。到目前为止,没有什么不好的事情发生,当这些repls被无声地杀害,所以我认为这个解决方案并不差,但可能不优雅。

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))