ChatGPT解决这个技术问题 Extra ChatGPT

Clojure 的 Emacs/Swank/Paredit 教程

我正在迁移到 Emacs 以研究 Clojure/Lisp。我需要在 Emacs 上设置哪些信息才能执行以下操作?

自动匹配/生成相应的右括号 autoindent Lisp/Clojure 风格,而不是 C++/Java 风格 语法高亮 调用 REPL 能够将部分代码从文件加载到 REPL 中并对其进行评估。

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


D
Dustin Getz

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

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

基本设置:

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

在 Phil Hagelberg 的博客上发现了有关 Clojure 作者身份的交易技巧; Phil 维护 swank-clojure 和 clojure-mode,以及一个名为 Emacs Starter Kit 的包,任何 Emacs 世界的新手都应该看看。这些说明似乎随着基础设施的最新变化而更新;如有疑问,请查找有关 Clojure 的 Google 组的更多信息。在 Incanter 项目的博客上设置 Clojure、Incanter、Emacs、Slime、Swank 和 Paredit。 Incanter 是一个引人入胜的包,它提供了一个类似 R 的 DSL,用于嵌入到 Clojure 中的统计计算。即使你不打算使用——甚至不打算安装——Incanter,这篇文章也会很有用。

把它全部工作:

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

看看 SLIME 的手册——它包含在源代码中,实际上非常易读。此外,您绝对没有理由阅读整本 50 页的怪物手册。看看周围有哪些可用的功能。注意:在最新的上游源代码中发现的 SLIME 的自动文档功能与 swank-clojure 不兼容——如果您遵循 Phil Hagelberg 的建议使用 ELPA 版本,则不会出现此问题(请参阅他前面提到的博客文章以获得解释)或者干脆关闭自动文档(这是事物的默认状态)。后一个选项有一些额外的吸引力,因为你仍然可以将最新的 SLIME 与 Common Lisp 一起使用,以防你也使用它。查看 paredit 的文档。有两种方法可以解决这个问题:(1)查看源代码——文件顶部有大量注释,其中包含您可能需要的所有信息; (2) 在 paredit-mode 处于活动状态时在 Emacs 中键入 Ch m —— 将弹出一个缓冲区,其中包含有关当前主要模式的信息,然后是有关所有活动次要模式的信息(paredit 是其中之一)。更新:我刚刚在 Phil Hagelberg 的 Paredit 上找到了这套很酷的笔记……这是一个文本文件的链接,我记得在某处看到了一组带有此信息的漂亮幻灯片,但现在似乎找不到.无论如何,这是一个很好的总结它是如何工作的。一定要看看它,我现在不能没有 Paredit,我相信这个文件应该可以很容易地开始使用它。 :-) 事实上,Ch m 组合会告诉你所有在 SLIME REPL 中活动的键绑定,在 clojure 模式下(你会想记住 Cc Ck 发送当前缓冲区进行编译),实际上在任何 Emacs 缓冲区中.

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

最后注意事项:

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

最后,这是我保留在 .emacs 中的一些代码,您在其他地方找不到这些代码(尽管它基于 Phil Hagelberg 的一个很酷的函数)。我交替使用 lein swank(Leiningen 的一个更酷的功能之一)启动我的 swank 实例,并使用如下所示的 clojure-project 函数从 Emacs 中启动整个事情。我已尽力使后者产生一个与 lein swank 提供的环境非常匹配的环境。哦,如果您只是想在 Emacs 中使用 REPL 进行快速而肮脏的实验,那么通过正确的设置,您应该能够直接使用 Mx 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 根本不适合。
P
Piotr Kochański

还有一个很棒的教程:

http://www.braveclojure.com/basic-emacs/(第一部分)

http://www.braveclojure.com/using-emacs-with-clojure/(第二部分)

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

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


P
Peter Mortensen

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

a
aholub7x

Clojure Documentation 上的 Clojure with Emacs 也很有用。


M
Micah Elliott

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

它将涵盖您正在寻找的大部分内容。这包括:

交互式 REPL

调试

试运行

代码导航

文档查找

更多

除了 CIDER,还有一些其他必要的和不错的附加组件用于 clojure 开发,我将尝试分别(和主观地)分组:

要点

smartparens – 括号配对、操作、导航(如果您愿意,也可以使用parinfer)

clj-refactor —— 有几个惊人的特性,比如自动添加/编译命名空间(它可能很快会被合并到 CIDER 中)

clojure-mode – 字体锁定、缩进、导航

公司 – 文本完成框架(或选择另一个自动完成器)

彩虹分隔符——根据分隔符的深度突出显示/着色分隔符,例如括号、括号或大括号

flycheck – 动态语法检查扩展

flycheck-clj-kondo – clj-kondo 的集成

细节

clojure-snippets – 更长代码块的选项卡可扩展快捷方式

哑跳转 - 跳转到定义

which-key – 在弹出窗口中显示可用的键绑定

高亮括号 - 高亮周围的括号

crux - Emacs 非常有用的扩展集合

comment-dwim-2 – 替换 Emacs 内置的 comment-dwim

一般要点(适用于任何语言)

magit – Emacs 中的 git 瓷器

projectile – project mgmt 用于查找文件、搜索等

helm - 增量完成和选择缩小框架(或 swiper)

其他资源

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

序幕

航天飞机


关注公众号,不定期副业成功案例分享
关注公众号

不定期副业成功案例分享

领先一步获取最新的外包任务吗?

立即订阅