优雅地退出SLIME和Emacs的方法是什么?

13

我有一个问题,关于如何在退出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) 

能否有人给我提供一些关于我的配置文件缺少什么的见解?

先感谢您提前提供帮助。


谁在乎快捷键呢?我们想要的是将一些内容粘贴到.emacs文件中,以便在emacs结束时退出SLIME。 - mcandre
10个回答

26

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

您可以执行一个SLIME命令来退出,这样您就会有一个干净漂亮的emacs环境。

在SLIME缓冲区中,输入, (逗号)。您被放置在迷你缓冲区中,并且SLIME会询问要执行哪个命令。键入sayoonara并按下Enter。您应该看到SLIME正在退出,迷你缓冲区会提到“连接关闭”。接着您会进入*scratch*缓冲区。

我想知道是否有一种方法可以从您的.emacs文件中简单地调用此“sayoonara”命令,而不是手动取消所有设置。


5
我更喜欢使用“退出”而不是“再见”。它更简短 :-) - Miron Brezuleanu
这将终止我的stumpwm会话。:) 我想我只需要(slime-disconnect) - daveloyall
该函数为 slime-repl-sayoonara。还有一个函数为 slime-repl-quit - upgrd

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

然后将其绑定到你的退出键。
(global-set-key (kbd "C-x C-c") 'kill-emacs-slime)

我假设你的功能已经正确退出SLIME并关闭其缓冲区,我没有测试过。

3
问题在于检查活动进程(以及确认杀死进程的查询)会在kill-emacs-hooks有机会执行其工作之前被激活。一个非常笨拙的解决方案:
(defadvice save-buffers-kill-terminal (before slime-quit activate)
  (slime-smart-quit)
  (sleep-for 1))

函数slime-quit-lisp是异步的;它在返回后需要时间才能完成,因此需要使用sleep-for函数。

2

@Alex - 我认为你的方法是退出SLIME最干净的方式。但是,需要按照以下方式编辑配置文件才能使用。

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

一旦按照以下方式设置完毕,那么:
  1. 按下逗号(,)键,以打开迷你缓冲区
  2. 输入quitsayoonara以干净地退出。
PS:查看此处的SLIME启动配置 - http://common-lisp.net/project/slime/doc/html/Loading-Contribs.html

2

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

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

逐步执行代码,看看它没有按照您的期望执行的地方。

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

重复以上步骤,直到找到成功的解决方案或有更多关于问题的信息。


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 的缓冲区,包括 octave、python、scheme、shell 和 haskell 的 ghci。到目前为止,当这些 repl 被静默地杀死时,没有发生任何不良情况,因此我认为这个解决方案并不糟糕,尽管可能不太优雅。


0

这是我使用的更通用的解决方案。 它不仅适用于SLIME,还适用于其他东西,例如python、终端、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))

0

这里是我认为更好的解决方案,它专门忽略只有SLIME缓冲区。如果用户中止kill-emacs命令,它不会实际终止进程,也不需要等待slime异步优雅地退出。

(defun process-ignore-on-exit (regexp)
  (cl-loop for proc in (process-list)
           when (s-matches-p regexp (process-name proc))
           do
           (progn (message "disabling query-on-exit for '%s'" proc)
                  (set-process-query-on-exit-flag proc nil))))

(defun slime-ignore-processes-on-exit (&rest r)
  (process-ignore-on-exit "SLIME"))

(advice-add #'save-some-buffers :before #'slime-ignore-processes-on-exit)

0

这花了我很长时间才搞定。如果你打开了两个窗口,请切换到 slime 窗口,按下 c-x 0 来关闭那个窗口。然后你可以通过 c-x c-c 正常地关闭emacs窗口。


-1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接