gpt4 book ai didi

emacs - Emacs/Swank/Paredit for Clojure 的温和教程

转载 作者:行者123 更新时间:2023-12-03 05:04:33 30 4
gpt4 key购买 nike

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

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

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

    最佳答案

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

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

    基本设置:

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

  • in which are found tricks of the trade concerning clojure authorship 发表在 Phil Hagelberg 的博客上; Phil 维护着 swank-clojure 和 clojure-mode,以及一个名为 Emacs Starter Kit 的包,Emacs 世界的任何新手都应该看看它。这些说明似乎是随着基础设施的最新变化而更新的;如有疑问,请查找有关 Clojure 的 Google 群组的其他信息。
  • Setting up Clojure, Incanter, Emacs, Slime, Swank, and Paredit 在 Incanter 项目的博客上发帖。 Incanter 是一个迷人的包,它为嵌入到 Clojure 中的统计计算提供了类似 R 的 DSL。即使您不打算使用——甚至安装——Incanter,这篇文章也会很有用。

  • 全部投入使用:

    一旦您设置了所有这些东西,您就可以尝试立即开始使用它,但我强烈建议您执行以下操作:
  • 看看 SLIME 的手册——它包含在源代码中,实际上非常易读。此外,您完全没有理由阅读整本 50 页的怪物手册;只需环顾四周,看看有哪些功能可用。

    注意: 在最新的上游源中发现的 SLIME 的 autodoc 功能与 swank-clojure 不兼容——如果您按照 Phil Hagelberg 的建议使用 ELPA 版本,则不会出现此问题(请参阅他前面提到的博客文章解释)或简单地关闭自动文档(这是事物的默认状态)。后一个选项有一些额外的吸引力,因为您仍然可以将最新的 SLIME 与 Common Lisp 一起使用,以防万一您也使用它。
  • 查看 paredit 的文档。有两种方法可以解决这个问题:(1) 查看源文件——文件顶部有大量注释,其中包含您可能需要的所有信息; (2) 当 paredit-mode 处于事件状态时,在 Emacs 中键入 C-h m - 将弹出一个缓冲区,其中包含有关当前主要模式的信息,然后是有关所有事件次要模式的信息(paredit 是其中之一)。

    更新: 我刚刚在 Phil Hagelberg 的 Paredit 上找到了 this cool set of notes……这是一个文本文件的链接,我记得在某处看到了一组包含此信息的幻灯片,但现在似乎找不到了。无论如何,这是对它如何工作的一个很好的总结。绝对看看它,我现在不能没有 Paredit,我相信这个文件应该可以很容易地开始使用它。 :-)
  • 事实上,C-h m 组合会告诉你所有在 SLIME REPL、clojure 模式(你需要记住 C-c C-k 用于发送当前缓冲区以进行编译)以及任何 Emacs 缓冲区中事件的键绑定(bind)。

  • 至于从文件加载代码,然后在 REPL 上进行试验:使用前面提到的 C-c C-k 组合来编译当前缓冲区,然后在 REPL 上将其命名空间设为 userequire。接下来,进行实验。

    最后说明:

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

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

    关于emacs - Emacs/Swank/Paredit for Clojure 的温和教程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2285437/

    30 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com