Emacs / Swank / Paredit के लिए एक कोमल ट्यूटोरियल क्लीजुरे


87

मैं Emacs के लिए Clojure / Lisp पर काम कर रहा हूं । निम्नलिखित के लिए सक्षम होने के लिए मुझे Emacs पर सेटअप करने के लिए आवश्यक सभी जानकारी क्या है?

  1. इसी समापन कोष्ठक के स्वचालित मिलान / पीढ़ी
  2. ऑटिंडेंट लिस्प / क्लोजर शैली, सी ++ / जावा शैली नहीं
  3. वाक्य - विन्यास पर प्रकाश डालना
  4. लागू आरईपीएल
  5. REPL में फ़ाइल से कोड का एक हिस्सा लोड करने में सक्षम होने के लिए और इसका मूल्यांकन करने के लिए।

यह बहुत अच्छा होगा अगर मैं Emacs पर चीजों को स्थापित करने के बाद इन चीजों को प्राप्त करने के लिए आदेशों की सूची प्राप्त कर सकता हूं।

जवाबों:


89

[गैर-लेखक से संपादित करें: यह 2010 से है, और मई 2011 से इस प्रक्रिया को काफी सरल बना दिया गया है। मैं अपने सेटअप नोट्स के साथ फ़रवरी 2012 तक इस उत्तर में एक पोस्ट जोड़ दूंगा।]

आपको कुछ टुकड़ों को एक साथ रखना होगा: Emacs, SLIME (जो पूरी तरह से क्लोजर के साथ अच्छी तरह से काम करता है - swank-clojure देखें), swank-clojure (SLIME के ​​सर्वर समकक्ष का Clojure कार्यान्वयन), clojure-mode, Paredit और बेशक, क्लोजर जार एक शुरुआत के लिए, फिर शायद कुछ एक्स्ट्रा कलाकार जिनमें से लेनिंगन सबसे उल्लेखनीय होंगे। एक बार जब आप इसे पूरी तरह से सेट कर लेते हैं, तो आपके पास - Emacs के भीतर - प्रश्न में उल्लिखित सभी वर्कफ़्लो / संपादन सुविधाएँ।

बुनियादी ढांचा:

निम्नलिखित महान ट्यूटोरियल हैं जो बताते हैं कि यह सब कैसे सेट करना है; वेब पर अधिक है, लेकिन कुछ अन्य काफी पुराने हैं, जबकि ये दोनों अब के लिए ठीक लग रहे हैं:

  1. जिसमें फिल हागेलबर्ग के ब्लॉग पर क्लोजर ऑथरशिप पोस्ट के विषय में व्यापार के गुर पाए जाते हैं ; फिल स्वांक-क्लोजर और क्लोजर-मोड को बनाए रखता है, साथ ही Emacs स्टार्टर किट नामक एक पैकेज है जो Emacs की दुनिया में किसी भी नवागंतुक के लिए एक नज़र रखने के लिए अच्छी तरह से सलाह दी जाएगी। इन निर्देशों को आधारभूत संरचना में हाल के बदलावों के साथ लाया गया लगता है; संदेह के मामले में, क्लोजर के Google समूह पर अतिरिक्त जानकारी के लिए देखें।

  2. इन्कंटर परियोजना के ब्लॉग पर क्लजुरे, इन्कंटर, एमएसीएस, कीचड़, स्वांक, और पारडिट पोस्ट की स्थापना। इंकान्टर एक आकर्षक पैकेज है जो कि क्लोजर में दाईं ओर स्थित सांख्यिकीय संगणनाओं के लिए आर-जैसे डीएसएल प्रदान करता है। यह पोस्ट तब भी उपयोगी होगी जब आप उपयोग करने की योजना नहीं बनाते हैं - या यहाँ तक कि स्थापित करने - Incanter।

काम करने के लिए यह सब डाल:

