В очередной раз переустановив систему и, конечно же, не сохранив конфиги, столкнулся с необходимостью снова настраивать свой environment, в частности, запускать Clojure. Clojure - это такой новомодный Лисп для JVM (а также CLR). Излюбленной средой разработки для многих лисперов, в том числе и для меня, является Emacs. К сожалению, до недавнего времени конфигурация Clojure в Emacs была сложной и долгой. В сети вы можете найти десятки, а то и сотни рецептов по приготовлению этого коктейля, но большинство из них устарели или ссылаются на недоступные ресурсы. В этой статье я предложу очень быстрый и простой способ заставить эту пару работать вместе.
Проверка проходила на Ubuntu 10.04 и GNU Emacs 23. В целом должно так же хорошо работать и на других Линуксах (различия в инструкциях коммандной строки, я думаю, будут очевидны). На Windows единственное принципиальное отличие я вижу только в способе установки вспомогательных программ.
Шаг 1. Устанавливаем Emacs:
$ sudo aptitude install emacs
Шаг 2. Кастомизируем его. Если вы никогда раньше не работали с этим редактором, то набор его горячих клавиш почти наверняка приведёт вас в замешательство. Чтобы этого не случилось, полезно сразу же сделать несколько настроек. Emacs при старте ищет конфигурацию в одном из следующих файлов:
1) ~/.emacs.el
2) ~/.emacs.d/init.el
Мы воспользуемся вторым вариантом, т.к. нам ещё понадобится отдельная директория для хранения дополнительных пакетов:
$ cd ~
$ mv .emacs.el .emacs.el.backup # убираем .emacs.el, если есть
$ mkdir .emacs.d # создаём директорию, если отсутствует
# $ emacs .emacs.d/init.el
$ gedit .emacs.d/init.el # чтобы сразу же не столкнуться со сложностями быстрых клавиш Эмакса, можно написать его конфиг в любом другом редакторе
В открывшемся файле вписываем (в мире Emacs буква C означает Ctrl, а буква M - Alt):
(global-set-key "\C-q" 'suspend-emacs) ;; устанавливаем функцию закрытия Эмакса на Ctrl+Q
(cua-mode) ;; CUA-mode, благодаря этой строчке мы сможем использовать привычные Ctrl+C, Ctrl+V, Ctrl+X, Ctrl+Z, а также выделение шифтом
(show-paren-mode) ;; мы всё-таки в Лиспе, подсветка соответствующих скобок не помешает
Шаг 3. Устнавливаем ELPA (Emacs Lisp Package Archive, главный пакетный менджер GNU Emacs):
1) запускаем emacs:
$ emacs
2) переключаемся в пустой буфер (*scratch*), для этого используем комбинацию клавиш C-x b RET (Ctrl+X, затем B и Enter). Копируем или набираем следующее:
(let ((buffer (url-retrieve-synchronously
"http://tromey.com/elpa/package-install.el")))
(save-excursion
(set-buffer buffer)
(goto-char (point-min))
(re-search-forward "^$" nil 'move)
(eval-region (point) (point-max))
(kill-buffer (current-buffer))))
Устанавливаем курсор строго за последней скобкой и нажимаем C-j. Эта команда выполнит введённый нами код, а именно скачает и установит менеджер пакетов для Эмакса ELPA.
Шаг 4. Устанавливаем нужные пакеты:
M-x package-list-packages ;; нажать M-x (Alt+X), затем ввести package-list-packages
В нижней части окна откроется список всех доступных пакетов:
Красным отмечены уже установленные. Чтобы отметить пакет для установки, подведите курсор к нужной строке и нажмите i, чтобы установить выделенные пакеты следует нажать x.
Нам понадобятся пакеты clojure-mode, slime, slime-repl и swank-clojure. Если при установке Emacs выругается, что файл clojure-mode.el или какой-то другой уже существует, удалите этот файл (все пакеты скачиваются в папку ~/.emacs.d/elpa) и повторите установку со следующего неустановленного пакета - удалённые файлы подтянутся сами.
Шаг 5. Устанавливаем Clojure. Для этого просто запускаем slime (M-x slime) - появится сообщение о том, что Clojure не установлен и предложение установить его. Согласитесь и подождите, пока скачаются нужные файлы и запустится REPL:
Шаг 6. Проверяем. В REPL'е введите:
user> (+ 4 5)
Если появился ответ "9", значит REPL работает.
Теперь откроем файл (C-x f foo.clj) и напишем простую функцию:
(defn xxx [] (println "porn"))
Загрузите этот файл (C-c C-l), переключитесь в REPL (C-c C-z) и проверьте работоспособность нашей функции:
user> (xxx)
Если всё верно, то должно быть выведено слово "porn", за которым следует nil:
Собственно, всё. Не уложились в 60 секунд? Тогда ещё раз, но без коментариев:
Шаг 1. $ sudo aptitude install emacs.
Шаг 2. Кастомизируем по желанию.
Шаг 3. $ emacs
[C-x b RET]
Вставляем:
(let ((buffer (url-retrieve-synchronously
"http://tromey.com/elpa/package-install.el")))
(save-excursion
(set-buffer buffer)
(goto-char (point-min))
(re-search-forward "^$" nil 'move)
(eval-region (point) (point-max))
(kill-buffer (current-buffer))))
За последней скобкой жмём C-j
Шаг 4. M-x package-list-packages
Ставим "i" напротив clojure-mode, slime, slime-repl, swank-clojure
Жмём "x"
Шаг 5. M-x slime
y (yes, в ответ на предложение установить Clojure)
Шаг 6. (+ 4 5)
[C-x f foo.clj]
Набираем:
(defn xxx [] (println "porn"))
P.S. Исправления и пояснения для других операционных систем и версий Emacs'а приветствуются.
Релоцировались? Теперь вы можете комментировать без верификации аккаунта.