Programmation Fonctionnelle, Emacs

Version & licenses
Creative Commons License

Programmation Fonctionnelle, utiliser Emacs.

Guyslain Naves

Créer un répertoire ProgFonctionnelle/ dans votre espace de travail. Ouvrir avec emacs un nouveau fichier :

emacs ProgFonctionnelle/draft.ml

Vous pouvez maintenant définir des expressions Ocaml dans ce fichier, et les évaluer. Par exemple :

  1. let _ = Printf.printf "Hello world!"

Pour évaluer une expression, le raccourci est (normalement) Ctrl-C Ctrl-E. Lors de l'évaluation de votre première expression, emacs demande (via le minibuffer tout en bas de la fenêtre) quel exécutable utiliser, avec comme défaut ocaml. Laissez tel quel et appuyez sur la touche Entrée. Le résultat de l'évaluation de votre expression s'affichera alors dans un buffer distinct.

Quelques raccourcis pour emacs :

  • Ctrl-X 1 supprime tous les frames d'emacs sauf un.
  • Ctrl-X 2 divise le frame qui a le focus en deux, horizontalement.
  • Ctrl-X 3 divise le frame aussi, mais verticalement.
  • Ctrl-X Ctrl-S sauvegarde le fichier.
  • Ctrl-X Ctrl-C ferme emacs.
  • Ctrl-C Ctrl-E évalue l'expression ocaml sous le curseur.
  • Alt-; pour commenter, décommenter le code sélectionné.
  • il y a des raccourcis pour les copier-coller, mais on ne fait pas de copier-coller quand on programme ! On a le droit de couper-coller par contre, pour réorganiser le code par exemple :
    • Ctrl-W pour couper,
    • Ctrl-Y pour coller.
  • Alt-X permet d'évaluer une commande d'emacs, par exemple column-number-mode, qui permet d'avoir le numéro de colonne du curseur affiché en bas du frame.

Si vous avez installé Ocaml avec Opam, et en installant aussi les paquets tuareg, ocp-indent et/ou merlin, vous devez ajouté le code suivant au fichier .emacs situé dans votre répertoire HOME (créez-le s'il n'existe pas).

  1. ;; Add opam emacs directory to the load-path
  2. (setq opam-share (substring
  3. (shell-command-to-string "opam config var share 2> /dev/null") 0 -1)
  4. )
  5. (setq opam-bin (substring
  6. (shell-command-to-string "opam config var bin 2> /dev/null") 0 -1)
  7. )

  8. (add-to-list 'load-path (concat opam-share "/emacs/site-lisp"))
  9. (add-to-list 'load-path (concat opam-share "/tuareg"))
  10. (add-to-list 'exec-path opam-bin)

  11. ;; Load tuareg
  12. (load "tuareg-site-file")

  13. ;; Load ocp-indent
  14. (require 'ocp-indent)

  15. ;; Load merlin
  16. (require 'merlin)

  17. ;; Start merlin on ocaml files
  18. (add-hook 'tuareg-mode-hook 'merlin-mode t)
  19. (add-hook 'caml-mode-hook 'merlin-mode t)

  20. ;; Enable auto-complete: pour l'autocomplétion (ou bien utiliser company-mode)
  21. (setq merlin-use-auto-complete-mode 't)

  22. ;; Enable company-mode: (l'installer avant)
  23. ;; (with-eval-after-load 'company
  24. ;; (add-to-list 'company-backends 'merlin-company-backend))
  25. ;; (add-hook 'merlin-mode-hook 'company-mode)

  26. ;; Use opam switch to lookup ocamlmerlin binary
  27. (setq merlin-command 'opam)


  28. (custom-set-variables
  29. ;; custom-set-variables was added by Custom.
  30. ;; If you edit it by hand, you could mess it up, so be careful.
  31. ;; Your init file should contain only one such instance.
  32. ;; If there is more than one, they won't work right.
  33. '(column-number-mode t)
  34. '(inhibit-startup-screen t)
  35. '(initial-frame-alist (quote ((fullscreen . maximized))))
  36. '(mouse-wheel-progressive-speed nil)
  37. )

  38. ;;remap C-c C-r to evaluate region in tuareg
  39. (eval-after-load "tuareg" '(progn
  40. (define-key tuareg-mode-map (kbd "C-c C-r") 'tuareg-eval-region)
  41. ))
  42. (define-key merlin-mode-map (kbd "C-c C-r") nil)
  43. (global-set-key (kbd "C-c C-v") nil)
  44. (define-key merlin-mode-map (kbd "C-c C-v") 'merlin-error-check)

Adaptez ce code selon vos besoins. Lorsque emacs est correctement configuré, l'ouverture d'un fichier d'extension .ml ou .mli doit ajouter des catégories tuareg et merlin dans la barre de menu, et le code Ocaml doit être coloré syntaxiquement. Sinon, repérez dans le buffer Warnings d'emacs l'origine du problème.