Emacs + Clojure за 60 секунд

10 августа 2010, 02:50
В очередной раз переустановив систему и, конечно же, не сохранив конфиги, столкнулся с необходимостью снова настраивать свой 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)))) scratch Устанавливаем курсор строго за последней скобкой и нажимаем C-j. Эта команда выполнит введённый нами код, а именно скачает и установит менеджер пакетов для Эмакса ELPA. Шаг 4. Устанавливаем нужные пакеты: M-x package-list-packages ;; нажать M-x (Alt+X), затем ввести package-list-packages В нижней части окна откроется список всех доступных пакетов: packagelistpackages Красным отмечены уже установленные. Чтобы отметить пакет для установки, подведите курсор к нужной строке и нажмите i, чтобы установить выделенные пакеты следует нажать x. Нам понадобятся пакеты clojure-mode, slime, slime-repl и swank-clojure. Если при установке Emacs выругается, что файл clojure-mode.el или какой-то другой уже существует, удалите этот файл (все пакеты скачиваются в папку ~/.emacs.d/elpa) и повторите установку со следующего неустановленного пакета - удалённые файлы подтянутся сами. Шаг 5. Устанавливаем Clojure. Для этого просто запускаем slime (M-x slime) - появится сообщение о том, что Clojure не установлен и предложение установить его. Согласитесь и подождите, пока скачаются нужные файлы и запустится REPL: 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: porng Собственно, всё. Не уложились в 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'а приветствуются.
Обсуждение