【问题标题】:A gentle tutorial to Emacs/Swank/Paredit for ClojureClojure 的 Emacs/Swank/Paredit 教程
【发布时间】:2011-01-18 03:08:57
【问题描述】:

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

  1. 自动匹配/生成相应的右括号
  2. 自动缩进 Lisp/Clojure 样式,而不是 C++/Java 样式
  3. 语法高亮
  4. 调用REPL
  5. 能够将部分代码从文件加载到 REPL 并对其进行评估。

如果在 Emacs 上进行设置后,我还可以获得获取这些东西的命令列表,那就太好了。

【问题讨论】:

    标签: emacs clojure


    【解决方案1】:

    Emacs Starter 套件因 Clojure 入门而获得好评:

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

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

    一个很棒的视频在这里:http://vimeo.com/channels/fulldisclojure#8934942 下面是一个 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
    

    【讨论】:

      【解决方案2】:

      [来自非作者的编辑:这是从 2010 年开始的,自 2011 年 5 月以来,该过程已大大简化。我将在 2012 年 2 月的设置说明中添加一个帖子到此答案。]

      您需要将几个部分放在一起:Emacs、SLIME(与 Clojure 完美配合——请参阅 swank-clojure)、swank-clojure(SLIME 的服务器对应的 Clojure 实现)、clojure-mode、Paredit当然,首先是 Clojure jar,然后可能是一些额外的东西,其中 Leiningen 可能是最值得注意的。 完成所有设置后,您将拥有 - 在 Emacs 中 - 您在问题中提到的所有工作流/编辑功能。

      基本设置:

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

      1. in which are found tricks of the trade concerning clojure authorship 在 Phil Hagelberg 的博客上发帖; Phil 维护 swank-clojure 和 clojure-mode,以及一个名为 Emacs Starter Kit 的包,任何 Emacs 世界的新手都应该看看。这些说明似乎已经随着基础设施的最新变化而更新;如有疑问,请查找有关 Clojure 的 Google 小组的更多信息。

      2. Setting up Clojure, Incanter, Emacs, Slime, Swank, and Paredit 在 Incanter 项目的博客上发帖。 Incanter 是一个引人入胜的软件包,它提供了一个类似 R 的 DSL,用于嵌入到 Clojure 中的统计计算。即使您不打算使用——甚至不打算安装——Incanter,这篇文章也会很有用。

      全力以赴:

      设置完所有这些东西后,您可以尝试立即开始使用它,但我强烈建议您执行以下操作:

      1. 看看 SLIME 的手册——它包含在源代码中,实际上非常易读。此外,您绝对没有理由阅读整本 50 页的怪物手册。看看周围有哪些可用的功能。

        注意:最新上游源代码中的 SLIME 的 autodoc 功能与 swank-clojure 不兼容 -- 如果您按照 Phil Hagelberg 的建议使用 ELPA 版本,则不会出现此问题(请参阅他前面提到的博客文章以获取解释)或简单地关闭自动文档(这是事物的默认状态)。后一个选项有一些额外的吸引力,因为您仍然可以将最新的 SLIME 与 Common Lisp 一起使用,以防您也使用它。

      2. 查看 paredit 的文档。有两种方法可以解决这个问题:(1)查看源——文件顶部有大量的 cmets,其中包含您可能需要的所有信息; (2) 在 paredit-mode 处于活动状态时,在 Emacs 中键入 Ch m —— 一个缓冲区将弹出当前主要模式的信息,然后是所有活动的次要模式的信息(paredit 是其中之一) .

        更新:我刚刚在 Phil Hagelberg 的 Paredit 上找到 this cool set of notes...这是一个文本文件的链接,我记得在某处看到了一组包含此信息的漂亮幻灯片,但是现在好像找不到了。无论如何,这是一个很好的总结它是如何工作的。一定要看看它,我现在不能没有 Paredit,我相信这个文件应该可以很容易地开始使用它。 :-)

      3. 1234563 kbd> 用于发送当前缓冲区进行编译),实际上是在任何 Emacs 缓冲区中。

      至于从文件中加载代码,然后在 REPL 中进行试验:使用前面提到的 Cc Ck 组合编译当前缓冲区,然后 userequire 其命名空间位于REPL。接下来,进行实验。

      最后说明:

      准备好在所有点击之前必须调整一段时间。涉及的工具很多,它们的交互大多相当流畅,但还没有到可以安全地假设您最初不必进行一些调整的地步。

      最后,这是我保存在.emacs 中的一些代码,您在其他地方找不到这些代码(尽管它基于 Phil Hagelberg 的一个很酷的函数)。我交替使用lein swank(Leiningen 的一个更酷的功能之一)启动我的 swank 实例,并使用下面找到的clojure-project 函数从 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))
      

      【讨论】:

      • 非常感谢您的精彩文章!
      • 不客气。希望它能让你开始使用 Clojure。快乐黑客! :-)
      • ł:写得非常好。谢谢。
      • 这确实是一个非常好的教程。我刚刚发现最好的选择是 Emacs,即使我不是很喜欢它。 IDEA、Eclipse 和 netbeans 根本不适合。
      【解决方案3】:

      【讨论】:

        【解决方案4】:

        还有一个很好的教程:

        在 30 到 45 分钟内,您可以从头开始设置所有内容。

        本教程不假设任何先前的 Emacs 知识(以及 Clojure 也是 - 在早期的帖子中,有一个很好的 Clojure 介绍)。

        【讨论】:

          【解决方案5】:

          CIDER (Clojure Interactive 开发环境)必须在此处提及。

          它将涵盖您要查找的大部分内容。它包括:

          • 交互式 REPL
          • 调试中
          • 试运行
          • 代码导航
          • 文档查找
          • 更多

          除了苹果酒,还有其他一些必不可少的好东西 clojure 开发的附加组件,我将分别尝试对其进行分组 (主观上):

          要领

          温馨

          通用要点(适用于任何语言)

          • magit – Emacs 中的 git瓷器

          • projectile – 项目管理 用于查找文件、搜索等

          • helm – 增量完成 和选择范围缩小框架(或 swiper)

          其他资源

          如果您正在寻找已经完成大部分/所有这些的设置 为您工作,有几个选择是:

          【讨论】:

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