Лагідний підручник з Emacs / Swank / Paredit для Clojure


87

Я переїжджаю до Emacs, щоб працювати над цим Clojure / Lisp. Яка вся інформація мені потрібна для налаштування на Emacs, щоб мати змогу робити наступне?

  1. автоматичне узгодження / генерація відповідних закриваючих дужок
  2. автовідступ Стиль Lisp / Clojure, а не стиль C ++ / Java
  3. Підсвічування синтаксису
  4. Виклик REPL
  5. Щоб мати можливість завантажити частину коду з файлу в REPL і оцінити його.

Було б чудово, якби я також міг отримати список команд для отримання цих речей після налаштування речей на Emacs.

Відповіді:


89

[Редагувати від автора, який не є автором: це з 2010 року, і процес значно спростився з травня 2011 року. До цієї відповіді я додаю публікацію зі своїми примітками про налаштування станом на лютий 2012 року.]

Вам потрібно буде скласти кілька частин: Emacs, SLIME (що чудово працює з Clojure - див. звичайно, банку Clojure для початку, то, можливо, деякі додаткові послуги, серед яких Лейнінген, мабуть, був би найбільш помітним. Після того, як ви все це налаштуєте, ви матимете - всередині Emacs - усі функції робочого процесу / редагування, про які ви згадали у питанні.

Базова настройка:

Далі подано чудові підручники, які описують, як це все налаштувати; в Інтернеті є ще щось, але деякі інші є досить застарілими, тоді як ці два поки що здаються нормальними:

  1. в якій знайдені прийоми торгівлі щодо публікації авторства клоджуре у блозі Філа Гегельберга; Філ підтримує режим Swank-Clojure та Clojure, а також пакет під назвою Emacs Starter Kit, котрий будь-який новачок у світі Emacs буде радимо поглянути. Ці інструкції, здається, були оновлені останніми змінами в інфраструктурі; у разі сумнівів шукайте додаткову інформацію в групі Clojure у Google.

  2. Налаштування допису Clojure, Incanter, Emacs, Slime, Swank та Paredit у блозі проекту Incanter. Incanter - це захоплюючий пакет, що надає R-подібний DSL для статистичних обчислень, вбудованих безпосередньо в Clojure. Ця публікація буде корисною, навіть якщо ви не плануєте використовувати - або навіть встановлювати - Incanter.

Запустіть все в роботу:

Після того, як ви налаштуєте всі ці речі, ви можете спробувати почати їх використовувати відразу, але я настійно рекомендую вам зробити наступне:

  1. Погляньте на посібник SLIME - він включений у джерела і насправді дуже читається. Крім того, немає абсолютно жодної причини, чому ви повинні прочитати цілий 50-сторінковий посібник з монстрів; просто озирніться навколо, щоб побачити, які функції доступні.

    Примітка: функція autodoc SLIME, як знайдено в останніх вихідних джерелах, несумісна із swank-clojure - ця проблема не з’явиться, якщо ви будете слідувати рекомендаціям Філа Хагельберга використовувати версію ELPA (пояснення див. У його згаданому повідомленні в блозі) або просто залишити autodoc вимкненим (що є типовим станом речей). Останній варіант має деяку додаткову привабливість у тому, що ви все ще можете використовувати останню програму SLIME із Common Lisp, якщо ви використовуєте її також.

  2. Погляньте на документи для отримання кредиту. Є два шляхи вирішення цього питання: (1) подивіться на джерело - у верхній частині файлу є величезна кількість коментарів, які містять всю інформацію, яка вам, ймовірно, знадобиться; (2) введіть C-h mв Emacs, коли активний режим кредитування - з’явиться буфер з інформацією про поточний основний режим, а потім інформація про всі активні другорядні режими (один із них).

    Оновлення: Я щойно знайшов цей класний набір приміток до Paredit від Філа Хагельберга ... Це посилання на текстовий файл, пам’ятаю, я десь бачив гарний набір слайдів із цією інформацією, але, здається, зараз не можу його знайти . У будь-якому випадку, це приємний підсумок того, як це працює. Безумовно, погляньте на це, я не можу жити без Paredit зараз, і я вважаю, що цей файл повинен зробити його дуже простим. :-)

  3. Насправді ця C-h mкомбінація розповість вам про всі прив'язки клавіш, активні в SLIME REPL, у режимі clojure (вам потрібно пам'ятати C-c C-kпро надсилання поточного буфера для компіляції), а також у будь-якому буфері Emacs.

Що стосується завантаження коду з файлу, а потім експериментувати з ним у REPL: використовуйте вищезазначену C-c C-kкомбінацію для компіляції поточного буфера, useабо requireйого простору імен у REPL. Далі експериментуйте далеко.

Заключні примітки:

Будьте готові трохи налаштувати речі, перш ніж це все клацне. Залучено багато інструментів, і їх взаємодія в основному досить плавна, але не до такої міри, коли було б безпечно припустити, що спочатку вам не доведеться вносити деякі коригування.

Нарешті, ось трохи коду, який я зберігаю, в .emacsякому ви не знайдете ніде (хоча він заснований на крутій функції Філа Хагельберга). Я почергово починаю мої екземпляри swank з 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. Щасливого злому! :-)
Міхал Марчик

2
ł: Дуже приємно написати. Дякую.
Ральф,

Це справді дуже приємний підручник. Я щойно дізнався, що найкращий варіант - це Emacs, навіть якщо він мені не дуже сподобався. IDEA, Eclipse та netbeans просто не вписуються в картину.
Адам Арольд

10

Є ще один чудовий підручник:

За 30-45 хвилин можна налаштувати все з нуля.

Підручник не передбачає жодних знань про Emacs (і Clojure теж - у попередніх публікаціях є гарне вступ до Clojure).


8

Початковий набір Emacs отримав чудові відгуки про початок роботи з Clojure:

Щоб відповісти лише на сувору частину вашого запитання:

Лейнінген - це дійсно простий спосіб налаштувати 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).

Він охоплюватиме більшу частину того, що ви шукаєте. Це включає:

  • інтерактивний REPL
  • налагодження
  • тестовий біг
  • код навігації
  • пошук документації
  • набагато більше

На додаток до CIDER, є ще кілька важливих і приємних у роботі доповнень для розробки clojure, які я спробую згрупувати відповідно (і суб'єктивно):

Необхідний

  • smartparens - парування в дужках, маніпуляції, навігація (або parinfer, якщо хочете)

  • clj-refactor –- має кілька дивовижних функцій, таких як автоматичне додавання / компіляція просторів імен (незабаром його можна буде включити в CIDER)

  • режим clojure - блокування шрифту, відступ, навігація

  • компанія - рамка для заповнення тексту (або виберіть інший автозаповнювач)

  • веселкові деліметри - виділяє / забарвлює роздільники, такі як дужки, дужки або дужки відповідно до їх глибини

  • flycheck - розширення перевірки синтаксису на льоту

  • flycheck-clj-kondo - інтеграція для clj-kondo

Приємності

Загальні основи (для будь-якої мови)

  • magit - git порцеляна всередині Emacs

  • снаряд - проект mgmt для пошуку файлів, пошуку тощо

  • кермо - поступове завершення та вибір звужувальної рамки (або swiper )

Інші ресурси

Якщо ви шукаєте установку, яка вже зробила більшість / всю цю роботу для вас, є кілька варіантів:

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.