[英]How to gracefully exit SLIME and 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)
據我所知,每當我退出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)
有人可以對我的配置中缺少的內容發表一些見解嗎?
提前致謝。
我知道這並不是您所要求的,但這可能會對像我這樣的其他菜鳥有所幫助。
您可以執行SLIME命令退出,這樣就剩下一個漂亮,干凈的emacs。
在SLIME緩沖區中,輸入, (逗號)。 您被放置在迷你緩沖區中,SLIME詢問要執行哪個命令。 輸入 sayoonara,然后按Enter 。 您應該看到SLIME正在退出,微型緩沖區中提到“連接已關閉”。 然后將您放在* scratch *緩沖區中。
我想知道是否有某種方法可以從.emacs中簡單地調用此“ sayoonara”命令,而不是手動取消所有連接。
根據此手冊的頁面 ,“一旦完成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並關閉了它的緩沖區,但我尚未對其進行測試)。
問題是在kill-emacs-hooks
有機會執行工作之前,將激活活動進程的檢查(以及用於確認終止的查詢)。
一個非常笨拙的解決方案:
(defadvice save-buffers-kill-terminal (before slime-quit activate)
(slime-smart-quit)
(sleep-for 1))
功能slime-quit-lisp
是異步的; 返回后需要一些時間才能完成,因此需要sleep-for
。
調試問題的一種方法是調試功能。
將光標置於'slime-smart-quit
例程內,然后鍵入Mx edebug-defun 。 然后像往常一樣退出Emacs。 然后,應該由Emacs lisp調試器edebug提示。 這是一個非常容易使用的調試器(鍵入?獲得幫助)。
逐步檢查代碼,看看它在哪里沒有執行您期望的工作。
使用q退出調試器,然后進行更改,然后再次使用Mx edebug-defun調試新版本。
重復進行直到找到成功,或者有更多有關該問題的信息。
@Alex-我發現您的方法是退出SLIME的最干凈的方法。 但是,配置文件需要以這種方式進行編輯才能使用。
(require 'slime-autoloads)
(slime-setup '(slime-fancy)) ; load contrib packages
一旦以這種方式設置,則:
PS:在啟動時檢查此為泥配置- http://common-lisp.net/project/slime/doc/html/Loading-Contribs.html
我發現每次關閉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的緩沖區,其中包括八度,python,scheme,shell和haskell的ghci。 到目前為止,當這些代表被無聲殺死時,沒有什么不好的事情發生,所以我認為這個解決方案雖然不好,但也不錯。
這是我使用的更通用的解決方案。 它不僅適用於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))
這花了我永遠。 如果您打開了兩個窗口,請切換到史萊姆窗口,然后按cx 0終止該窗口。 然后,您可以通過cx cc正常終止emacs窗口。
不不不。 https://stackoverflow.com/a/10780124/539797 ; 殺死進程緩沖區的任何其他方式,即使對孩子和幼犬來說都不是危險的,至多也是無禮的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.