среда, 9 февраля 2011 г.

Настройка Emacs для Clojure

В этой статье я вкратце расскажу, как превратить Emacs в полноценную IDE для программирования на clojure.

1. Основное, что нужно сделать, – это настроить связку Emacs и Clojure через swank. Лучше всего про это написано здесь: https://github.com/technomancy/swank-clojure#readme.

После выполнения всего, что указано по ссылке, у вас будут установлены:
    *  утилита управления проектами Leiningen
    *  пакетный менеджер ELPA
    *  библиотека swank-clojure.

Чтобы поднять swank-сервер, в файле проекта project.clj нужно добавить зависимость :dev-dependencies [[swank-clojure "1.2.1"]], а затем выполнить команду lein swank. В Emacs нужно загрузить файл исходников clojure, затем выполнить команду M-x slime-connect. Во время соединения со swank-сервером Emacs скажет, что версии slime-repl и swank отличаются – ничего страшного, просто продолжайте. После того, как соединитесь со swank-сервером, станет доступной самая классная команда: C-x e. Нужно стать после последней скобочки выражения в исходном файле, выполнить C-x e, и результат выполнения отобразиться в repl.

2. Номера строк в Emacs включаются плагином linum+ (http://www.emacswiki.org/emacs/linum+.el). Установка плагина проста: скачайте его в .emacs.d, затем в файл .emacs добавьте строку (require 'linum+), а после перезагрузки для включения режим linum выполните команду M-x linum-mode. Для автоматической загрузки этого режима в .emacs должны быть строки:

(require 'linum+)
(setq linum-format "%d ")
(global-linum-mode 1)

3. Для того, чтобы длинные строки не отображались в виде нескольких строк, а просто «скрывались за горизонтом», нужно добавить в .emacs:

(global-set-key (kbd "C-c l") 'toggle-truncate-lines)

Теперь по нажатию C-C l сможете переключаться между двумя этими режимами.

4. Множество всяких вкусностей добавляет Emacs Starter Kit (https://github.com/technomancy/emacs-starter-kit). Предпочитаю ставить его через ELPA, хотя можно и так, как описано по ссылке. Там же описаны основные функции, которые добавляет этот пакет. Вот кое-что, из того, что он делает:

    * Отключает буфер с приветствием и панель меню;
    * Добавляет массу горячих клавиш, в том числе S-up, S-down, S-left, S-right для переключения между окнами Emacs.
    * И самое главное, из-за чего только и стоит устанавливать Emacs Starter Kit: он заменяет lambda на греческую λ в исходниках на лиспе, а fn – на ƒ в исходниках на clojure. Выглядит очень аутентично.

Подробнее Emacs Starter Kit разобран, например, здесь: http://habrahabr.ru/blogs/emacs/94256/.

5. IDO (Interactive Do). Судя по описанию (http://www.emacswiki.org/emacs/InteractivelyDoThings), этот пакет уже является частью Emacs, так что достаточно прописать его в .emacs таким образом:

(require 'ido)
(ido-mode t)
(setq ido-enable-flex-matching t)

Он помогает открывать файлы по команде C-x C-f. Среди прочего, он умеет еще fuzzy search по файлам проекта. В .emacs прописываем

(defun ido-find-file-in-tag-files ()
(interactive)
(save-excursion
(let ((enable-recursive-minibuffers t))
(visit-tags-table-buffer))
(find-file
(expand-file-name
(ido-completing-read
"Project file: " (tags-table-files) nil t)))))

(global-set-key [C-f9] 'ido-find-file-in-tag-files)

Теперь по нажатию С-f9 Emacs предложит загрузить файл тегов, сгенеренный программой ctags-exuberant, и предложит открыть файл. Пользователю нужно ввести хотя бы несколько первых букв, и IDO предложит соответствующие варианты. Главная фишка здесь в том, что файлы будут искаться среди всех, перечисленных в файле тегов, не зависимо от директории, в которой они хранятся. Т. е. это что-то очень похожее на C-t из textmate или С-S-r из eclipse.

Вот как можно сгенерить файл тегов для всех исходников на clojure в текущей директории и поддиректориях:

find . -name "*.clj" -exec ctags-exuberant -a -e {} \;

Для того, чтобы ctags узнавал исходники на clojure, в $HOME/.ctags нужно добавить строку

--langmap=Lisp:+.clj

6. Speedbar (http://cedet.sourceforge.net/speedbar.shtml). Является частью CEDET, так что он уже он уже установлен в Emacs версии 23.2 и выше. Подробнее про него написано здесь: http://www.emacswiki.org/emacs/SpeedBar. Этот пакет умеет показывать дерево файлов. Правда, показывает его в отдельном фрейме, что очень неудобно. Для того, чтобы список файлов показывался в том же самом фрейме, нужно установить SrSpeedbar (http://www.emacswiki.org/emacs/SrSpeedbar).


Загрузка обоих модулей в .emacs выглядит так:

(require 'speedbar)
(require 'sr-speedbar)

Выполните M-x speedbar-customize для настройки обоих модулей. Обязательно нужно зайти в раздел директорий и включить показ незнакомых файлов. У меня эти установки выглядят так:

(speedbar-show-unknown-files t)
(speedbar-use-images nil)
(sr-speedbar-right-side nil)

Открытие-закрытие дерева каталогов я повесил на C-f11 и C-f12:

(global-set-key [C-f11] 'sr-speedbar-open)
(global-set-key [C-f12] 'sr-speedbar-close)

7.YASnippet (http://code.google.com/p/yasnippet/). Подробности здесь: http://www.emacswiki.org/emacs/Yasnippet. Этот плагин позволяет определять сниппеты по примеру texmate и eclipse.

Предлагаю оставить в комментах ваши плагины, которые вы используете для разработки в Emacs на Clojure.



5 комментариев:

  1. чтобы slime не ругался на версии надо добавить в настройку вот такой код: (setq slime-protocol-version 'ignore)

    и лучше использовать swank-cloure 1.3.0-SNAPSHOT - там много добавлений и исправлений

    ОтветитьУдалить
  2. О, супер! А то, честно говоря, уже достало это сообщение о несоответствии версий!

    ОтветитьУдалить
  3. Я еще подключаю через ELPA highlight-parentheses для rainbow parentheses, иногда бывает полезно. Подробности по установке/настройке тут - http://stackoverflow.com/questions/2413047/how-do-i-get-rainbow-parentheses-in-emacs

    ОтветитьУдалить
  4. Запуск lein swank из emacs, нашел здесь:
    https://github.com/purcell/emacs.d/blob/master/init-clojure.el
    Функция lein-swank.

    ОтветитьУдалить