Clojure的Emacs/Swank/Paredit温和教程
我将转到Emacs处理/Lisp。 我需要在Emacs上设置哪些信息才能执行以下操作Clojure的Emacs/Swank/Paredit温和教程,emacs,clojure,Emacs,Clojure,我将转到Emacs处理/Lisp。 我需要在Emacs上设置哪些信息才能执行以下操作 自动匹配/生成相应的结束括号 自动缩进Lisp/Clojure样式,而不是C++/Java样式 语法突出显示 援引 能够将文件中的一部分代码加载到REPL中并对其求值 在Emacs上设置之后,如果我还可以获得获取这些内容的命令列表,那就太好了。该工具包获得了关于Clojure入门的好评: 只回答问题中的时髦部分: Leiningen是使用正确的类路径设置swank并将其连接到Emacs的一种非常简单的方法 这里
(defproject project "0.1"
:dependencies [[org.clojure/clojure
"1.1.0-master-SNAPSHOT"]
[org.clojure/clojure-contrib
"1.0-SNAPSHOT"]]
:dev-dependencies [[leiningen/lein-swank "1.1.0"]]
:main my.project.main)
然后运行:
lein swank
从Emacs:
alt-x slime-connect
[从非作者处编辑:这是从2010年开始的,自2011年5月以来,这一过程已大大简化。我将在2012年2月的设置说明中添加一篇帖子。]
您需要将几个部分组合在一起:Emacs、SLIME(与Clojure配合得非常好——请参见swank Clojure)、swank Clojure(SLIME的服务器对应物的Clojure实现)、Clojure模式、Paredit,当然还有Clojure jar,作为一个开始,也许还有一些额外的功能,其中Leiningen可能是最引人注目的一旦设置完毕,您将在Emacs中拥有您在问题中提到的所有工作流/编辑功能。
基本设置:
下面是一些很棒的教程,它们描述了如何设置所有这些;网络上还有更多内容,但其他一些内容已经过时,而这两个内容目前似乎还可以:
use
或require
在REPL中使用其命名空间。接下来,进行实验
最后说明:
准备好在所有点击之前调整一段时间。这涉及到很多工具,它们之间的交互基本上是相当顺畅的,但还没有达到可以安全地假设您最初不需要进行一些调整的程度
最后,这里有一些我保存在.emacs
中的代码,在其他地方找不到(尽管它是基于Phil Hagelberg的一个很酷的函数)。我可以选择使用lein-swank
(Leiningen更酷的功能之一)启动我的swank实例,也可以使用下面的clojure项目
功能从Emacs中启动整个过程。我已经尽了最大努力使后者产生一个与lein swank
提供的环境非常匹配的环境。哦,如果你只是想在Emacs中使用REPL进行一个快速而肮脏的实验,那么通过正确的设置,你应该能够直接使用M-x slime
(setq clojure-project-extra-classpaths
'(
; "deps/"
"src/"
"classes/"
"test/"
))
(setq clojure-project-jar-classpaths
'(
; "deps/"
"lib/"
))
(defun find-clojure-project-jars (path)
(apply #'append
(mapcar (lambda (d)
(loop for jar in (remove-if (lambda (f) (member f '("." "..")))
(directory-files d t))
collect jar into jars
finally return jars))
(remove-if-not #'file-exists-p
clojure-project-jar-classpaths))))
(defun find-clojure-jar (jars)
(let ((candidates
(remove-if-not
(lambda (jar)
(string-match-p "clojure\\([0-9.-]+\\(SNAPSHOT|MASTER\\)?\\)?\\.jar$" jar))
jars)))
(if candidates
(car candidates)
(expand-file-name "~/.clojure/clojure.jar"))))
(defun find-clojure-contrib-jar (jars)
(let ((candidates
(remove-if-not
(lambda (jar)
(string-match-p "clojure-contrib\\([0-9.-]+\\(SNAPSHOT|MASTER\\)?\\)?\\.jar$" jar))
jars)))
(if candidates
(car candidates)
(expand-file-name "~/.clojure/clojure-contrib.jar"))))
;;; original due to Phil Hagelberg
;;; (see `Best practices for Slime with Clojure' thread on Clojure Google Group)
(defun clojure-project (path)
"Sets up classpaths for a clojure project and starts a new SLIME session.
Kills existing SLIME session, if any."
(interactive (list (ido-read-directory-name
"Project root:"
(locate-dominating-file default-directory "pom.xml"))))
(when (get-buffer "*inferior-lisp*")
(kill-buffer "*inferior-lisp*"))
(cd path)
;; I'm not sure if I want to mkdir; doing that would be a problem
;; if I wanted to open e.g. clojure or clojure-contrib as a project
;; (both lack "deps/")
; (mapcar (lambda (d) (mkdir d t)) '("deps" "src" "classes" "test"))
(let* ((jars (find-clojure-project-jars path))
(clojure-jar (find-clojure-jar jars))
(clojure-contrib-jar (find-clojure-contrib-jar jars)))
(setq swank-clojure-binary nil
;; swank-clojure-jar-path (expand-file-name "~/.clojure/clojure.jar")
swank-clojure-jar-path clojure-jar
swank-clojure-extra-classpaths
(cons clojure-contrib-jar
(append (mapcar (lambda (d) (expand-file-name d path))
clojure-project-extra-classpaths)
(find-clojure-project-jars path)))
swank-clojure-extra-vm-args
(list (format "-Dclojure.compile.path=%s"
(expand-file-name "classes/" path)))
slime-lisp-implementations
(cons `(clojure ,(swank-clojure-cmd) :init swank-clojure-init)
(remove-if #'(lambda (x) (eq (car x) 'clojure))
slime-lisp-implementations))))
(slime))
on也可能有用。还有一个很好的教程:
- (第一部分)
- (第二部分)