एक बार जब आप इस सभी सामान को सेट कर लेते हैं, तो आप कोशिश कर सकते हैं और तुरंत इसका उपयोग करना शुरू कर सकते हैं, लेकिन मैं आपको निम्नलिखित करने के लिए दृढ़ता से सलाह दूंगा:

  1. SLIME के ​​मैनुअल पर एक नज़र डालें - यह स्रोतों में शामिल है और वास्तव में बहुत पठनीय है। इसके अलावा, पूरी तरह से कोई कारण नहीं है कि आपको पूरे 50-पेज के राक्षस मैनुअल को पढ़ना चाहिए ; बस देखने के लिए चारों ओर एक नज़र है कि क्या सुविधाएँ उपलब्ध हैं।

    नोट: नवीनतम अपस्ट्रीम स्रोतों में पाया गया SLIME का ऑटोडोक फीचर स्वंक-क्लॉज्योर के साथ असंगत है - यदि आप ELPA संस्करण का उपयोग करने के लिए फिल हगेलबर्ग की सिफारिश का पालन करते हैं तो यह समस्या सामने नहीं आएगी (स्पष्टीकरण के लिए उनका उपरोक्त ब्लॉग पोस्ट देखें) या बस ऑटोडोक को छोड़ दें (जो चीजों की डिफ़ॉल्ट स्थिति है)। बाद वाले विकल्प में कुछ जोड़ा गया अपील है कि आप अभी भी सामान्य लिस्प के साथ नवीनतम एसएलटाइम का उपयोग कर सकते हैं, यदि आप इसका उपयोग करते हैं।

  2. पैराडिट के लिए डॉक्स पर एक नजर है। इस बारे में जाने के दो तरीके हैं: (1) स्रोत को देखें - फ़ाइल के शीर्ष पर बड़ी मात्रा में टिप्पणियां हैं जिनमें वे सभी जानकारी शामिल हैं जिनकी आपको आवश्यकता है; (2) C-h mईमेक में टाइप करें जबकि पैराडिट-मोड सक्रिय है - वर्तमान प्रमुख मोड पर जानकारी के साथ एक बफर पॉप जाएगा जिसके बाद सभी सक्रिय मामूली मोड पर जानकारी होगी (पैराडिट उन में से एक है)।

    अद्यतन: मैंने अभी-अभी फिल हाग्लबर्ग द्वारा परेडिट पर नोटों का यह शांत सेट पाया है ... यह एक टेक्स्ट फ़ाइल का लिंक है, मुझे याद है कि इस जानकारी के साथ स्लाइड का एक अच्छा सेट कहीं न कहीं दिखाई दे रहा है, लेकिन अब इसे ढूंढना संभव नहीं है । वैसे भी, यह एक अच्छा सारांश है कि यह कैसे काम करता है। निश्चित रूप से इस पर एक नज़र डालें, मैं अब परदित के बिना नहीं रह सकता और इस फ़ाइल को इसका उपयोग शुरू करना बहुत आसान बनाना चाहिए, मुझे विश्वास है। :-)

  3. वास्तव में, C-h mसंयोजन आपको क्लीजुर-मोड में SLIME REPL पर सक्रिय सभी कीबाइंडिंग के बारे में बताएगा (आप C-c C-kसंकलन के लिए वर्तमान बफर को भेजने के लिए याद रखना चाहते हैं ) और वास्तव में किसी भी Emacs बफर में।

एक फ़ाइल से कोड लोड करने और फिर REPL में इसके साथ प्रयोग C-c C-kकरने के लिए: वर्तमान बफर का संकलन करने के लिए aforementioned संयोजन का उपयोग करें , useया फिर requireREPL पर इसके नाम स्थान। इसके बाद, प्रयोग करें।

अंतिम नोट:

सभी क्लिक होने से पहले कुछ समय के लिए चीजों को मोड़ने के लिए तैयार रहें। इसमें बहुत सारे उपकरण शामिल हैं और उनकी बातचीत ज्यादातर काफी चिकनी होती है, लेकिन उस बिंदु तक नहीं जहां यह मान लेना सुरक्षित होगा कि आपको शुरू में कुछ समायोजन नहीं करना होगा।

अंत में, यहाँ एक बिट कोड रखा गया है, .emacsजिसमें आप कहीं और नहीं मिलेंगे (हालाँकि यह फिल हैग्लबर्ग का एक शांत कार्य पर आधारित है)। मैं वैकल्पिक रूप से Emacs के भीतर से पूरी बात शुरू करने के लिए नीचे दिए गए फ़ंक्शन lein swankका उपयोग करके ( लिनिंगन की कूलर विशेषताओं में से एक) के साथ अपने हंस इंस्टेंस को शुरू करने के बीच वैकल्पिक हूं clojure-project। मैंने बाद के माहौल को बारीकी से बनाने के लिए अपनी पूरी कोशिश की है जो इसके द्वारा प्रदान की गई है 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
आपका स्वागत है। आशा है कि यह आपको अपने रास्ते पर क्लोजर के साथ मिल जाएगा। हैप्पी हैकिंग! :-)
मिचेल मार्कीज

2
ł: बहुत अच्छा लिखो। धन्यवाद।
राल्फ

