Clojure를위한 Emacs / Swank / Paredit에 대한 부드러운 튜토리얼


87

Clojure / Lisp 작업을 위해 Emacs로 이동하고 있습니다. 다음을 수행하기 위해 Emacs에서 설정하는 데 필요한 모든 정보는 무엇입니까?

  1. 자동 일치 / 해당 닫는 괄호 생성
  2. C ++ / Java 스타일이 아닌 자동 들여 쓰기 Lisp / Clojure 스타일
  3. 구문 강조
  4. REPL 호출
  5. 파일에서 REPL로 코드의 일부를로드하고 평가할 수 있습니다.

Emacs에서 설정 한 후 이러한 것들을 얻기위한 명령 목록을 얻을 수 있다면 좋을 것입니다.

답변:


89

[비 작성자 편집 : 2010 년에 작성되었으며 2011 년 5 월 이후로 프로세스가 상당히 단순화되었습니다. 2012 년 2 월부터 설정 메모와 함께이 답변에 게시물을 추가하겠습니다.]

Emacs, SLIME (Clojure와 완벽하게 작동합니다-swank-clojure 참조), swank-clojure (SLIME 서버 대응의 Clojure 구현), clojure-mode, Paredit 및 물론 Clojure 항아리는 시작을 위해 아마도 Leiningen이 아마도 가장 주목할만한 일부 엑스트라 일 것입니다. 모든 설정을 완료하면 질문에서 언급 한 모든 워크 플로우 / 편집 기능을 Emacs 내에서 사용할 수 있습니다.

기본 설정 :

다음은이 모든 것을 설정하는 방법을 설명하는 훌륭한 튜토리얼입니다. 웹에는 더 많은 것이 있지만 다른 일부는 상당히 구식이지만이 두 가지는 현재로서는 괜찮은 것 같습니다.

  1. Phil Hagelberg의 블로그에 클로저 저자 게시물 과 관련된 거래 속임수가 발견되었습니다 . Phil은 swank-clojure와 clojure-mode, Emacs Starter Kit라는 패키지를 유지합니다. 이러한 지침은 인프라에 대한 최근 변경 사항으로 업데이트 된 것 같습니다. 의심스러운 경우 Clojure의 Google 그룹에 대한 추가 정보를 찾으십시오.

  2. Incanter 프로젝트 블로그에 Clojure, Incanter, Emacs, Slime, Swank 및 Paredit 게시물을 설정합니다. Incanter는 Clojure에 포함 된 통계 계산을위한 R-like DSL을 제공하는 매혹적인 패키지입니다. 이 게시물은 Incanter를 사용하거나 설치할 계획이없는 경우에도 유용합니다.

모든 것을 작동시키기 :

이 모든 항목을 설정하면 즉시 사용해 볼 수 있지만 다음을 수행하는 것이 좋습니다.

  1. SLIME 매뉴얼을보세요. 소스에 포함되어 있으며 실제로 매우 읽기 쉽습니다. 또한 50 페이지짜리 몬스터 매뉴얼 전체를 읽어야 할 이유가 전혀 없습니다 . 어떤 기능을 사용할 수 있는지 둘러보세요.

    참고 : 최신 업스트림 소스에서 발견되는 SLIME의 autodoc 기능은 swank-clojure와 호환되지 않습니다. Phil Hagelberg의 ELPA 버전 사용 권장 사항을 따르면이 문제가 발생하지 않습니다 (설명은 앞서 언급 한 블로그 게시물 참조). 또는 단순히 autodoc을 끄십시오 (사물의 기본 상태). 후자의 옵션은 Common Lisp와 함께 최신 SLIME을 사용할 수 있다는 점에서 추가 된 매력이 있습니다.

  2. paredit에 대한 문서를 살펴보십시오. 여기에는 두 가지 방법이 있습니다. (1) 소스를보십시오. 파일 상단에 필요한 모든 정보가 포함 된 엄청난 양의 주석이 있습니다. (2) C-h mparedit-mode가 활성화 된 상태에서 Emacs를 입력하십시오 -버퍼는 현재의 주요 모드에 대한 정보와 함께 모든 활성 부 모드에 대한 정보와 함께 팝업 될 것입니다 (paredit는 그중 하나입니다).

    업데이트 : 방금 Phil Hagelberg의 Paredit에서 멋진 노트 모음을 찾았 습니다 ... 텍스트 파일에 대한 링크입니다. 어딘가에이 정보가 포함 된 멋진 슬라이드 세트를 본 기억이 있지만 지금은 찾을 수없는 것 같습니다. . 어쨌든 그것이 어떻게 작동하는지에 대한 좋은 요약입니다. 확실히 한번보세요. 지금은 Paredit 없이는 살 수 없습니다.이 파일을 사용하면 사용을 매우 쉽게 시작할 수 있습니다. :-)

  3. 사실,이 C-h m조합은 SLIME REPL, 클로저 모드 ( C-c C-k컴파일을 위해 현재 버퍼를 보내는 것을 기억하고 싶을 것임 ) 및 실제로 모든 Emacs 버퍼에서 활성화 된 모든 키 바인딩에 대해 알려 줍니다.

