【问题标题】:Setting up emacs/slime/swank for clojure with leiningen使用 leiningen 为 clojure 设置 emacs/slime/swank
【发布时间】:2011-12-13 11:02:49
【问题描述】:

短版:使用 lein swank 启动 swank 服务器时,运行 M-x slime-connect 或 M-x clojure-jack-in 时出错。

我在 Ubuntu 10.10 上使用 emacs 24.0.50.1。我在 ELPA 的 emacs 中安装了以下软件包:clojure-mode、paredit、slime、slime-repl

我从 github 安装了 leiningen 并将其添加到类路径中,然后运行 lein plugin install swank-clojure 1.3.3。 之后,我创建了一个新目录 ~/tmp/,cd 进入它并运行: lein new test-project 似乎一切正常。然后我在emacs中打开/tmp/new-project/project.clj,改成:

(defproject test-project "1.0.0-SNAPSHOT"
:description "Test Project"
:dependencies [[org.clojure/clojure "1.2.1"]
               [org.clojure/clojure-contrib "1.2.0"]]
:dev-dependencies [[swank-clojure "1.3.3"]])

之后我回到 /tmp/new-project 文件夹并运行 lein deps 然后运行 ​​lein swank 以下载依赖项并启动提供输出的 swank 服务器:

Connection opened on local port 4005.

回到 emacs 是我在连接到 swank 服务器时遇到的问题。我已经尝试打开 core.clj 文件并运行 M-x slime-connect,它给出了错误:

Symbol's function definition is void: define-slime-contrib

这让我觉得它要么没有看到 swank 服务器正在运行,要么需要进行一些配置才能看到服务器。我也尝试过(打开相同的文件并打开 project.clj)M-x clojure-jack-in我假设尝试在项目文件夹中启动 clojure REPL,但这给出了以下内容:

