【问题标题】:How to gracefully exit SLIME and Emacs?如何优雅地退出 SLIME 和 Emacs?
【发布时间】:2011-01-21 05:00:30
【问题描述】:

当我退出 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。

标签: emacs elisp dot-emacs slime


【解决方案1】:

这花了我一辈子。如果您打开了两个窗口,请切换到粘液窗口并按 c-x 0 杀死该窗口。然后就可以通过c-x c-c正常杀死emacs窗口了。

【讨论】:

    【解决方案2】:

    不,不,不。 https://stackoverflow.com/a/10780124/539797 ;任何其他杀死进程缓冲区的方法充其量都是粗鲁的,即使对儿童和小狗来说不是很危险。

    【讨论】:

      【解决方案3】:

      这是我使用的更通用的解决方案。 它不仅适用于 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))
      

      【讨论】:

        【解决方案4】:

        我觉得每次关闭 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 被无声地杀死时,没有发生任何不好的事情,所以我认为这个解决方案还不错,虽然可能不太优雅。

        【讨论】:

          【解决方案5】:

          @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

          【讨论】:

            【解决方案6】:

            根据manual page on this,“一旦 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 并关闭了它的缓冲区,我还没有测试过)。

            【讨论】:

              【解决方案7】:

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

              一个非常笨拙的解决方案:

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

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

              【讨论】:

                【解决方案8】:

                我知道这并不完全符合您的要求,但也许这会对像我这样的其他菜鸟有所帮助。

                您可以执行 SLIME 命令 退出,这样您就可以留下一个漂亮、干净的 emacs。

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

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

                【讨论】:

                • 我更喜欢“退出”而不是“sayoonara”。它更短:-)
                • 这将终止我的 stumpwm 会话。 :) 我想我只需要(slime-disconnect)
                • 函数是slime-repl-sayoonara。还有slime-repl-quit
                【解决方案9】:

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

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

                单步执行代码,看看它在哪些地方没有按照您的预期执行。

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

                重复直到你找到成功,或者有更多关于问题的信息。

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2011-10-20
                  • 1970-01-01
                  • 2014-04-30
                  • 1970-01-01
                  • 1970-01-01
                  • 2019-04-14
                  • 2010-12-16
                  • 1970-01-01
                  相关资源
                  最近更新 更多