[Редагувати від автора, який не є автором: це з 2010 року, і процес значно спростився з травня 2011 року. До цієї відповіді я додаю публікацію зі своїми примітками про налаштування станом на лютий 2012 року.]
Вам потрібно буде скласти кілька частин: Emacs, SLIME (що чудово працює з Clojure - див. звичайно, банку Clojure для початку, то, можливо, деякі додаткові послуги, серед яких Лейнінген, мабуть, був би найбільш помітним. Після того, як ви все це налаштуєте, ви матимете - всередині Emacs - усі функції робочого процесу / редагування, про які ви згадали у питанні.
Базова настройка:
Далі подано чудові підручники, які описують, як це все налаштувати; в Інтернеті є ще щось, але деякі інші є досить застарілими, тоді як ці два поки що здаються нормальними:
в якій знайдені прийоми торгівлі щодо публікації авторства клоджуре у блозі Філа Гегельберга; Філ підтримує режим Swank-Clojure та Clojure, а також пакет під назвою Emacs Starter Kit, котрий будь-який новачок у світі Emacs буде радимо поглянути. Ці інструкції, здається, були оновлені останніми змінами в інфраструктурі; у разі сумнівів шукайте додаткову інформацію в групі Clojure у Google.
Налаштування допису Clojure, Incanter, Emacs, Slime, Swank та Paredit у блозі проекту Incanter. Incanter - це захоплюючий пакет, що надає R-подібний DSL для статистичних обчислень, вбудованих безпосередньо в Clojure. Ця публікація буде корисною, навіть якщо ви не плануєте використовувати - або навіть встановлювати - Incanter.
Запустіть все в роботу:
Після того, як ви налаштуєте всі ці речі, ви можете спробувати почати їх використовувати відразу, але я настійно рекомендую вам зробити наступне:
Погляньте на посібник SLIME - він включений у джерела і насправді дуже читається. Крім того, немає абсолютно жодної причини, чому ви повинні прочитати цілий 50-сторінковий посібник з монстрів; просто озирніться навколо, щоб побачити, які функції доступні.
Примітка: функція autodoc SLIME, як знайдено в останніх вихідних джерелах, несумісна із swank-clojure - ця проблема не з’явиться, якщо ви будете слідувати рекомендаціям Філа Хагельберга використовувати версію ELPA (пояснення див. У його згаданому повідомленні в блозі) або просто залишити autodoc вимкненим (що є типовим станом речей). Останній варіант має деяку додаткову привабливість у тому, що ви все ще можете використовувати останню програму SLIME із Common Lisp, якщо ви використовуєте її також.
Погляньте на документи для отримання кредиту. Є два шляхи вирішення цього питання: (1) подивіться на джерело - у верхній частині файлу є величезна кількість коментарів, які містять всю інформацію, яка вам, ймовірно, знадобиться; (2) введіть C-h mв Emacs, коли активний режим кредитування - з’явиться буфер з інформацією про поточний основний режим, а потім інформація про всі активні другорядні режими (один із них).
Оновлення: Я щойно знайшов цей класний набір приміток до Paredit від Філа Хагельберга ... Це посилання на текстовий файл, пам’ятаю, я десь бачив гарний набір слайдів із цією інформацією, але, здається, зараз не можу його знайти . У будь-якому випадку, це приємний підсумок того, як це працює. Безумовно, погляньте на це, я не можу жити без Paredit зараз, і я вважаю, що цей файл повинен зробити його дуже простим. :-)
Насправді ця C-h mкомбінація розповість вам про всі прив'язки клавіш, активні в SLIME REPL, у режимі clojure (вам потрібно пам'ятати C-c C-kпро надсилання поточного буфера для компіляції), а також у будь-якому буфері Emacs.
Що стосується завантаження коду з файлу, а потім експериментувати з ним у REPL: використовуйте вищезазначену C-c C-kкомбінацію для компіляції поточного буфера, use
або require
його простору імен у REPL. Далі експериментуйте далеко.
Заключні примітки:
Будьте готові трохи налаштувати речі, перш ніж це все клацне. Залучено багато інструментів, і їх взаємодія в основному досить плавна, але не до такої міри, коли було б безпечно припустити, що спочатку вам не доведеться вносити деякі коригування.
Нарешті, ось трохи коду, який я зберігаю, в .emacs
якому ви не знайдете ніде (хоча він заснований на крутій функції Філа Хагельберга). Я почергово починаю мої екземпляри swank з lein swank
(одна з прохолодних функцій Leiningen) і використовую clojure-project
функцію, як показано нижче, щоб запустити все це з Emacs. Я зробив все можливе, щоб останні створили середовище, що повністю відповідає тому, що надає lein swank
. О, і якщо вам просто потрібен REPL в Emacs для швидкого та брудного експерименту, то з правильним налаштуванням ви зможете користуватися M-x slimeбезпосередньо.
(setq clojure-project-extra-classpaths
'(
"src/"
"classes/"
"test/"
))
(setq clojure-project-jar-classpaths
'(
"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"))))
(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)
(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 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))