Slime-fancy (slime-autodoc) を使用した Clojure と Common Lisp の両方の emacs セットアップ
-
08-10-2019 - |
質問
clojure と common lisp の両方に emacs をセットアップしましたが、common lisp にも (slime-setup '(slime-fancy)) が必要です。その行を init.el に追加すると、clojure は機能しなくなります。repl は表示されますが、コードを実行するとハングします。
私の構成
クロージャの場合:
- ELPA経由でclojure-mode、slime、slime-replをセットアップしました
- プロジェクトディレクトリで $ lein swank を実行します
- 次に、M-x スライムコネクトして Clojure をハックします。
Common Lisp の場合、これを init.el の ELPA コードの後に配置します。
(add-to-list 'load-path "~/.elisp/slime")
(require 'slime)
(add-to-list 'slime-lisp-implementations '(sbcl ("/opt/local/bin/sbcl") :coding-system utf-8-unix))
;; (slime-setup '(slime-fancy))
したがって、最後の行のコメントを解除すると、clojure が壊れてしまいます。しかし、slime-fans は、Common Lisp をハッキングするための非常に重要なメタ パッケージです。
言語を切り替える必要があるときに構成を変更したり再起動したりせずに、両方が機能するように設定する方法はありますか?
アップデート
Slime-fancy をロードした Slime-autodoc がハングの原因であることがわかりました。
(slime-setup '(slime-fancy))
(setq slime-use-autodoc-mode nil)
この設定により、common lisp と clojure SLIME の両方を実行できるようになります。同時にでも。ただし、スライムオートドキュメントはありません。
また、ELPA コードの後に手動で (add-to-list 'load-path "~/.elisp/slime") を実行しているため、SLIME の CVS バージョンを使用していることもわかりました。それで問題は解決しません。おそらく、clojure で動作するマジックデートのバージョンがあるのでしょうか?ここで男性は CVS バージョンが機能すると言っています: http://www.youtube.com/watch?v=lf_xI3fZdIg&feature=player_detailpage#t=221s
解決
ここに解決策があります。(フックを使用)
それは醜いですが、非常に便利です。
(add-hook 'slime-connected-hook
(lambda ()
(if (string= (slime-lisp-implementation-type) "Clojure")
(setq slime-use-autodoc-mode nil)
(setq slime-use-autodoc-mode t))
))
(add-hook 'slime-mode-hook
(lambda ()
(if (eq major-mode 'clojure-mode)
(slime-autodoc-mode 0)
(slime-autodoc-mode 1))))
アップデート問題がまだ存在する場合は、 slime-repl
バッファーがある場合は、次のコードを試してください。
(add-hook 'slime-repl-mode-hook
(lambda ()
(if (string= (slime-lisp-implementation-type) "Clojure")
(progn (setq slime-use-autodoc-mode nil)
(slime-autodoc-mode 0))
(progn (setq slime-use-autodoc-mode t)
(slime-autodoc-mode 1)))))
他のヒント
私は最近同じ問題について考えています。問題は、ELPA の SLIME がトリミングされていて、Common Lisp ではほとんど役に立たないことです。この問題を回避できる 1 つの方法は、ELPA パッケージのチェックアウトが行われたのと同じ日付から CVS から SLIME をチェックアウトし、不足しているものを手動で追加することです。#clojure の誰かが、そうして解決策がうまくいったと私に言いました。私個人としては、このようなソリューションはかなり醜いと思いますが、誰かがアップストリームの SLIME に Clojure サポートを導入するまでは、これより良いソリューションは存在しないでしょう。
あるいは、slime-setup に機能を 1 つずつ追加して、どの機能が Clojure の評価で問題を引き起こしているのかを正確に確認することもできます。結局のところ、slime-fancy は最も人気のある contrib 機能をロードするだけの単なるメタ機能です。
ところで、ラインは必要ありません
(add-to-list 'load-path "~/.elisp/slime/contrib")
(setq slime-backend "~/.elisp/slime/swank-loader.lisp")
(require 'slime)
contrib ディレクトリはロード パスに自動的に追加されます。バックエンドがデフォルトです。slime-autoloads を使用している場合は、自動ロードの目的を損なうため、その前にスライムを必要とする必要があります。
私は sbcl、clozure、clojure を使用します。 Emacs、Slime、Common Lisp (SBCL、Clozure)、および Clojure を連携させる