บทช่วยสอนที่อ่อนโยนสำหรับ Emacs / Swank / Paredit สำหรับ Clojure


87

ฉันกำลังย้ายไปที่ Emacs เพื่อทำงานกับClojure / Lisp ข้อมูลทั้งหมดที่ฉันต้องใช้ในการตั้งค่า Emacs เพื่อให้สามารถทำสิ่งต่อไปนี้ได้คืออะไร?

  1. การจับคู่อัตโนมัติ / การสร้างวงเล็บปิดที่เกี่ยวข้อง
  2. autoindent Lisp / Clojure style ไม่ใช่ C ++ / Java style
  3. การเน้นไวยากรณ์
  4. การเรียกใช้REPL
  5. เพื่อให้สามารถโหลดโค้ดบางส่วนจากไฟล์ลงใน REPL และประเมินได้

จะดีมากถ้าฉันสามารถรับรายการคำสั่งเพื่อรับสิ่งเหล่านี้หลังจากตั้งค่าสิ่งต่างๆบน Emacs

คำตอบ:


89

[แก้ไขจากผู้ที่ไม่ใช่ผู้เขียน: นี่คือตั้งแต่ปี 2010 และกระบวนการนี้ง่ายขึ้นอย่างมากตั้งแต่เดือนพฤษภาคม 2011 ฉันจะเพิ่มโพสต์ในคำตอบนี้พร้อมบันทึกการตั้งค่าของฉัน ณ เดือนกุมภาพันธ์ 2012]

คุณจะต้องรวบรวมชิ้นส่วนต่างๆไว้ด้วยกัน: Emacs, SLIME (ซึ่งทำงานได้ดีอย่างสมบูรณ์กับ Clojure - ดู swank-clojure), swank-clojure (การใช้ Clojure ในเซิร์ฟเวอร์ของ SLIME), โหมด clojure, Paredit และของ แน่นอนว่าโถ Clojure สำหรับการเริ่มต้นบางทีอาจจะมีของพิเศษบางอย่างที่ Leiningen น่าจะเด่นที่สุด เมื่อคุณตั้งค่าทั้งหมดแล้วคุณจะมี - ภายใน Emacs - คุณสมบัติเวิร์กโฟลว์ / การแก้ไขทั้งหมดที่คุณกล่าวถึงในคำถาม

การตั้งค่าพื้นฐาน:

ต่อไปนี้เป็นบทเรียนที่ยอดเยี่ยมซึ่งอธิบายถึงวิธีการตั้งค่าทั้งหมดนี้ มีอีกมากมายบนเว็บ แต่เว็บอื่น ๆ บางส่วนค่อนข้างล้าสมัยในขณะที่ทั้งสองดูเหมือนจะโอเคสำหรับตอนนี้:

  1. ซึ่งจะพบกลเม็ดของการค้าที่เกี่ยวข้องกับการโพสต์ข้อความของผู้ประพันธ์ clojureในบล็อกของ Phil Hagelberg; ฟิลยังคงรักษาความหรูหราและโหมด clojure ไว้เช่นเดียวกับแพ็คเกจที่เรียกว่า Emacs Starter Kit ซึ่งเป็นสิ่งที่ผู้มาใหม่ในโลก Emacs จะได้รับการแนะนำให้ดู คำแนะนำเหล่านี้ดูเหมือนจะได้รับการปรับปรุงล่าสุดพร้อมกับการเปลี่ยนแปลงโครงสร้างพื้นฐานล่าสุด ในกรณีที่มีข้อสงสัยให้ค้นหาข้อมูลเพิ่มเติมเกี่ยวกับกลุ่ม Google ของ Clojure

  2. การตั้งค่าโพสต์Clojure, Incanter, Emacs, Slime, Swank และ Pareditในบล็อกของโครงการ Incanter Incanter เป็นแพ็คเกจที่น่าสนใจซึ่งให้ DSL แบบ R สำหรับการคำนวณทางสถิติที่ฝังอยู่ใน Clojure โพสต์นี้จะมีประโยชน์แม้ว่าคุณจะไม่ได้วางแผนที่จะใช้หรือแม้แต่ติดตั้ง Incanter ก็ตาม