यह वास्तव में एक बहुत अच्छा ट्यूटोरियल है। मुझे अभी पता चला है कि सबसे अच्छा विकल्प Emacs है, भले ही मुझे यह वास्तव में पसंद न हो। IDEA, Eclipse और netbeans केवल चित्र में फिट नहीं होते हैं।
एडम एरॉल्ड

10

एक और उत्कृष्ट ट्यूटोरियल है:

30 से 45 मिनट में एक खरोंच से सब कुछ सेटअप हो सकता है।

ट्यूटोरियल Emacs के किसी भी पूर्व पता नहीं मानता है (और Clojure भी - पहले के पदों में Clojure के लिए एक अच्छा परिचय है)।


8

Emacs स्टार्टर किट Clojure के साथ शुरू हो रही है के लिए महान समीक्षाएँ मिल गया है:

अपने प्रश्न के केवल हंस भाग का उत्तर देने के लिए:

लेनिंगन सही क्लासपैथ के साथ स्वंक स्थापित करने का एक बहुत आसान तरीका है और इसे एमएसीएस से जुड़ा हुआ है।

एक शानदार वीडियो यहाँ है: http://vimeo.com/channels/fulldisclojure#8934942 यहाँ एक प्रोजेक्ट का उदाहरण दिया गया है ।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 (क्लोजर इंटरएक्टिव डेवलपमेंट एनवायरनमेंट) का उल्लेख यहाँ किया जाना चाहिए।

यह आप के लिए क्या देख रहे हैं के अधिकांश कवर करेंगे। उसमे समाविष्ट हैं:

  • इंटरैक्टिव REPL
  • डिबगिंग
  • परीक्षण चल रहा है
  • कोड नेविगेशन
  • प्रलेखन लुकअप
  • और भी, बहुत

CIDER के अलावा, क्लोजर डेवलपमेंट के लिए कुछ अन्य आवश्यक और अच्छे ऐड-ऑन हैं, जिन्हें मैं क्रमशः (और सब्जेक्टली) ग्रुप में करने की कोशिश करूँगा:

अनिवार्य

  • स्मार्टपैरेन्स - लघुकोष्ठक युग्मन, हेरफेर, नेविगेशन (या यदि आप चाहें तो परिनफर करें )

  • clj-refactor- में कुछ अद्भुत विशेषताएं हैं, जैसे ऑटो-जोड़ना / संकलन नाम स्थान (इसे जल्द ही CIDER में शामिल किया जा सकता है)

  • clojure-mode - फॉन्ट-लॉक, इंडेंटेशन, नेविगेशन

  • कंपनी - पाठ पूरा होने की रूपरेखा (या एक और ऑटो-कंपाइलर चुनें)

  • इंद्रधनुष प्रलाप - हाइलाइटर्स जैसे कि कोष्ठक, कोष्ठक या ब्रेसिज़ को हाइलाइट करता है / उनकी गहराई के अनुसार रंग बनाता है

  • फ्लाईकैच - ऑन-द-फ्लाई सिंटैक्स चेकिंग एक्सटेंशन

  • flycheck-clj-kondo - clj-kondo के लिए एकीकरण

ब्योरा

  • clojure-snippets - टैब-एक्सपेंडेबल शॉर्टकट्स जो लंबे समय तक कोड को काटते हैं

  • गूंगा-कूद - परिभाषाओं के लिए कूदो

  • कौन-कुंजी - पॉपअप में उपलब्ध कीबाइंडिंग प्रदर्शित करता है

  • कोष्ठक पर प्रकाश डाला - आसपास के कोष्ठक पर प्रकाश डाला

  • crux - Emacs के लिए हास्यास्पद रूप से उपयोगी एक्सटेंसन का एक संग्रह

  • टिप्पणी- dwim-2 - एमएसीएस के अंतर्निहित के लिए प्रतिस्थापनcomment-dwim

सामान्य अनिवार्यता (किसी भी भाषा के लिए)

  • Magit - Emacs के अंदर git चीनी मिट्टी के बरतन

  • प्रोजेक्टाइल - फाइलों को खोजने, खोजने आदि के लिए प्रोजेक्ट एमजीएमटी

  • पतवार - वृद्धिशील पूर्णता और चयन संकुचन ढांचा (या स्वीपर )

अन्य संसाधन

यदि आप एक सेटअप की तलाश कर रहे हैं जो पहले से ही आपके लिए सबसे अधिक / सभी काम कर चुका है, तो कुछ विकल्प हैं:

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.