8 авг. 2011 г.

Простой и быстрый способ начать использовать SLIME и Emacs для разработки приложений на Clojure

В качестве IDE для Clojure я, в свое время, пытался использовать NetBeans и Eclipse. Но к сожалению (а может и к счастью), отношения у меня не сложились ни с той, ни с другой IDE. NetBeans, по моим меркам, слишком долго запускался. Для не столь уж и редких для меня ситуаций, когда хочется/нужно подправить лишь пару строчек в коде, он не подходил. Конечно, можно было использовать какой-нибудь Notepad++ для подобных целей, но мне хотелось работать в единой среде, а не прыгать между текстовыми редакторами и IDE. Помимо всего прочего, к этому прибавлялся еще и не слишком быстрый интерфейс, что выводило меня из себя. Кроме того в новый NetBeans не устанавливался плагин, обеспечивающий работу с Clojure, из-за несовместимости версий.
У Eclipse были те же проблемы со скоростью работы, к которым еще и прибавлялся интерфейс, не блещущий минималистичностью из коробки.
Из-за вышеперечисленных недостатков я вернулся к Emacs'у - как никак у него была и минималистичность, и не тормозящий интерфейс, и новые нескучные обои и прочие радости жизни.
На настройку редактора под Clojure я затратил увы немалое количество времени, в основном из-за этапа по прикручиванию SLIME к Emacs'у - в мануалах рекомендовалось ставить кучу какого-то софта, в большинстве случаев устаревшего, поскольку авторы руководств предлагали использовать ELPA.
В конце концов, не без помощи @Ryukzak'а, у меня получилось узреть работающий SLIME для Clojure, процесс получения которого я и собираюсь описать - вдруг кому-нибудь понадобится.

Вначале, я опишу процесс установки и настройки нескольких расширений, которые облегчают редактирование исходного кода на Clojure. Если вам нужен лишь только SLIME - переходите к соответствующей части поста.


clojure-mode
Данное расширения для Emacs'а, добавляет автодополнение, подсветку синтаксиса и еще некоторые плюшки для файлов с кодом на Clojure (расширение *.clj).
Данное расширение можно скачать отсюда или забрать отсюда: git://github.com/technomancy/clojure-mode.git .
Все файлы расширения должны быть помещены в каталог ~/.emacs.d/elisp/clojure-mode или аналогичный ему, а в ~/.emacs должны быть добавлены следующие строки:


paredit
Некоторые люди ошибочно считают, что главная проблема Лиспоподобных языков это скобочки, которые приходится расставлять в неимоверном количестве и постоянно заботиться о том, чтобы каждой открывающей скобке соответствовала закрывающая.
На самом деле, просто нужно использовать правильные текстовые редакторы с правильными расширениями, которые позволяют не заботиться о скобочках. Одно из таких расширений - paredit. Оно просто вставляет на каждую открывающую скобку еще одну закрывающую скобку, а если количество открывающих и закрывающих скобок не совпадает - показывает это пользователю, выделяя лишнюю скобку.
Скачать расширение можно здесь, установка и настройка происходят так же, как и у предыдущего расширения. Нужно лишь добавить (paredit-mode 1) в my-clojure-mode-hook сверху и вот этот код в ~/.emacs:

Если нужно просто добавить скобку, без автодобавления закрывающей скобки или перехода на соответствующую закрывающую скобку, то следует использовать комбинацию клавиш C-q скобка. Если нужно удалить ненужную скобку - используйте комбинацию клавиш C-u DEL.

Highlight symbol
Данное расширение подсвечивает совпадающие слова в программном коде. Бывает удобно, чтобы проверить совпадает ли имя функции или переменной с уже написанным и так далее... Выглядит примерно так:

Установка и настройка расширения такие же, как и для уже описанных расширений. Скачать плагин можно тут. Пример настроек для плагина приведен на этом же сайте. Но поскольку я использую данный плагин лишь вместе с clojure, то я совместил его настройки с настройками clojure-mode. Конфиг для clojure-mode вместе с highlight-symbol выглядит так:

Перейдем теперь непосредственно к теме данного поста.

SLIME
Вначале следует установить все необходимое для работы SLIME с Clojure, а именно swank-clojure, который позволяет использовать SLIME для проектов на Clojure. К счастью, компилировать исходные и писать конфигурационные файлы на этом этапе не нужно - достаточно скачать скрипт lein отсюда:
https://github.com/technomancy/leiningen/raw/stable/bin/lein
выполнить его с параметром self-install и добавить путь к скрипту в $PATH. Теперь у нас есть система сборки для проектов на Clojure, которая умеет сама разрешать различные зависимости, в том числе она может загрузить и установить вышеупомянутый swank-clojure. Достаточно лишь оформить проектный файл project.clj так, как описано здесь (внимание! версии зависимостей несколько устарели). Теперь, для каждого нового проекта достаточно выполнить lein deps и swank-clojure будет сам загружен куда-надо.

Установка же самого SLIME проста как-никогда:
  1. Скачиваем последнюю версию SLIME отсюда
  2. Копируем все полученные файлы в ~/.emacs.d/elisp/slime
  3. Добавляем следующие строки в ~/.emacs:
Теперь мы можем использовать SLIME для программ на Clojure, которые используют lein в качестве системы сборки. Всего-то нужно перейти в каталог проекта и запустить swank командой lein swank, а затем подключиться к нему при помощи M-x slime-connect. Все - у нас есть работающий REPL!

Для большего удобства можно использовать плагин elein.el, который по команде M-x elein-swank сам запускает swank, подключает к нему SLIME и открывает REPL в отдельном буфере. Что самое приятное - этот плагин умеет также делать M-x elein-reswank и M-x elein-kill-swank.


Take this REPL, brother, and may it serve you well.