Mariusz Prowaźnik

o programowaniu w Javie, Scali i Clojure.


Emacs jako IDE dla Clojure

Dla kogoś, kto chce zaznajomić się z programowaniem w Clojure, najprostszym wyborem jest zainstalowanie odpowiedniej wtyczki do IDE, którego używa na co dzień do Javy. W moim przypadku jest to IntelliJ IDEA. Niestety z moją wersją wtyczka La Clojure nie chciała działać. Za to CounterClockwise do Eclipse zadziała jak należy i jej używałem do pisania drobnych programów. Do wyboru jest jeszcze Enclojure dla NetBeansa. Jest to dobre podejście na początek, bo można się skupić na nauce nowego języka, a nie na konfigurowaniu środowiska.

Z drugiej strony, po co uruchamiać dosyć spore IDE, żeby poeksperymentować trochę z Clojure. Są dwa "lżejsze" rozwiązania: Sublime Text i Emacs. SublimeText zdobywa ostatnio sporą popularność, czemu się nie dziwię. Jednak pod Windowsem są problemy z REPL'em., dlatego postanowiłem wypróbować Emacsa.

Emacs ma swoje wady i zalety. Trzeba poświęcić czas na naukę skrótów klawiaturowych, na grzebanie w plikach konfiguracyjnych i instalowanie potrzebnych paczek. Ale jak już się go skonfiguruje, to można wrzucić pliki konfiguracyjne na jakieś repozytorium kodu i potem mamy gotowca.

Jest dużo tutoriali w internecie na temat wykorzystania Emacsa do programowania w Clojure i można się przy nich pogubić, ponieważ często dotyczą starszego zestawu: Slime i Swank, zamiast nowszego nRepl. Często też można znaleźć tutoriale ze StarterKit'ami, przy których instaluje się duża ilość paczek. Jednak moim zdaniem lepiej stopniowo je sobie doinstalowywać, żeby mieć czas, by się z nimi zaznajomić. Bo co z tego, że od razu będzie dużo paczek zainstalowanych, jak nie będzie się umiało z nich skorzystać.

Moje wskazówki odnośnie pierwszych kroków z Emacsem i Clojure:

  1. Zainstalować Leiningen.

  2. Zainstalować Emacs korzystając z instalki na stronie:
    http://vgoulet.act.ulaval.ca/en/emacs/windows/

  3. Dodać archiwum paczek i zainstalować nrepl, tak jak w poście:
    http://ravingbytes.blogspot.com/2013/02/clojure-i-emacs-z-wtyczna-nrepl-na.html

  4. Zainstalować dodatkowe pakiety, np takie jak opisane w:
    http://blog.worldcognition.com/2012/07/setting-up-emacs-for-clojure-programming.html

Dodatkowo warto zainstalować lub uruchomić:

  • expand-region - rozszerza zaznaczenie o jeden poziom wyżej (podobnie jak Ctr+W w IntelliJ albo Ctr+Alt+Góra w Eclipse
  • inną skórkę np. color-theme-sanityinc-tomorrow
  • recentf - ostatnio otwierane pliki
  • przesuwanie linii do góry i do dołu (tu wystarczy parę linijek w pliku konfiguracyjnym, zamieszczę cały na końcu posta)

(require 'package)
(add-to-list 'package-archives
             '("marmalade" . "http://marmalade-repo.org/packages/"))
(package-initialize)



(defvar my-packages '(
                      clojure-mode
                      clojure-test-mode
                      ac-nrepl paredit popup
        nrepl
                      expand-region
                      jump 
        color-theme-sanityinc-tomorrow))


(dolist (p my-packages)
  (when (not (package-installed-p p))
    (package-install p)))

;; Set color-theme

(load-theme 'sanityinc-tomorrow-eighties t) 


;; Paredit
(add-hook 'clojure-mode-hook 'paredit-mode)
(add-hook 'nrepl-mode-hook 'paredit-mode)

;; odpowiednik Ctrl+W w IntelliJ IDEA
(require 'expand-region)
(global-set-key (kbd "C-=") 'er/expand-region)

(put 'upcase-region 'disabled nil)
;; Auto complete
(require 'auto-complete-config)
(ac-config-default)

;; ac-nrepl
(require 'ac-nrepl)
(add-hook 'nrepl-mode-hook 'ac-nrepl-setup)
(add-hook 'nrepl-interaction-mode-hook 'ac-nrepl-setup)
(eval-after-load "auto-complete" '(add-to-list 'ac-modes 'nrepl-mode))

(menu-bar-mode 1)
(tool-bar-mode 0)
(desktop-save-mode)
(ido-mode)
(recentf-mode)
(show-paren-mode)

(require 'recentf)

(recentf-mode 1)
(global-set-key "\C-xf" 'recentf-open-files)
(setq recentf-auto-cleanup 'never)


(defun move-line-up ()
  "Move up the current line."
  (interactive)
  (transpose-lines 1)
  (forward-line -2)
  (indent-according-to-mode))

(defun move-line-down ()
  "Move down the current line."
  (interactive)
  (forward-line 1)
  (transpose-lines 1)
  (forward-line -1)
  (indent-according-to-mode))
  
  
(global-set-key [(control shift up)]  'move-line-up)
(global-set-key [(control shift down)]  'move-line-down)

Brak komentarzy :

Prześlij komentarz