Un tutoriel doux sur Emacs / Swank / Paredit pour Clojure

87

Je déménage chez Emacs pour travailler sur Clojure / Lisp. Quelles sont toutes les informations dont j'ai besoin pour configurer sur Emacs pour pouvoir effectuer les opérations suivantes?

  1. correspondance / génération automatique des parenthèses fermantes correspondantes
  2. style Lisp / Clojure autoindent, pas style C ++ / Java
  3. Mise en évidence de la syntaxe
  4. Appel de REPL
  5. Pour pouvoir charger une partie de code à partir d'un fichier dans le REPL et l'évaluer.

Ce serait formidable si je pouvais également obtenir la liste des commandes pour obtenir ces choses après avoir configuré les choses sur Emacs.

utilisateur855
la source

Réponses:

89

[Modifier par un non-auteur: il s'agit de 2010, et le processus a été considérablement simplifié depuis mai 2011. J'ajouterai un message à cette réponse avec mes notes de configuration à compter de février 2012.]

Vous devrez assembler quelques morceaux: Emacs, SLIME (qui fonctionne parfaitement avec Clojure - voir swank-clojure), swank-clojure (l'implémentation Clojure de l'homologue serveur de SLIME), clojure-mode, Paredit et, de Bien sûr, le pot Clojure pour commencer, puis peut-être quelques extras parmi lesquels Leiningen serait peut-être le plus notable. Une fois que vous avez tout configuré, vous aurez - dans Emacs - toutes les fonctionnalités de flux de travail / d'édition que vous mentionnez dans la question.

Configuration de base:

Ce qui suit sont d'excellents tutoriels qui décrivent comment configurer tout cela; il y en a plus sur le Web, mais certains des autres sont assez obsolètes, alors que ces deux semblent bien pour le moment:

  1. dans lequel on trouve des trucs du métier concernant le post d'auteur de clojure sur le blog de Phil Hagelberg; Phil maintient le mode swank-clojure et clojure-mode, ainsi qu'un package appelé Emacs Starter Kit qui est quelque chose que tout nouveau venu dans le monde Emacs aurait intérêt à regarder. Ces instructions semblent avoir été mises à jour avec les récents changements apportés à l'infrastructure; en cas de doute, recherchez des informations supplémentaires sur le groupe Google de Clojure.

  2. Mise en place de Clojure, Incanter, Emacs, Slime, Swank et Paredit post sur le blog du projet Incanter. Incanter est un package fascinant fournissant un DSL de type R pour les calculs statistiques intégrés directement dans Clojure. Cet article sera utile même si vous ne prévoyez pas d'utiliser - ou même d'installer - Incanter.

Tout mettre en œuvre:

