使用slime-fancy(slime-autodoc)配置emacs,支持Clojure和Common Lisp。

10

我为Clojure和Common Lisp都设置了Emacs,但我想为Common Lisp添加(slime-setup'(slime-fancy))。如果我将该行添加到init.el中,则Clojure将无法工作:它会给我一个repl,但在运行任何代码后会挂起。

我的配置

对于Clojure:

  • 我通过ELPA设置了clojure-mode、 slime、 slime-repl
  • 我在项目目录中运行$ lein swank
  • 然后M-x slime-connect以hack 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-fancy 是一个非常重要的元包,用于研究 Common Lisp。


有没有一种方法可以在不更改配置和重新启动的情况下使它们都能正常工作,以便我需要切换语言时使用?


更新

我发现slime-fancy加载的slime-autodoc是导致程序卡顿的原因。

(slime-setup '(slime-fancy))
(setq slime-use-autodoc-mode nil)

这个配置允许同时运行Common Lisp和Clojure SLIME,但没有slime-autodoc。我发现我使用的是CVS版本的SLIME,因为在ELPA代码后手动执行(add-to-list 'load-path "~/.elisp/slime")。这并不能解决问题。也许有一个特定日期的版本适用于Clojure?这里有个人说CVS版本适合他:http://www.youtube.com/watch?v=lf_xI3fZdIg&feature=player_detailpage#t=221s

1
我有同样的问题,这让我很恼火。 - user284244
3个回答

8
这里有一个解决方案。(使用hooks)
虽然不太美观,但相当方便。
(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)))))

你的丑陋解决方案比我的好。 - koddo

4
最近我一直在思考同样的问题。问题是ELPA中的SLIME版本过于简化,对于Common Lisp几乎无法使用。你可以绕开这个问题的方法是从与ELPA软件包检出相同日期的CVS中获取SLIME,然后手动添加缺失的内容。#clojure上的某个人告诉我他做到了这一点,解决方案有效。个人认为这种解决方案相当丑陋,但在有人成功将Clojure支持纳入upstream SLIME之前,不会有更好的解决方案。
或者,您可以逐个向slime-setup添加功能,并查看哪个功能导致Clojure评估的问题 - 毕竟,slime-fancy只是一个元特性,仅加载最流行的贡献功能。顺便说一句,您不需要

标签。

(add-to-list 'load-path "~/.elisp/slime/contrib")
(setq slime-backend "~/.elisp/slime/swank-loader.lisp")
(require 'slime)

contrib目录将自动添加到加载路径中,后端是默认的。如果您正在使用'slime-autoloads',则应在其之前要求slime,因为这会破坏自动加载的目的。


1
谢谢您的回答,但是由ELPA安装的04-04-2010年的CVS版本根本不起作用。我还发现slime-fancy加载的slime-autodoc会导致挂起。请参见更新。 - koddo
我也从我的init.el中删除了那些不必要的行。谢谢。 - koddo

1

请阅读我的问题并更新。我在那里写了我已经使用了CVS版本,但没有帮助。而且你为什么要在这里发布整个.emacs文件?你认为这有帮助吗? - koddo
请查看此链接以获取更多帮助:http://bit.ly/h0b6mV。是的,它可以解决你的问题。我之前也遇到了同样的问题。 - m7d
我清理了这里的.emacs配置,并写了一篇博客文章来帮助你和其他人。我希望它能对你有所帮助。对我来说非常有效。 - m7d
我刚刚又尝试了一次。我更新了SLIME,启动了lein swank,并执行了M-x slime-connect。但是使用slime-fancy时它像往常一样挂起了。对我来说不起作用。 - koddo
npoektop:如果您提供更多细节,例如您的.emacs配置以及如何获取Clojure等信息,我很乐意尝试并提供帮助。 - m7d
@m7d 当你评估一个带有错误的表达式时会发生什么?例如 (+ "" "")。使用最新的CVS SLIME,它无法正确处理错误,而是会出现SLIME(或swank)错误:“'error in process filter: Wrong number of arguments: nil, 0'”。根据这个 https://github.com/technomancy/swank-clojure/issues/issue/31 最新的SLIME将无法与swank-clojure一起使用。你能试试并回报吗?如果你让它工作了,我很想知道。 - okonomichiyaki

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