Нежный учебник для Emacs / Swank/Paredit for Clojure
Я переезжаю в Emacs, чтобы работать над Clojure / Lisp.
Какова вся информация, которую мне нужно настроить на Emacs, чтобы сделать следующее?
- автоматическое согласование / генерация соответствующих закрывающих скобок
- autoindent Lisp / Clojure style, а не C++/Java style
- синтаксис
- вызов REPL
- чтобы иметь возможность загрузить часть кода из файла в REPL и оценить оно.
было бы здорово, если бы я мог также получить список команд, чтобы получить эти вещи после настройки вещей на Emacs.
4 ответов:
[Edit from non-author: это с 2010 года, и процесс был значительно упрощен с мая 2011 года. Я добавлю сообщение к этому ответу с моими установочными заметками по состоянию на февраль 2012 года.]
вам нужно будет собрать несколько частей: Emacs, SLIME (который отлично работает с Clojure-см. swank-clojure), swank-clojure (реализация Clojure серверного аналога SLIME), clojure-mode, Paredit и, конечно же, Clojure jar для начала, а затем, возможно, некоторые дополнительные функции среди который Лейнинген, возможно, был бы самым заметным. как только вы все это настроите, у вас будет-в Emacs-все функции рабочего процесса / редактирования, которые вы упоминаете в вопросе.
основные параметры:
ниже приведены отличные учебники, которые описывают, как настроить все это; есть больше в интернете, но некоторые из других довольно устарели, в то время как эти два, кажется, в порядке на данный момент:
, в котором находятся хитрости профессии, касающиеся авторства clojure сообщение в блоге Фила Хагельберга; Фил поддерживает swank-clojure и clojure-mode, а также пакет под названием Emacs Starter Kit, который является чем-то, что любой новичок в мире Emacs будет хорошо посоветовал бы взглянуть. Эти инструкции, похоже, были обновлены с учетом последних изменений в инфраструктуре; в случае сомнений, ищите дополнительную информацию о Google Clojure группа.
настройка Clojure, Incanter, Emacs, Slime, Swank и Paredit сообщение в блоге проекта Incanter. Incanter-это увлекательный пакет, предоставляющий R-подобный DSL для статистических вычислений, встроенных прямо в Clojure. Этот пост будет полезен, даже если вы не планируете использовать-или даже установка -- ведуна.
положить все это на работу:
как только вы настроите все это, вы можете попробовать и начать использовать его сразу же, но я настоятельно рекомендую вам сделать следующее:
взгляните на руководство SLIME - оно включено в источники и на самом деле очень читаемо. Кроме того, нет абсолютно никаких причин, почему вы должны читать все 50-страничное руководство монстра; просто посмотрите вокруг, чтобы увидеть, какие функции доступны.
Примечание: функция autodoc SLIME, найденная в последних источниках восходящего потока, является несовместимо с swank-clojure -- эта проблема не возникнет, если вы будете следовать рекомендации Фила Хагельберга использовать версию ELPA (см. Его вышеупомянутое сообщение в блоге для объяснения) или просто оставить autodoc off (что является состоянием по умолчанию). Последний вариант имеет некоторую дополнительную привлекательность в том, что вы все еще можете использовать последнюю слизь с Common Lisp, если вы также используете это.
взгляните на документы для paredit. Есть два способа сделать это это: (1) Посмотрите на источник-в верхней части файла есть огромное количество комментариев, которые содержат всю информацию, которая вам может понадобиться; (2) Введите C-h m в Emacs при активном режиме paredit-появится буфер с информацией о текущем основном режиме, за которым следует информация обо всех активных второстепенных режимах (paredit является одним из них).
обновление: Я только что нашел этот классный набор нот на Paredit Фил Hagelberg... Это ссылка на текстовый файл, я помню, что видел хороший набор слайдов с этой информацией где-то, но не могу найти его сейчас. В любом случае, это хорошее резюме того, как это работает. Определенно взгляните на него, я не могу жить без Паредита сейчас, и этот файл должен очень легко начать его использовать, я считаю. : -)
в самом деле 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))
есть еще один отличный учебник:
- http://www.braveclojure.com/basic-emacs/ (1-я часть)
- http://www.braveclojure.com/using-emacs-with-clojure/ (2-я часть)
через 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