Нежный учебник для Emacs / Swank/Paredit for Clojure



Я переезжаю в Emacs, чтобы работать над Clojure / Lisp.
Какова вся информация, которую мне нужно настроить на Emacs, чтобы сделать следующее?




  1. автоматическое согласование / генерация соответствующих закрывающих скобок

  2. autoindent Lisp / Clojure style, а не C++/Java style

  3. синтаксис

  4. вызов REPL

  5. чтобы иметь возможность загрузить часть кода из файла в REPL и оценить оно.


было бы здорово, если бы я мог также получить список команд, чтобы получить эти вещи после настройки вещей на Emacs.

582   4  

4 ответов:

[Edit from non-author: это с 2010 года, и процесс был значительно упрощен с мая 2011 года. Я добавлю сообщение к этому ответу с моими установочными заметками по состоянию на февраль 2012 года.]

вам нужно будет собрать несколько частей: Emacs, SLIME (который отлично работает с Clojure-см. swank-clojure), swank-clojure (реализация Clojure серверного аналога SLIME), clojure-mode, Paredit и, конечно же, Clojure jar для начала, а затем, возможно, некоторые дополнительные функции среди который Лейнинген, возможно, был бы самым заметным. как только вы все это настроите, у вас будет-в Emacs-все функции рабочего процесса / редактирования, которые вы упоминаете в вопросе.

основные параметры:

ниже приведены отличные учебники, которые описывают, как настроить все это; есть больше в интернете, но некоторые из других довольно устарели, в то время как эти два, кажется, в порядке на данный момент:

  1. , в котором находятся хитрости профессии, касающиеся авторства clojure сообщение в блоге Фила Хагельберга; Фил поддерживает swank-clojure и clojure-mode, а также пакет под названием Emacs Starter Kit, который является чем-то, что любой новичок в мире Emacs будет хорошо посоветовал бы взглянуть. Эти инструкции, похоже, были обновлены с учетом последних изменений в инфраструктуре; в случае сомнений, ищите дополнительную информацию о Google Clojure группа.

  2. настройка Clojure, Incanter, Emacs, Slime, Swank и Paredit сообщение в блоге проекта Incanter. Incanter-это увлекательный пакет, предоставляющий R-подобный DSL для статистических вычислений, встроенных прямо в Clojure. Этот пост будет полезен, даже если вы не планируете использовать-или даже установка -- ведуна.

положить все это на работу:

как только вы настроите все это, вы можете попробовать и начать использовать его сразу же, но я настоятельно рекомендую вам сделать следующее:

  1. взгляните на руководство SLIME - оно включено в источники и на самом деле очень читаемо. Кроме того, нет абсолютно никаких причин, почему вы должны читать все 50-страничное руководство монстра; просто посмотрите вокруг, чтобы увидеть, какие функции доступны.

    Примечание: функция autodoc SLIME, найденная в последних источниках восходящего потока, является несовместимо с swank-clojure -- эта проблема не возникнет, если вы будете следовать рекомендации Фила Хагельберга использовать версию ELPA (см. Его вышеупомянутое сообщение в блоге для объяснения) или просто оставить autodoc off (что является состоянием по умолчанию). Последний вариант имеет некоторую дополнительную привлекательность в том, что вы все еще можете использовать последнюю слизь с Common Lisp, если вы также используете это.

  2. взгляните на документы для paredit. Есть два способа сделать это это: (1) Посмотрите на источник-в верхней части файла есть огромное количество комментариев, которые содержат всю информацию, которая вам может понадобиться; (2) Введите C-h m в Emacs при активном режиме paredit-появится буфер с информацией о текущем основном режиме, за которым следует информация обо всех активных второстепенных режимах (paredit является одним из них).

    обновление: Я только что нашел этот классный набор нот на Paredit Фил Hagelberg... Это ссылка на текстовый файл, я помню, что видел хороший набор слайдов с этой информацией где-то, но не могу найти его сейчас. В любом случае, это хорошее резюме того, как это работает. Определенно взгляните на него, я не могу жить без Паредита сейчас, и этот файл должен очень легко начать его использовать, я считаю. : -)

  3. в самом деле C-h m комбинация расскажет вам обо всех привязках клавиш, активных в Slime REPL, в режиме clojure (вы захотите помните C-c C-k для отправки текущего буфера для компиляции) и вообще в любом буфере Emacs.

что касается загрузки кода из файла, а затем экспериментировать с ним в REPL: используйте вышеупомянутый C-c C-k комбинации для компиляции текущего буфера, затем use или require его пространство имен в REPL. Далее, эксперимент прочь.

конечные ноты:

будьте готовы, чтобы настроить вещи на некоторое время прежде чем все это щелкнет. Существует много инструментов, и их взаимодействие в основном довольно гладко, но не до такой степени, когда было бы безопасно предположить, что вам не придется сначала вносить некоторые корректировки.

наконец, вот немного кода, который я держу в .emacs который вы не найдете в другом месте (хотя он основан на классной функции Фила Хагельберга). Я чередую запуск своих шикарных экземпляров с lein swank (одна из более холодных характеристик Leiningen) и использование clojure-project функция, как показано ниже, чтобы начать все это изнутри Emacs. Я сделал все возможное, чтобы последние создавали среду, близкую к той, которую предоставляет lein swank. О, и если вы просто хотите REPL в Emacs для быстрого и грязного эксперимента, то при правильной настройке вы должны иметь возможность использовать M-x слизь напрямую.

(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))

есть еще один отличный учебник:

через 30-45 минут можно все настроить с нуля.

учебник не предполагает никакого предварительного knowladge Emacs (и Clojure тоже - в более ранних сообщениях есть хорошее введение в Clojure).

The Стартер Emacs комплект получил отличные отзывы для начала работы с Clojure:

чтобы ответить только на шикарную часть вашего вопроса:

Leiningen-это очень простой способ настроить swank с правильным classpath и подключить его к Emacs.

отличное видео здесь:http://vimeo.com/channels/fulldisclojure#8934942 Вот пример проекта.файл 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

Clojure с Emacs on Документация Clojure может быть очень полезным.

Comments

    Ничего не найдено.