ทำให้ทุกอย่างทำงานได้:

เมื่อคุณตั้งค่าสิ่งนี้ทั้งหมดแล้วคุณสามารถลองและเริ่มใช้งานได้ทันที แต่เราขอแนะนำให้คุณทำสิ่งต่อไปนี้:

  1. ดูคู่มือของ SLIME ซึ่งรวมอยู่ในแหล่งข้อมูลและอ่านได้ง่ายมาก นอกจากนี้คุณไม่ควรอ่านคู่มือสัตว์ประหลาดทั้ง 50 หน้า เพียงแค่มองไปรอบ ๆ เพื่อดูว่ามีคุณสมบัติใดบ้าง

    หมายเหตุ: คุณลักษณะ autodoc ของ SLIME ตามที่พบในแหล่งอัปสตรีมล่าสุดไม่สามารถทำงานร่วมกับ swank-clojure ได้ - ปัญหานี้จะไม่เกิดขึ้นหากคุณปฏิบัติตามคำแนะนำของ Phil Hagelberg ในการใช้เวอร์ชัน ELPA (ดูคำอธิบายในบล็อกโพสต์ดังกล่าว) หรือเพียงแค่ปล่อยให้ autodoc ปิด (ซึ่งเป็นสถานะเริ่มต้นของสิ่งต่างๆ) ตัวเลือกหลังมีการอุทธรณ์เพิ่มเติมที่คุณยังสามารถใช้ SLIME ล่าสุดกับ Common Lisp ได้ในกรณีที่คุณใช้เช่นกัน

  2. ดูเอกสารสำหรับ paredit มีสองวิธีในการดำเนินการนี้: (1) ดูที่มา - มีความคิดเห็นจำนวนมากที่ด้านบนของไฟล์ซึ่งมีข้อมูลทั้งหมดที่คุณน่าจะต้องการ (2) พิมพ์C-h mEmac ในขณะที่โหมด paredit ทำงานอยู่บัฟเฟอร์จะปรากฏขึ้นพร้อมข้อมูลเกี่ยวกับโหมดหลักปัจจุบันตามด้วยข้อมูลเกี่ยวกับโหมดรองที่ใช้งานอยู่ทั้งหมด (paredit เป็นหนึ่งในนั้น)

    อัปเดต:ฉันเพิ่งพบบันทึกย่อที่ยอดเยี่ยมนี้ใน Paredit โดย Phil Hagelberg ... นั่นเป็นลิงก์ไปยังไฟล์ข้อความฉันจำได้ว่าเห็นสไลด์ที่สวยงามพร้อมข้อมูลนี้อยู่ที่ไหนสักแห่ง แต่ดูเหมือนจะหาไม่ได้ในตอนนี้ . อย่างไรก็ตามมันเป็นบทสรุปที่ดีว่ามันทำงานอย่างไร ลองดูสิตอนนี้ฉันขาด Paredit ไม่ได้และไฟล์นี้น่าจะทำให้มันง่ายมากที่จะเริ่มใช้มันฉันเชื่อ :-)

  3. ในความเป็นจริงC-h mชุดค่าผสมจะบอกคุณเกี่ยวกับการเชื่อมโยงคีย์ทั้งหมดที่ใช้งานอยู่ที่ SLIME REPL ในโหมด clojure (คุณจะต้องจำไว้C-c C-kสำหรับการส่งบัฟเฟอร์ปัจจุบันออกเพื่อรวบรวม) และในบัฟเฟอร์ Emacs ใด ๆ

สำหรับการโหลดโค้ดจากไฟล์แล้วทดลองใช้ที่ REPL: ใช้C-c C-kชุดค่าผสมดังกล่าวเพื่อรวบรวมบัฟเฟอร์ปัจจุบันจากนั้นuseหรือrequireเนมสเปซที่ REPL ถัดไปทำการทดลอง

หมายเหตุสุดท้าย:

เตรียมพร้อมที่จะต้องปรับแต่งสิ่งต่างๆสักพักก่อนที่จะคลิกทั้งหมด มีเครื่องมือมากมายที่เกี่ยวข้องและการโต้ตอบของพวกเขาส่วนใหญ่ค่อนข้างราบรื่น แต่ไม่ถึงจุดที่ปลอดภัยที่จะถือว่าคุณไม่ต้องทำการปรับเปลี่ยนบางอย่างในตอนแรก

สุดท้ายนี่คือรหัสเล็กน้อยที่ฉันเก็บไว้.emacsซึ่งคุณจะไม่พบที่อื่น (แม้ว่าจะใช้ฟังก์ชันที่ยอดเยี่ยมของ Phil Hagelberg) ฉันสลับระหว่างการเริ่มต้นอินสแตนซ์สุดหรูของฉันด้วยlein swank(หนึ่งในคุณสมบัติที่เจ๋งกว่าของ Leiningen) และใช้clojure-projectฟังก์ชันดังที่พบด้านล่างเพื่อเริ่มต้นสิ่งทั้งหมดจากภายใน Emacs lein swankฉันได้ทำดีที่สุดของฉันที่จะทำให้การผลิตหลังสภาพแวดล้อมที่ใกล้เคียงกับที่ระบุไว้ตาม โอ้และถ้าคุณต้องการเพียงแค่ REPL ใน Emacs สำหรับการทดลองที่รวดเร็วและสกปรกคุณควรจะใช้การตั้งค่าที่ถูกต้องได้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

10

มีอีกหนึ่งบทช่วยสอนที่ยอดเยี่ยม:

ใน 30 ถึง 45 นาทีเราสามารถตั้งค่าทุกอย่างได้ตั้งแต่เริ่มต้น

บทช่วยสอนไม่ได้ถือว่าความรู้ก่อนหน้านี้ของ Emacs (และ Clojure ด้วย - ในโพสต์ก่อนหน้านี้มีคำแนะนำที่ดีเกี่ยวกับ Clojure)


8

Emacs Starter Kit มีอากาศความคิดเห็นที่ดีสำหรับการเริ่มต้นกับ Clojure:

หากต้องการตอบเฉพาะส่วนที่หรูหราของคำถามของคุณ:

Leiningen เป็นวิธีที่ง่ายมากในการตั้งค่า swank ด้วย classpath ที่ถูกต้องและเชื่อมต่อกับ 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 - วงเล็บการจับคู่การจัดการการนำทาง (หรือ พิจารณาตามที่คุณต้องการ)

  • clj-refactor–-มีคุณสมบัติที่น่าทึ่งสองสามอย่างเช่นการเพิ่ม / การรวบรวมเนมสเปซอัตโนมัติ (อาจรวมอยู่ใน CIDER เร็ว ๆ นี้)

  • โหมด clojure - การล็อกแบบอักษรการเยื้องการนำทาง

  • บริษัท - กรอบการเติมข้อความ (หรือเลือกตัวปรับแต่งข้อความอัตโนมัติอื่น)

  • เส้นคั่นสีรุ้ง - ไฮไลท์ / ตัวคั่นสีเช่นวงเล็บวงเล็บหรือวงเล็บปีกกาตามความลึก

  • flycheck - ส่วนขยายการตรวจสอบไวยากรณ์แบบ on-the-fly

  • flycheck-clj-kondo - การรวมสำหรับclj-kondo

Niceties

สิ่งจำเป็นทั่วไป (สำหรับภาษาใด ๆ )

  • magit - git porcelain ภายใน Emacs

  • projectile - projectileสำหรับค้นหาไฟล์ค้นหา ฯลฯ

  • หางเสือ - เสร็จสิ้นส่วนเพิ่มและกรอบการเลือกแคบลง (หรือ swiper )

แหล่งข้อมูลอื่น ๆ

หากคุณกำลังมองหาการตั้งค่าที่ได้ทำส่วนใหญ่ / ทั้งหมดนี้ให้คุณแล้วตัวเลือกสองสามข้อ ได้แก่ :

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.