Une fois que vous avez configuré tout cela, vous pouvez essayer de commencer à l'utiliser tout de suite, mais je vous conseillerais fortement de faire ce qui suit:

  1. Jetez un œil au manuel de SLIME - il est inclus dans les sources et est en fait très lisible. De plus, il n'y a absolument aucune raison pour laquelle vous devriez lire tout le manuel de monstre de 50 pages; Jetez simplement un œil pour voir quelles fonctionnalités sont disponibles.

    Remarque: la fonctionnalité autodoc de SLIME telle que trouvée dans les dernières sources en amont est incompatible avec swank-clojure - ce problème ne se posera pas si vous suivez la recommandation de Phil Hagelberg d'utiliser la version ELPA (voir son article de blog susmentionné pour une explication) ou laissez simplement autodoc désactivé (qui est l'état par défaut des choses). Cette dernière option a un attrait supplémentaire dans la mesure où vous pouvez toujours utiliser le dernier SLIME avec Common Lisp, au cas où vous l'utiliseriez également.

  2. Jetez un œil à la documentation pour paredit. Il y a deux façons de procéder: (1) regardez la source - il y a une énorme quantité de commentaires en haut du fichier qui contiennent toutes les informations dont vous aurez probablement besoin; (2) tapez C-h mEmacs pendant que le mode paredit est actif - un tampon apparaîtra avec des informations sur le mode majeur actuel suivi par des informations sur tous les modes mineurs actifs (paredit est l'un de ceux-ci).

    Mise à jour: Je viens de trouver cet ensemble de notes sympas sur Paredit par Phil Hagelberg ... C'est un lien vers un fichier texte, je me souviens avoir vu un bel ensemble de diapositives avec ces informations quelque part, mais je n'arrive pas à le trouver maintenant . Quoi qu'il en soit, c'est un bon résumé de la façon dont cela fonctionne. Jetez-y un coup d'œil, je ne peux pas vivre sans Paredit maintenant et ce fichier devrait vous permettre de commencer à l'utiliser très facilement, je crois. :-)

  3. En fait, la C-h mcombinaison vous informera de toutes les combinaisons de touches actives sur le SLIME REPL, en mode clojure (vous voudrez vous rappeler C-c C-kd'envoyer le tampon actuel pour la compilation) et en fait dans n'importe quel tampon Emacs.

En ce qui concerne le chargement du code à partir d' un fichier et l' expérimentation puis avec elle au REPL: utiliser précité C-c C-kcombinaison pour compiler le tampon courant, puis useou requireson espace de noms au REMPL. Ensuite, faites des expériences.

Notes finales:

Soyez prêt à devoir peaufiner les choses pendant un certain temps avant que tout ne clique. De nombreux outils sont impliqués et leurs interactions sont pour la plupart assez fluides, mais pas au point où il serait prudent de supposer que vous n'aurez pas à faire certains ajustements au départ.

Enfin, voici un peu de code que je garde dans .emacslequel vous ne trouverez pas ailleurs (bien qu'il soit basé sur une fonction sympa de Phil Hagelberg). J'alterne entre le démarrage de mes instances swank avec lein swank(l'une des fonctionnalités les plus cool de Leiningen) et l'utilisation de la clojure-projectfonction ci-dessous pour démarrer le tout depuis Emacs. J'ai fait de mon mieux pour que ce dernier produise un environnement correspondant étroitement à celui fourni par lein swank. Oh, et si vous voulez juste une REPL dans Emacs pour une expérience rapide et sale, alors avec la configuration correcte, vous devriez pouvoir l'utiliser M-x slimedirectement.

(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))
Michał Marczyk
la source
2
Merci beaucoup pour la belle rédaction!
user855
3
De rien. J'espère que cela vous mettra sur votre chemin avec Clojure. Bon piratage! :-)
Michał Marczyk
2
ł: Très belle rédaction. Merci.
Ralph
C'est en effet un très bon tutoriel. Je viens de découvrir que la meilleure option est Emacs même si je ne l'aime pas vraiment. IDEA, Eclipse et netbeans ne rentrent tout simplement pas dans l'image.
Adam Arold
8

Le kit de démarrage Emacs a reçu d'excellentes critiques pour démarrer avec Clojure:

Pour ne répondre qu'à la partie chic de votre question:

Leiningen est un moyen très simple de configurer Swank avec le chemin de classe correct et de le connecter à Emacs.

Une superbe vidéo est ici: http://vimeo.com/channels/fulldisclojure#8934942 Voici un exemple de fichier project.clj qui

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

puis exécutez:

lein swank

et d'Emacs:

 alt-x slime-connect
Arthur Ulfeldt
la source
1

CIDER (Clojure Interactive Development Environment) doit être mentionné ici.

Cela couvrira la plupart de ce que vous recherchez. Il comprend:

  • REPL interactif
  • débogage
  • test en cours d'exécution
  • navigation de code
  • recherche de documentation
  • beaucoup plus

En plus de CIDER, il existe d'autres add-ons essentiels et agréables pour le développement de clojure, que je vais essayer de regrouper respectivement (et subjectivement):

Essentiel

  • smartparens - appariement de parenthèses, manipulation, navigation (ou parinfer si vous préférez)

  • clj-refactor –- a quelques fonctionnalités étonnantes, comme l'ajout / la compilation automatique d'espaces de noms (il pourrait être incorporé dans CIDER bientôt)

  • clojure-mode - verrou de police, indentation, navigation

  • entreprise - cadre de saisie semi-automatique (ou choisissez un autre complément automatique)

  • délimiteurs arc-en-ciel - met en évidence / colorise les délimiteurs tels que les parenthèses, les crochets ou les accolades en fonction de leur profondeur

  • flycheck - extension de vérification syntaxique à la volée

  • flycheck-clj-kondo - intégration pour clj-kondo

Raffinements

  • clojure-snippets - raccourcis extensibles par onglets vers des morceaux de code plus longs

  • dumb-jump - aller aux définitions

  • which-key - affiche les raccourcis clavier disponibles dans une fenêtre contextuelle

  • mettre en évidence les parenthèses - mettre en évidence les parenthèses environnantes

  • crux - une collection d'extensions ridiculement utiles pour Emacs

  • comment-dwim-2 - remplacement de la fonction intégrée d'Emacscomment-dwim

General Essentials (pour toutes les langues)

  • magit - porcelaine git à l'intérieur d'Emacs

  • projectile - gestion de projet pour rechercher des fichiers, rechercher, etc.

  • barre - complétion incrémentielle et cadre de rétrécissement de la sélection (ou balayage )

Autres ressources

Si vous recherchez une configuration qui a déjà effectué la plupart / tout ce travail pour vous, quelques options sont:

Micah Elliott
la source