Delikatny tutorial do Emacs/Swank/Paredit do Clojure

Przenoszę się do Emacsa, aby pracować nad Clojure /Lisp. Jakie są wszystkie informacje potrzebne do Ustawienia Emacsa, aby móc wykonać następujące czynności?

  1. automatyczne dopasowanie / generowanie odpowiednich nawiasów zamykających
  2. autoindent Lisp / Clojure style, Nie C++/Java style
  3. podświetlanie składni
  4. wywołanie REPL
  5. aby móc załadować część kodu z pliku do REPL i ocenić go.

Byłoby świetnie, gdybym mógł również dostać lista komend do pobierania tych rzeczy po skonfigurowaniu na Emacsie.

Author: Múna, 2010-02-18

4 answers

[Edit from non-author: to jest z 2010 roku, a proces został znacznie uproszczony od maja 2011 roku. Dodam post do tej odpowiedzi z moimi uwagami dotyczącymi konfiguracji od lutego 2012.]

Będziesz musiał złożyć kilka kawałków: Emacs ,SLIME (który doskonale współpracuje z Clojure -- zobacz swank-clojure), swank-clojure( implementacja Clojure serwera odpowiednika SLIME), Clojure-mode, Paredit i, oczywiście, Clojure jar na początek, a następnie być może jakieś dodatki, wśród których Leiningen byłby chyba najbardziej godny uwagi. Kiedy już to wszystko skonfigurujesz, będziesz miał-w Emacsie - wszystkie funkcje obiegu pracy / edycji, o których wspomniałeś w pytaniu.

Konfiguracja podstawowa:

Poniżej znajdują się świetne tutoriale, które opisują, jak ustawić to wszystko; jest ich więcej w sieci, ale niektóre z innych są dość przestarzałe, podczas gdy te dwa wydają się być na razie ok: {]}

  1. W którym znajdują się sztuczki handlu dotyczące clojure autorstwo post na blogu Phila Hagelberga; Phil utrzymuje swank-clojure i Clojure-mode, a także pakiet o nazwie Emacs Starter Kit, który jest czymś, co każdy nowicjusz w świecie Emacsa byłby dobrze poinformowany, aby rzucić okiem. Wydaje się, że instrukcje te zostały zaktualizowane w związku z ostatnimi zmianami w infrastrukturze; w razie wątpliwości poszukaj dodatkowych informacji w grupie Google Clojure.

  2. Konfigurowanie Clojure, Incanter, Emacs, Slime, Swank i Paredit post na blogu projektu Incanter. Incanter to fascynujący pakiet dostarczający r-like DSL do obliczeń statystycznych osadzonych bezpośrednio w Clojure. Ten post będzie przydatny, nawet jeśli nie planujesz używać -- lub nawet instalować -- Incanter.

Wszystko działa:

Po skonfigurowaniu tego wszystkiego, możesz spróbować zacząć go używać od razu, ale zdecydowanie radzę ci wykonać następujące czynności:]}

  1. Spójrz na Podręcznik SLIME ' a -- jest zawarty w źródłach i jest bardzo czytelny. Ponadto, nie ma absolutnie żadnego powodu, dla którego powinieneś przeczytać cały 50-stronicowy podręcznik potwora; po prostu rozejrzyj się, aby zobaczyć, jakie funkcje są dostępne.

    Uwaga: funkcja autodoc SLIME znaleziona w najnowszych źródłach jest niezgodna ze swank-clojure -- ten problem nie pojawi się, jeśli zastosujesz się do zalecenia Phila Hagelberga, aby użyć wersji ELPA (zobacz jego wyżej post na blogu dla wyjaśnienia) lub po prostu zostaw autodoc wyłączony (co jest domyślnym stanem rzeczy). Ta ostatnia opcja ma pewne dodatkowe odwołania w tym, że nadal możesz używać najnowszego SLIME Z Common Lisp, w przypadku, gdy tego również używasz.

  2. Spójrz na dokumenty dla paredit. Są dwa sposoby, aby to zrobić: (1) Spójrz na źródło - na górze pliku znajduje się ogromna ilość komentarzy, które zawierają wszystkie informacje, których prawdopodobnie potrzebujesz; (2) wpisz C-h M W Emacs podczas gdy paredit-mode jest aktywny -- pojawi się bufor z informacjami o bieżącym trybie głównym, a następnie z informacjami o wszystkich aktywnych trybach podrzędnych (paredit jest jednym z nich).

    Update: właśnie znalazłem ten fajny zestaw nut na Paredit autorstwa Phila Hagelberga... To jest link do pliku tekstowego, pamiętam, że widziałem gdzieś ładny zestaw slajdów z tą informacją, ale nie mogę go teraz znaleźć. W każdym razie jest to miłe podsumowanie tego, jak to działa. Zdecydowanie Zerknij na to, nie mogę żyć bez Paredita teraz i ten plik powinien bardzo łatwo rozpocząć korzystanie z niego, jak sądzę. :-)

  3. W rzeczywistości, kombinacja C-h M powie Ci o wszystkich klawiszach aktywnych w REPL SLIME, w trybie clojure (będziesz chciał zapamiętać C-c C-k do wysłania bieżącego bufora do kompilacji) i rzeczywiście w każdym buforze Emacsa.

Co do wczytywania kodu z pliku, a następnie eksperymentowania z nim w REPL: użyj powyższa kombinacja C-c C-K kompiluje bieżący bufor, a następnie use lub require jego przestrzeń nazw w REPL. Następnie eksperymentuj.

Uwagi końcowe:

Bądź przygotowany na to, że będziesz musiał przez jakiś czas poprawiać rzeczy, zanim wszystko kliknie. W grę wchodzi wiele narzędzi, a ich interakcje są w większości dość płynne, ale nie do tego stopnia, że można bezpiecznie założyć, że nie będziesz musiał początkowo wprowadzać pewnych zmian.

Wreszcie, oto kawałek kodu, który trzymam .emacs którego nigdzie indziej nie znajdziecie (choć oparty jest na fajnej funkcji Phila Hagelberga). Przemiennie uruchamiam instancje swank z lein swank (jedna z fajniejszych funkcji Leiningen) i używam funkcji clojure-project, która znajduje się poniżej, aby uruchomić całość z poziomu Emacsa. Zrobiłem, co w mojej mocy, aby te ostatnie stworzyły środowisko ściśle dopasowane do tego dostarczonego przez lein swank. AHA, a jeśli chcesz po prostu REPL w Emacsie do szybkiego i brudnego eksperymentu, to przy prawidłowej konfiguracji powinieneś być potrafi używaćm-x slime bezpośrednio.

(setq clojure-project-extra-classpaths
      '(
        ; "deps/"
        "src/"
        "classes/"
        "test/"
        ))

(setq clojure-project-jar-classpaths
      '(
        ; "deps/"
        "lib/"
        ))

(defun find-clojure-project-jars (path)
  (apply #'append
         (mapcar (lambda (d)
                   (loop for jar in (remove-if (lambda (f) (member f '("." "..")))
                                               (directory-files d t))
                         collect jar into jars
                         finally return jars))
                 (remove-if-not #'file-exists-p
                                clojure-project-jar-classpaths))))

(defun find-clojure-jar (jars)
  (let ((candidates
         (remove-if-not
          (lambda (jar)
            (string-match-p "clojure\\([0-9.-]+\\(SNAPSHOT|MASTER\\)?\\)?\\.jar$" jar))
          jars)))
    (if candidates
        (car candidates)
      (expand-file-name "~/.clojure/clojure.jar"))))

(defun find-clojure-contrib-jar (jars)
  (let ((candidates
         (remove-if-not
          (lambda (jar)
            (string-match-p "clojure-contrib\\([0-9.-]+\\(SNAPSHOT|MASTER\\)?\\)?\\.jar$" jar))
          jars)))
    (if candidates
        (car candidates)
      (expand-file-name "~/.clojure/clojure-contrib.jar"))))

;;; original due to Phil Hagelberg
;;; (see `Best practices for Slime with Clojure' thread on Clojure Google Group)
(defun clojure-project (path)
  "Sets up classpaths for a clojure project and starts a new SLIME session.

   Kills existing SLIME session, if any."
  (interactive (list (ido-read-directory-name
                      "Project root:"
                      (locate-dominating-file default-directory "pom.xml"))))
  (when (get-buffer "*inferior-lisp*")
    (kill-buffer "*inferior-lisp*"))
  (cd path)
  ;; I'm not sure if I want to mkdir; doing that would be a problem
  ;; if I wanted to open e.g. clojure or clojure-contrib as a project
  ;; (both lack "deps/")
                                        ; (mapcar (lambda (d) (mkdir d t)) '("deps" "src" "classes" "test"))
  (let* ((jars (find-clojure-project-jars path))
         (clojure-jar (find-clojure-jar jars))
         (clojure-contrib-jar (find-clojure-contrib-jar jars)))
    (setq swank-clojure-binary nil
          ;; swank-clojure-jar-path (expand-file-name "~/.clojure/clojure.jar")
          swank-clojure-jar-path clojure-jar
          swank-clojure-extra-classpaths
          (cons clojure-contrib-jar
                (append (mapcar (lambda (d) (expand-file-name d path))
                                clojure-project-extra-classpaths)
                        (find-clojure-project-jars path)))
          swank-clojure-extra-vm-args
          (list (format "-Dclojure.compile.path=%s"
                        (expand-file-name "classes/" path)))
          slime-lisp-implementations
          (cons `(clojure ,(swank-clojure-cmd) :init swank-clojure-init)
                (remove-if #'(lambda (x) (eq (car x) 'clojure))
                           slime-lisp-implementations))))
  (slime))
 89
Author: Michał Marczyk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-06 16:55:01

Jest jeszcze jeden doskonały tutorial:

W ciągu 30 do 45 minut można wszystko skonfigurować od podstaw.

Tutorial nie zakłada żadnej wcześniejszej znajomości Emacsa (i Clojure też - we wcześniejszych postach jest ładne intro do Clojure).

 10
Author: Piotr Kochański,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-05 15:23:32

Zestaw Startowy Emacs otrzymał świetne recenzje na rozpoczęcie pracy z Clojure:

Aby odpowiedzieć tylko na część twojego pytania:

Leiningen to naprawdę prosty sposób na skonfigurowanie poprawnej ścieżki classpath i podłączenie jej do Emacsa.

Świetny filmik jest tutaj: http://vimeo.com/channels/fulldisclojure#8934942 Oto przykład projektu.plik clj, który

(defproject project "0.1"
    :dependencies [[org.clojure/clojure
                      "1.1.0-master-SNAPSHOT"]
                   [org.clojure/clojure-contrib
                      "1.0-SNAPSHOT"]]
    :dev-dependencies [[leiningen/lein-swank "1.1.0"]]
    :main my.project.main)

Następnie uruchom:

lein swank

I z Emacsa:

 alt-x slime-connect
 8
Author: Arthur Ulfeldt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-02-25 19:09:52

Clojure z Emacs na Dokumentacja Clojure może być również przydatna.

 2
Author: aholub7x,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-22 19:01:38