REPL 그것을 실험 후 파일의 코드를로드하고 관해서 : 상기 용도 C-c C-k현재 버퍼 후 컴파일 조합 use또는 requireREPL의 네임 스페이스를. 다음으로 실험 해보십시오.

최종 참고 사항 :

모든 클릭이 발생하기 전에 잠시 동안 조정할 준비를하십시오. 관련된 많은 도구가 있고 그 상호 작용은 대부분 상당히 부드럽지만 처음에 약간의 조정을 할 필요가 없다고 가정하는 것이 안전 할 정도는 아닙니다.

마지막으로 .emacs필 하겔 버그의 멋진 기능을 기반으로하지만 다른 곳에서는 찾을 수없는 코드 가 있습니다. lein swank(Leiningen의 멋진 기능 중 하나)를 사용하여 스컹크 인스턴스 clojure-project를 시작하는 것과 아래에 있는 기능을 사용하여 Emacs 내에서 모든 것을 시작하는 것을 번갈아 가며 사용합니다 . 나는 후자가에서 제공하는 것과 밀접하게 일치하는 환경을 생산하도록 최선을 다했습니다 lein swank. 아, 그리고 빠르고 더러운 실험을 위해 Emacs에서 REPL을 원한다면 올바른 설정으로 M-x slime직접 사용할 수 있어야합니다 .

(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))

2
아름다운 글을 보내 주셔서 대단히 감사합니다!
user855

3
천만에요. Clojure와 함께하기를 바랍니다. 해피 해킹! :-)
Michał Marczyk

2
ł : 아주 좋은 글을 써주세요. 감사.
Ralph

참으로 아주 좋은 튜토리얼입니다. 나는 내가 그것을 정말로 좋아하지 않더라도 최선의 선택이 Emacs라는 것을 방금 알았습니다. IDEA, Eclipse 및 netbeans는 단순히 그림에 맞지 않습니다.
Adam Arold 2011


8

이맥스 스타터 키트는 Clojure를 시작하기위한 좋은 리뷰를 얻었다 :

귀하의 질문의 일부에만 대답하려면 :

Leiningen은 올바른 클래스 경로로 swank를 설정하고 Emacs에 연결하는 정말 쉬운 방법입니다.

멋진 동영상이 있습니다. http://vimeo.com/channels/fulldisclojure#8934942 다음은 다음과 같은 project.clj 파일의 예입니다.

(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)

그런 다음 실행하십시오.

lein swank

그리고 Emacs에서 :

 alt-x slime-connect


1

여기서 CIDER (Clojure Interactive Development Environment)를 언급해야합니다.

찾고있는 대부분의 내용을 다룰 것입니다. 다음이 포함됩니다.

  • 대화 형 REPL
  • 디버깅
  • 테스트 실행
  • 코드 탐색
  • 문서 조회
  • 아주 더 많이

CIDER 외에도 clojure 개발을위한 필수적이고 유용한 부가 기능이 몇 가지 있는데,이를 각각 (그리고 주관적으로) 그룹화하려고합니다.

골자

  • smartparens – 괄호 쌍, 조작, 탐색 (또는 원하는 경우 parinfer )

  • clj-refactor –- 네임 팩 자동 추가 / 컴파일과 같은 몇 가지 놀라운 기능이 있습니다 (곧 CIDER에 통합 될 수 있음).

  • clojure-mode – 글꼴 잠금, 들여 쓰기, 탐색

  • 회사 – 텍스트 완성 프레임 워크 (또는 다른 자동 완성기 선택)

  • 무지개 구분 기호 – 깊이에 따라 괄호, 대괄호 또는 중괄호와 같은 구분 기호를 강조 표시 / 색상 지정

  • flycheck – 즉석 구문 검사 확장

  • flycheck-CLJ-콘도 -의 통합 CLJ-콘도

미묘한 점

  • clojure-snippets – 더 긴 코드 청크에 대한 탭 확장 단축키

  • dumb-jump – 정의로 이동

  • which-key – 사용 가능한 키 바인딩을 팝업으로 표시합니다.

  • 괄호 강조 – 주변 괄호 강조

  • crux – Emacs를위한 엄청나게 유용한 확장 모음

  • comment-dwim-2 – Emacs의 내장 기능 대체comment-dwim

일반 필수 사항 (모든 언어)

  • magit – Emacs 내부의 git porcelain

  • 발사체 – 파일 찾기, 검색 등을위한 프로젝트 관리

  • helm – 점진적 완성 및 선택 축소 프레임 워크 (또는 swiper )

기타 리소스

이 작업의 대부분 / 모두를 이미 수행 한 설정을 찾고 있다면 몇 가지 옵션이 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.