2010-02-25 45 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))