簡體   English   中英

如何正常退出SLIME和Emacs?

[英]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

一旦以這種方式設置,則:

  1. 逗號(,)調出迷你緩沖區
  2. 鍵入quitsayoonara干凈退出。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM