在Emacs中为Clojure设置SLIME和Inferior-Lisp

5

SLIME

我对Clojure和emacs都比较新手,一直在尝试为Clojure设置SLIME。官方文档(链接)默认你已经熟练掌握emacs的使用,没有一大堆可以添加到配置文件中的代码。由于我对Clojure数据分析很感兴趣,如果可能的话,我不想处理Leiningen,但是我需要slime提供的动态环境。

我已经从git中安装了Clojure并在/opt/clojure/中安装了clojure-contrib,而且我可以得到一个repl。我从这个教程中在`~/.bin`中安装了swank-clojure、clojure-mode和slime。当这个方法不能正常工作时,我从官方文档的评论部分添加了一些东西。

当我使用M-x slime启动slime时,我会得到一个持续的Polling "/tmp/slime.14113".. (Abort with 'M-x slime-abort-connection'.)
这是我的init-clj.el
;; clojure-mode
(add-to-list 'load-path "~/.bin/clojure-mode")


;; swank-clojure
(add-to-list 'load-path "~/.bin/swank-clojure")

(setq swank-clojure-jar-path "/opt/clojure/clojure.jar"
  swank-clojure-extra-classpaths (list
                  "~/.bin/swank-clojure/src/swank"
                  "/opt/clojure/clojure-contrib/target/clojure-contrib-1.2.0-SNAPSHOT.jar"))

(require 'swank-clojure)

;; slime
(eval-after-load "slime" 
  '(progn (slime-setup '(slime-repl))))

(add-to-list 'load-path "~/.bin/slime")
(require 'slime)
(eval-after-load 'slime '(setq slime-protocol-version 'ignore))
  (slime-setup '(slime-repl))
(require 'clojure-mode)
(require 'clojure-test-mode)

当我打开ants.clj并调用它时,出现以下错误:

(progn (load "/home/kca/.bin/slime/swank-loader.lisp" :verbose t) (funcall (read- from-string "swank-loader:init")) (funcall (read-from-string "swank:start-server") "/tmp/slime.14113" :coding-system "iso-latin-1-unix"))

Clojure 1.2.0-master-SNAPSHOT
user=> java.lang.Exception: Unable to resolve symbol: progn in this context (NO_SOURCE_FILE:1)

劣质的Lisp

我在.bin/中创建了一个名为clj-repl的脚本,其中包含启动repl的java命令。然后我使用M-x set-variable inferior-lisp-program /home/wdkrnls/.bin/clj-repl。Emacs抱怨它是错误的类型。


2
关于劣质的Lisp设置:如果您正在执行M-x set-variable inferior-lisp-program,然后跟随脚本路径,请确保将路径用双引号括起来;否则它不会被读取为字符串,Emacs会抱怨结果类型(可能是符号)。如果这没有帮助,您可以提供有关脚本的更多详细信息以及在Emacs中执行的操作(或~/.emacs / ~/.emacs.d/init.el)以将其设置为您的劣质Lisp程序。 - Michał Marczyk
谢谢Michal。现在它可以工作了。我有两个问题,第一个就是你说的那个。第二个是当我在脚本路径周围加引号时,我没有杀死旧的inferior-lisp进程,所以看起来像是发生了其他事情。 - wdkrnls
2个回答

5

使用Clojure的最佳方式是首先安装Leiningen

然后将Swank Clojure作为Leiningen插件进行安装。

接下来,我建议您从.emacs中删除当前的自定义Clojure设置,并安装ELPA,然后在您的.emacs文件中设置以下初始化代码:

;; Find this line, added by ELPA:
(require 'package)
;; and add the following expression:
(add-to-list 'package-archives
             '("marmalade" . 
               "http://marmalade-repo.org/packages/") t)
;; ... and the rest of the ELPA init code
(package-initialize)

然后运行 package-list-packages 命令,安装 clojure-modeslime(如果需要的话还可以安装 paredit),以及其他你可能需要的内容。这样就可以在 (Leiningen) Clojure 项目中使用 SLIME 了。尽管这里的过程看起来很复杂,但你可以从你的项目中创建一个单一的 "uberjar" 文件,在其他服务器上部署时不会有任何依赖问题。

感谢您详细的回复,John。但是我对学习Clojure的原因在于它的统计计算特性。因此,我不需要在服务器上部署任何东西。如果可以设置emacs+slime+clojure-mode而无需定义"项目",那将是理想的情况。 - wdkrnls
1
嗨。使用Clojure,设置一个leningen项目可以使设置Slime变得非常容易。即使你只是用它来引导到repl,我也建议你这样做。本质上,你可以创建一个空项目,只需在命令提示符处输入'lein swank',就可以开始了。 - justinhj
1
实际上,您可以在没有项目的情况下使用 lein repllein swank(它将设置一个CLASSPATH,以加载.lib/目录中的JAR文件和.src/目录中的Clojure代码),但是像 lein new 一样创建一个项目同样容易 :)。 - John Cromartie
1
Swank Clojure文档表示该项目已被弃用,建议使用nREPL代替。nREPL更容易安装,因为可以使用软件包管理器。 - ckim

1

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