Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure的Emacs/Swank/Paredit温和教程_Emacs_Clojure - Fatal编程技术网

Clojure的Emacs/Swank/Paredit温和教程

Clojure的Emacs/Swank/Paredit温和教程,emacs,clojure,Emacs,Clojure,我将转到Emacs处理/Lisp。 我需要在Emacs上设置哪些信息才能执行以下操作 自动匹配/生成相应的结束括号 自动缩进Lisp/Clojure样式,而不是C++/Java样式 语法突出显示 援引 能够将文件中的一部分代码加载到REPL中并对其求值 在Emacs上设置之后,如果我还可以获得获取这些内容的命令列表,那就太好了。该工具包获得了关于Clojure入门的好评: 只回答问题中的时髦部分: Leiningen是使用正确的类路径设置swank并将其连接到Emacs的一种非常简单的方法 这里

我将转到Emacs处理/Lisp。 我需要在Emacs上设置哪些信息才能执行以下操作

  • 自动匹配/生成相应的结束括号
  • 自动缩进Lisp/Clojure样式,而不是C++/Java样式
  • 语法突出显示
  • 援引
  • 能够将文件中的一部分代码加载到REPL中并对其求值
  • 在Emacs上设置之后,如果我还可以获得获取这些内容的命令列表,那就太好了。

    该工具包获得了关于Clojure入门的好评:

    只回答问题中的时髦部分:

    Leiningen是使用正确的类路径设置swank并将其连接到Emacs的一种非常简单的方法

    这里有一个很棒的视频: 下面是一个project.clj文件的示例

    (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中拥有您在问题中提到的所有工作流/编辑功能。

    基本设置: 下面是一些很棒的教程,它们描述了如何设置所有这些;网络上还有更多内容,但其他一些内容已经过时,而这两个内容目前似乎还可以:

  • 在Phil Hagelberg的博客上发布;Phil维护swank clojure和clojure模式,以及一个名为Emacs初学者工具包的软件包,这是Emacs世界的任何新手都应该好好看看的。这些说明似乎是随着基础设施的最新变化而更新的;如有疑问,请查看Clojure的谷歌集团的更多信息

  • 在白炽灯项目的博客上发布。白炽灯是一个迷人的软件包,提供了一个类似R的DSL,用于嵌入Clojure中的统计计算。即使你不打算使用——甚至不打算安装——白炽灯,这篇文章也会很有用

  • 把一切都付诸实施: 一旦您设置了所有这些东西,您可以尝试立即开始使用它,但我强烈建议您执行以下操作:

  • 看一看SLIME的手册——它包含在源代码中,实际上非常可读。而且,你完全没有理由去阅读整个50页的怪物手册;只需四处看看,看看有哪些功能可用

    注意:在最新的上游来源中发现的SLIME的autodoc功能与swank clojure不兼容——如果您按照Phil Hagelberg的建议使用ELPA版本(请参阅他前面的博文以获取解释),或者干脆不使用autodoc(这是默认状态),则不会出现此问题. 后一个选项有一些额外的吸引力,因为您仍然可以使用最新的SLIME和commonlisp,以防您也使用它

  • 请看一下paredit的文档。有两种方法可以做到这一点:(1)查看源代码——文件顶部有大量的注释,其中包含您可能需要的所有信息;(2) 当paredit模式处于活动状态时,在Emacs中键入C-h m——将弹出一个缓冲区,其中包含当前主模式的信息,后跟所有活动次模式的信息(paredit是其中之一)

    更新:我刚在Phil Hagelberg的Paredit上找到。。。这是一个文本文件的链接,我记得在某处看到了一组很好的幻灯片,上面有这些信息,但现在似乎找不到。无论如何,这是一个很好的总结,它是如何工作的。一定要看一看,我现在离不开Paredit,我相信,这个文件应该可以让开始使用它变得非常容易。:-)

  • 事实上,C-HM组合将告诉您SLIME REPL中所有活动的键绑定,在clojure模式下(您需要记住C-C-k以发送当前缓冲区进行编译),实际上在任何Emacs缓冲区中

  • 至于从文件中加载代码,然后在REPL中进行实验:使用前面提到的C-C-k组合编译当前缓冲区,然后
    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也可能有用。

    还有一个很好的教程:

    • (第一部分)
    • (第二部分)
    在30到45分钟内,你可以从零开始设置一切

    本教程没有假定之前对Emacs有任何了解(Clojure也有——在之前的文章中,有一篇很好的Clojure介绍)。

    (Clojure I