Debugger entered--Lisp error: (error "Could not start swank server: sh: lein: not found
")
signal(error ("Could not start swank server: sh: lein: not found\n"))
error("Could not start swank server: %s" "sh: lein: not found\n")
clojure-jack-in-sentinel(#<process swank> "exited abnormally with code 127\n")

我按照 http://matthias-schneider.org/docs/clojure-setup/ 的指示进行 emacs 包和 lein 设置,然后开始按照 http://riddell.us/ClojureSwankLeiningenWithEmacsOnLinux.html 的测试配置说明进行操作,因为我无法让 M-x slime-connect 打开 REPL。

更新

删除 ~/tmp/test-project,卸载 emacs 和 /.emacs.d/elpa/ 包,重新安装 emacs,重新安装 clojure-mode 和 paredit 包,将 ~/.lein 复制到 /bin 以确保没有路径问题(不确定 /.lein 或 /.lein/bin 是否需要在路径中)。跑/.lein/bin/swank-clojure,然后打开emacs,打开project.clj,尝试M-x slime-connect,它现在要求我提供主机(本地默认),端口(默认4005),说连接到swank,给出关于swank的消息和粘液版本不同(y 或 n)y,然后 minibuffers 给出error in process filter: Lisp connection closed unexpectedly。在我运行 /.lein/bin/swank-clojure 的终端中,弹出以下 java 错误:

exception in read loop
java.lang.NumberFormatException: For input string: "    a6"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.lang.Integer.parseInt(Integer.java:470)
at swank.core.protocol$read_swank_message.invoke(protocol.clj:41)
at swank.core.connection$read_from_connection.invoke(connection.clj:59)
at swank.core$read_loop.invoke(core.clj:337)
at swank.swank$connection_serve$fn__1486$fn__1487.invoke(swank.clj:32)
at clojure.lang.AFn.applyToHelper(AFn.java:159)
at clojure.lang.AFn.applyTo(AFn.java:151)
at clojure.core$apply.invoke(core.clj:540)
at swank.swank$connection_serve$fn__1486.doInvoke(swank.clj:29)
at clojure.lang.RestFn.invoke(RestFn.java:397)
at clojure.lang.AFn.run(AFn.java:24)
at java.lang.Thread.run(Thread.java:636)

更新: 解决了,我需要卸载 emacs 并删除所有 /.emacs.d/,而不仅仅是 /elpa/ 中的包。重新安装后,我只得到了 clojure-mode 包,而不是 slime 或 slime-repl。现在可以与M-x clojure-jack-in 联系并准备好做一些工作了!

【问题讨论】:

    标签: emacs clojure slime swank leiningen


    【解决方案1】:

    您不需要安装 slime 和 slime-repl:它们已嵌入到 lein 的插件中(请参阅 jar 内部:swank-clojure-1.4.0-SNAPSHOT.jar\swank\payload)。您只需安装 clojure-mode。

    另外,在“重新安装”的时候,记得把$HOME目录下的隐藏文件夹.emacs.d也删掉,否则它会保留你之前下载的Emacs插件。

    最后更喜欢 clojure-jack-in,而不是 slime-connect - 只是有 slime-connect 意味着你在 Emacs 中仍然有一个 SLIME,所以你没有删除它。

    【讨论】:

    • 谢谢!做到了。我转储了 /.emacs.d/ 并再次重新安装(在我刚刚删除 /.emacs.d/elpa/ 中的文件夹之前)。然后我只重新安装了 clojure-mode 包。现在适用于M-x clojure-jack-in。我想这与我正在下载的 slime 或 slime-repl 软件包有关。还在使用 swank-clojure 1.3.3 并且它在没有粘液包的情况下工作,所以我会避免 1.4.0-SNAPSHOT 除非弹出其他东西。
    【解决方案2】:

    我写了一个初学者指南来设置 Emacs + nREPL 客户端自动完成和文档弹出,因为大多数旧指令都不合适。可用here。可能对新手有所帮助。

    【讨论】:

    • 教程更新为使用 nrepl.el 来支持 SLIME 和 swank-clojure。
    【解决方案3】:

    无需安装 lein swank 插件。您可以在 project.clj 文件中添加依赖项,只需 lein swankM-x slime-connect

    尝试使用 swank-clojure "1.2.1",它对我有用。

    【讨论】:

    • 在 project.clj 中更改为“1.2.1”,运行lein deps,ls 在 lib/dev/ 中显示“1.2.1”,lein swank,&M-x slime-connect 给出相同的错误.感谢您尝试,虽然我只是使用较新的版本,因为我不确定 emacs 24 是否会对旧版本有问题。
    • 卸载插件并重试。您可以参考已知问题在 swank-clojure github 帐户中:github.com/technomancy/swank-clojure
    • lein plugin uninstall swank-clojure 1.3.3 卸载了插件(~/.lein/plugins 现在是空的),在项目文件夹中运行lein deps & lein swankM-x slime-connectM-x clojure-jack-in 仍然给出同样的错误。我现在注意到的是,在运行 lein swank 时,它会给出:user=&gt; Connection opened on local port 4005 #&lt;ServerSocket ServerSocket[addr=localhost/127.0.0.1,port=0,localport=4005]&gt; 而不是原帖中的单行
    • @element8 :正确!收到上述消息后执行 M-x slime-connect!
    • 我做到了,但它仍然在原始帖子中给出相同的错误消息。你认为这可能与我从 ELPA 下载的软件包有关吗?
    【解决方案4】:

    尝试执行以下操作,这对我在 Ubuntu 上使用 Emacs 24 有效:

    1. 安装 Leiningen。确保你安装lein的目录在$PATH上!
    2. 安装 swank-clojure 插件:

      lein plugin install swank-clojure 1.3.3

    3. 使用lein new 创建一个新项目。不要将swank-clojure添加到:dev-dependencies。 (你真的只需要一个或另一个,插件或:dev-dependencies 中的条目。)

    4. 启动 Emacs,确保它可以在 $PATH 上“看到”lein,例如像这样:

      PATH=$PATH:/path-to/dir-where/lein-is emacs

      (使用此命令尝试一下。要永久使用,您应该更新.profile 文件中的$PATH 或将lein 安装在$PATH 上已经存在的位置。在标准的Ubuntu 安装中, ~/bin 应该在 $PATH 上。)

    5. 从项目中打开一个文件,例如project.clj,然后运行 ​​M-x clojure-jack-in。这应该会启动 Swank 服务器并将 SLIME REPL 连接到它。

    【讨论】:

    • 谢谢,我想我离得更近了,但还不是很远。我按照您的指示使用 PATH=$PATH:/home/element8/.lein emacs-snapshot 开始了 emacs。在 emacs 中,我在 /tmp/test-project 中打开了 project.clj,并尝试了M-x clojure-jack-in,它提供了 minibuffer:starting swank... 然后Loading 快速,我无法全部阅读,但它看起来像粘液/.emacs.d/,然后给出相同的错误Symbol's function definition is void: define-slime-contrib
    • 我也尝试将 ~/.lein 复制到 /bin 并给出与上述相同的错误,我想我将尝试重新安装 emacs 并再次获取软件包以确保不是问题。
    • 重新安装了 emacs,重新安装了我拥有的 4 个包(clojure-mode、slime、slime-repl 和 paredit),当包编译但它们编译时出现了一些警告,并运行 M-x clojure-jack-in project.clj open 给出以下消息:Starting swank server... Loading /home/element8/.emacs.d/swank/slime-c3230b2c.elc... error in process filter: eval-buffer: Symbol's function definition is void: define-slime-contrib error in process filter: Symbol's function definition is void: define-slime-contrib 我认为我的问题在于 .emacs.d 中的 slime 包,但我不确定。
    • 看起来我错了,从 emacs 中删除了 slime 和 slime-repl 包并且发生了同样的错误,看起来它来自 /.emacs.d/swank/ 我认为它来自 swank -clojure 1.3.3 安装在 lein 中。
    【解决方案5】:

    当我从旧版本克隆别人的 clojure 项目时,这发生在我身上。他们的 project.clj 有:

    :dev-dependencies [[lein-clojars "0.5.0"]
                       [swank-clojure "1.2.1"]]
    

    如果您使用的是M-x clojure-jack-in,我认为这是不正确的。删除这些行,运行 lein deps 并插入对我有用。

    【讨论】:

      猜你喜欢
      • 2011-01-23
      • 1970-01-01
      • 2010-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-08
      相关资源
      最近更新 更多