Во время изучения нового языка программирования вопрос об IDE стоит не на последнем месте. Я предпочитаю, когда рабочее окружение строится вокруг привычного инструментария, доставил плагин - получаешь необходимый функционал. Обычно это работает. Но только не с clojure. dev.clojure.org предлагает множество вариантов, но действительно рабочими являются немногие. До недавнего времени использовал Counterclockwise, но как показала практика, решение не самое удобное и стабильное. Плагин для IntelliJ IDEA на удивление еще хуже. И того получается, что список вроде бы большой, но выбрать особо не из чего(что было бы более ли менее привычным). В итоге я решил попробовать emacs в связке с clojure-mode. Должен признаться, что в некоторой степени на меня повлиял просмотр вот этого видео:
В статье я хочу рассказать о необходимых настройках, которые следует выполнить для того чтобы использовать emacs как Clojure-IDE. Все описанные шаги былы проделаны на Debian Wheezy в связке с emacs-snapshot.
Начальная конфигураця
Emacs из коробки не так хорошо, как мог бы быть, поэтому нам придется его немного допилить. В далекие времена, каждый уважающий себя девелопер почитал за честь создать свою уникальную конфигурацию(что-то вроде хобби, когда нечем заняться на досуге). Сейчас ситуация изменилась в лучшую сторону. Существует проект emacs-starter-kit(статья на хабре) - конфигурация, которую не стыдно взять за начальную.
В добавок ко всему, starter-kit
поддерживается и развивается. Все что нам нужно - это сделать клон:
# perform this command from home directory
git clone https://github.com/technomancy/emacs-starter-kit.git .emacs.d
После добавить ~/home/.emacs.d/init.el
, который у меня выглядит так:
(require 'package) (add-to-list 'package-archives '("marmalade" . "http://marmalade-repo.org/packages/") t) (package-initialize) (setq inhibit-startup-message t) ;; dont show splash (global-linum-mode t) (column-number-mode 1) (global-hl-line-mode 1) (setq scroll-step 1) ;; line-by-line scrolling (setq make-backup-files nil) ;; prevent backup files (setq-default fill-column 120) (fset 'yes-or-no-p 'y-or-n-p) ;; use 'y' and 'n' instead 'yes' and 'no' (show-paren-mode 1) (electric-pair-mode 1) (if window-system (set-frame-size (selected-frame) 140 40)) (if window-system (tool-bar-mode -1)) ;; M-x tool-bar-mode (if window-system (scroll-bar-mode -1)) (if window-system (menu-bar-mode -1)) ;; M-x menu-bar-mode ;;(set-default-font "Inconsolata-11") ;;(set-default-font "Consolas-10") ;; ;; C-x C-g binding for go to line number ;; (global-set-key [?\C-x ?\C-g] 'goto-line) (require 'auto-complete) (global-auto-complete-mode t) (setq ac-auto-start nil) (setq ac-auto-start 3) ;; when entring 3 characters (define-key ac-complete-mode-map "\t" 'ac-complete) (define-key ac-complete-mode-map "\r" nil)
Установка пакетов
В самом начале следует обновить содержимое репозитария. Для этого в запущенном редакторе выполяем команду:
M-x package-refresh-contents [RET]
Инсталляции пакета - это последовательность двух команд:
M-x package-install [RET] package-name [RET]
Для работы с clojure нам понадобятся: starter-kit
,
starter-kit-lisp
,
starter-kit-bindings
,
starter-kit-eshell
,
clojure-mode
,
clojure-test-mode
,
nrepl
.
Проверим рабочее окружение... Запускаем REPL:
M-x nrepl-jack-in
И пробуем выполнить произвольную операцию:
Clojure Test Mode
Я предпочитаю ТDD и, как мне кажется, все современные IDE должны предоставлять средства для данного стиля разработки. Помимо прочего clojure-mode
содержит clojure-test-mode.el
- модуль умеющий запускать тесты и представлять результаты.
Для запуска тестов текущего буфера используется сочетание клавиш C-c C-,
, для очистки результатов- C-c k
. Ошибки и непройденные тесты будут помечены маркерами:
Переключение между тестом и реализацией, осуществляется сочетанием клавиш C-c C-t
. В корне проекта должна находиться директория src/
, содержащая исходный код и директория test/
- юнит тесты. Пространство имен тестов должно быть таким же как и у исоходников с добавлением суффикса -test
. Например, пространство имен my.project.frob
имеет следующую организацию файлов src/my/project/frob.clj
и тестов my.project.frob-test
и test/my/project/frob_test.clj
.
nrepl
nrepl - это клиент для Clojure networked REPL server, пришел на смену проекту SLIME + swank-clojure. Как упоминалось ранее, для запуска REPL служит команда M-x nrepl-jack-in
(во время работы может быть запущено несколько сессий). Для закрытия текущей и для закрытия всех сессий - M-x nrepl-close
, M-x nrepl-quit
соответственно.
Команды редактируемого буфера(полный список можно посмотреть на оф. странице):
C-x C-e
- показать результат в эхо-буфереC-c C-r
- отобразить результат выделенной области в эхо буфереC-c C-b
- прервать выполнение командыC-c M-n
- переключить пространство имен текущего буфераC-c M-o
- очистить REPL, оставить лишь приглашениеC-c C-k
- загрузить буферC-c C-l
- загрузить файлC-c C-d
- показать документацию по текущему символуC-c C-s
- показать сорцыC-c C-j
- показать Javadoc(в броузере)M-.
- перейти к декларации/определению символаM-,
- вернуться на прежнее место(смь. предыдущий пункт)M-TAB
- автодополнение/автозавершение символа
C-RET
- дополнить все скобки выражение и вычислить результатC-j
- перейти на новую строкуC-c M-o
- очистить REPL, оставить лишь приглашениеC-c C-o
- очистить результат предыдущего вычисленияC-c C-b/C-c C-с
- прервать выполнение командыC-up/C-down
- переход по истории командC-c C-d
- показать документацию по текущему символу
Плюшки
Для работы с clojure-mode
(и не только) рекомендуется использовать Paredit. Данный пакет в разы облегчает редактирование кода. Установить можно из репозитария. Для перманентной активации необходимо добавить следующую строчку в файл конфигурации:
;; (require 'paredit) if you didn't install it via package.el (add-hook 'clojure-mode-hook 'paredit-mode)
Краткий справочник по Paredit можно найти здесь.
Линки
- IDE и редакторы на dev.clojure.org/
- Emacs starter-kit
- Статья на хабре про emacs-starter-kit
- Оригинальный пост - настройка Emacs для работы с clojure
- Clojure-mode на github-e
- nREPL на github-е
- Справочник по Paraedit
No comments:
Post a Comment