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)

私の知る限り、これにより SLIME が自動的に強制終了され、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) 

構成に何が欠けているかについて、誰かが洞察を得ることができますか?

前もって感謝します。

4

9 に答える 9

25

私はそれがあなたが求めたものと正確に一致しないことを知っていますが、おそらくこれは私のような他の初心者に役立つでしょう.

SLIME コマンドを実行して終了することができるので、きれいでクリーンな emacs が残ります。

SLIME バッファーに,(カンマ) を入力します。ミニバッファに入り、SLIME がどのコマンドを実行するか尋ねてきます。と入力しsayoonaraてヒットしEnterます。SLIME が終了し、ミニバッファーに「接続が閉じられました」と表示されます。そしてあなたは *scratch* バッファに入れられます。

手動ですべての配線を外すのではなく、.emacs からこの「sayoonara」コマンドを呼び出すだけの方法があるのではないかと思います。

于 2010-08-04T02:40:21.587 に答える
5

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を正しく終了し、そのバッファを閉じると仮定していますが、テストしていません)。

于 2010-11-16T17:49:41.167 に答える
3

問題は、アクティブなプロセスのチェック(および強制終了の確認のクエリ)がkill-emacs-hooks、そのジョブを実行する前にアクティブ化されることです。

非常に厄介な解決策:

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

関数slime-quit-lispは非同期です。戻ってから終了するまでに時間がかかるため、sleep-for

于 2010-11-16T13:16:50.000 に答える
2

問題をデバッグする 1 つの方法は、関数をデバッグすることです。

'slime-smart-quitルーチン内にカーソルを置き、と入力しM-x edebug-defunます。次に、通常どおり Emacs を終了します。その後、Emacs Lisp デバッガーedebugによってプロンプトが表示されます。使用するのは非常に簡単なデバッガー?です (ヘルプのタイプ)。

コードをステップ実行して、期待どおりに動作しない場所を確認します。

qデバッガーを終了してから変更を加え、M-x edebug-defun新しいバージョンを再度デバッグするために使用します。

成功するまで、または質問に対する情報がもう少し得られるまで繰り返します。

于 2010-02-25T21:38:02.417 に答える
2

@Alex - あなたの方法が SLIME を終了する最もクリーンな方法であることがわかりました。ただし、構成ファイルを使用するには、この方法で編集する必要があります。

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

このように設定したら、次のようにします。

  1. カンマ (,)を押してミニバッファを呼び出します
  2. きれいに終了するには、 quitまたはsayoonaraと入力します。

PS: 起動時の SLIME 設定を確認してください - http://common-lisp.net/project/slime/doc/html/Loading-Contribs.html

于 2010-12-06T22:01:27.123 に答える
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)

オクターブ、python、スキーム、シェル、および haskell の ghci を含む、私が持っているすべての repl のようなバッファーに使用します。これまでのところ、これらの repl が黙って殺されても悪いことは何も起こらなかったので、この解決策は悪くないと思いますが、優雅ではないかもしれません。

于 2012-04-19T19:32:51.157 に答える
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))
于 2012-05-04T13:48:58.490 に答える
-1

ダメダメダメ。https://stackoverflow.com/a/10780124/539797 ; プロセスバッファを殺す他の方法は、子供や子犬にとって明白な危険ではないにしても、せいぜい失礼です。

于 2012-06-01T19:38:32.890 に答える