Unify Reason and OCaml config file
This commit is contained in:
parent
a9bfdff5b0
commit
7add6ed688
3 changed files with 26 additions and 141 deletions
2
init.el
2
init.el
|
|
@ -77,7 +77,7 @@
|
||||||
(load "$HOME/.emacs.d/languages/clang.el" 'f 't)
|
(load "$HOME/.emacs.d/languages/clang.el" 'f 't)
|
||||||
(load "$HOME/.emacs.d/languages/clojure.el" 'f 't)
|
(load "$HOME/.emacs.d/languages/clojure.el" 'f 't)
|
||||||
(load "$HOME/.emacs.d/languages/kotlin.el" 'f 't)
|
(load "$HOME/.emacs.d/languages/kotlin.el" 'f 't)
|
||||||
(load "$HOME/.emacs.d/languages/reason.el" 'f 't)
|
(load "$HOME/.emacs.d/languages/ocaml.el" 'f 't)
|
||||||
(load "$HOME/.emacs.d/languages/markdown.el" 'f 't)
|
(load "$HOME/.emacs.d/languages/markdown.el" 'f 't)
|
||||||
;; (load "$HOME/.emacs.d/languages/haskell.el" 'f 't)
|
;; (load "$HOME/.emacs.d/languages/haskell.el" 'f 't)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,126 +1,32 @@
|
||||||
;; ## added by OPAM user-setup for emacs / base ## cfd3c9b7837c85cffd0c59de521990f0 ## you can edit, but keep this line
|
|
||||||
(provide 'opam-user-setup)
|
|
||||||
|
|
||||||
(use-package tuareg
|
(use-package tuareg
|
||||||
|
:defer t
|
||||||
|
:ensure t
|
||||||
|
:config
|
||||||
|
(add-hook 'tuareg-mode-hook 'merlin-mode)
|
||||||
|
)
|
||||||
|
|
||||||
|
(use-package merlin
|
||||||
:defer t
|
:defer t
|
||||||
:ensure t)
|
:ensure t)
|
||||||
|
|
||||||
;; Base configuration for OPAM
|
(use-package reason-mode
|
||||||
|
:defer t
|
||||||
|
:ensure t
|
||||||
|
:config (setq refmt-command 'opam))
|
||||||
|
|
||||||
(defun opam-shell-command-to-string (command)
|
(let ((opam-share (ignore-errors (car (process-lines "opam" "config" "var" "share")))))
|
||||||
"Similar to shell-command-to-string, but returns nil unless the process
|
(when (and opam-share (file-directory-p opam-share))
|
||||||
returned 0, and ignores stderr (shell-command-to-string ignores return value)"
|
;; Register Merlin
|
||||||
(let* ((return-value 0)
|
(add-to-list 'load-path (expand-file-name "emacs/site-lisp" opam-share))
|
||||||
(return-string
|
(autoload 'merlin-mode "merlin" nil t nil)
|
||||||
(with-output-to-string
|
;; Use opam switch to lookup ocamlmerlin binary
|
||||||
(setq return-value
|
(setq merlin-command 'opam)))
|
||||||
(with-current-buffer standard-output
|
|
||||||
(process-file shell-file-name nil '(t nil) nil
|
|
||||||
shell-command-switch command))))))
|
|
||||||
(if (= return-value 0) return-string nil)))
|
|
||||||
|
|
||||||
(defun opam-update-env (switch)
|
;; OCaml setup
|
||||||
"Update the environment to follow current OPAM switch configuration"
|
(add-hook 'tuareg-mode-hook 'merlin-mode)
|
||||||
(interactive
|
|
||||||
(list
|
|
||||||
(let ((default
|
|
||||||
(car (split-string (opam-shell-command-to-string "opam switch show --safe")))))
|
|
||||||
(completing-read
|
|
||||||
(concat "opam switch (" default "): ")
|
|
||||||
(split-string (opam-shell-command-to-string "opam switch list -s --safe") "\n")
|
|
||||||
nil t nil nil default))))
|
|
||||||
(let* ((switch-arg (if (= 0 (length switch)) "" (concat "--switch " switch)))
|
|
||||||
(command (concat "opam config env --safe --sexp " switch-arg))
|
|
||||||
(env (opam-shell-command-to-string command)))
|
|
||||||
(when (and env (not (string= env "")))
|
|
||||||
(dolist (var (car (read-from-string env)))
|
|
||||||
(setenv (car var) (cadr var))
|
|
||||||
(when (string= (car var) "PATH")
|
|
||||||
(setq exec-path (split-string (cadr var) path-separator)))))))
|
|
||||||
|
|
||||||
(opam-update-env nil)
|
;; Reason setup
|
||||||
|
(add-hook 'reason-mode-hook
|
||||||
(defvar opam-share
|
|
||||||
(let ((reply (opam-shell-command-to-string "opam config var share --safe")))
|
|
||||||
(when reply (substring reply 0 -1))))
|
|
||||||
|
|
||||||
(add-to-list 'load-path (concat opam-share "/emacs/site-lisp"))
|
|
||||||
;; OPAM-installed tools automated detection and initialisation
|
|
||||||
|
|
||||||
(defun opam-setup-tuareg ()
|
|
||||||
(add-to-list 'load-path (concat opam-share "/tuareg") t)
|
|
||||||
(load "tuareg-site-file"))
|
|
||||||
|
|
||||||
(defun opam-setup-add-ocaml-hook (h)
|
|
||||||
(add-hook 'tuareg-mode-hook h t)
|
|
||||||
(add-hook 'caml-mode-hook h t))
|
|
||||||
|
|
||||||
(defun opam-setup-complete ()
|
|
||||||
(if (require 'company nil t)
|
|
||||||
(opam-setup-add-ocaml-hook
|
|
||||||
(lambda ()
|
(lambda ()
|
||||||
(company-mode)
|
(add-hook 'before-save-hook #'refmt-before-save)))
|
||||||
(defalias 'auto-complete 'company-complete)))
|
(add-hook 'reason-mode-hook 'merlin-mode)
|
||||||
(require 'auto-complete nil t)))
|
|
||||||
|
|
||||||
(defun opam-setup-ocp-indent ()
|
|
||||||
(opam-setup-complete)
|
|
||||||
(autoload 'ocp-setup-indent "ocp-indent" "Improved indentation for Tuareg mode")
|
|
||||||
(autoload 'ocp-indent-caml-mode-setup "ocp-indent" "Improved indentation for Caml mode")
|
|
||||||
(add-hook 'tuareg-mode-hook 'ocp-setup-indent t)
|
|
||||||
(add-hook 'caml-mode-hook 'ocp-indent-caml-mode-setup t))
|
|
||||||
|
|
||||||
(defun opam-setup-ocp-index ()
|
|
||||||
(autoload 'ocp-index-mode "ocp-index" "OCaml code browsing, documentation and completion based on build artefacts")
|
|
||||||
(opam-setup-add-ocaml-hook 'ocp-index-mode))
|
|
||||||
|
|
||||||
(defun opam-setup-merlin ()
|
|
||||||
(opam-setup-complete)
|
|
||||||
(require 'merlin)
|
|
||||||
(opam-setup-add-ocaml-hook 'merlin-mode)
|
|
||||||
|
|
||||||
(defcustom ocp-index-use-auto-complete nil
|
|
||||||
"Use auto-complete with ocp-index (disabled by default by opam-user-setup because merlin is in use)"
|
|
||||||
:group 'ocp_index)
|
|
||||||
(defcustom merlin-ac-setup 'easy
|
|
||||||
"Use auto-complete with merlin (enabled by default by opam-user-setup)"
|
|
||||||
:group 'merlin-ac)
|
|
||||||
|
|
||||||
;; So you can do it on a mac, where `C-<up>` and `C-<down>` are used
|
|
||||||
;; by spaces.
|
|
||||||
(define-key merlin-mode-map
|
|
||||||
(kbd "C-c <up>") 'merlin-type-enclosing-go-up)
|
|
||||||
(define-key merlin-mode-map
|
|
||||||
(kbd "C-c <down>") 'merlin-type-enclosing-go-down)
|
|
||||||
(set-face-background 'merlin-type-face "skyblue"))
|
|
||||||
|
|
||||||
(defun opam-setup-utop ()
|
|
||||||
(autoload 'utop "utop" "Toplevel for OCaml" t)
|
|
||||||
(autoload 'utop-minor-mode "utop" "Minor mode for utop" t)
|
|
||||||
(add-hook 'tuareg-mode-hook 'utop-minor-mode))
|
|
||||||
|
|
||||||
(defvar opam-tools
|
|
||||||
'(("tuareg" . opam-setup-tuareg)
|
|
||||||
("ocp-indent" . opam-setup-ocp-indent)
|
|
||||||
("ocp-index" . opam-setup-ocp-index)
|
|
||||||
("merlin" . opam-setup-merlin)
|
|
||||||
("utop" . opam-setup-utop)))
|
|
||||||
|
|
||||||
(defun opam-detect-installed-tools ()
|
|
||||||
(let*
|
|
||||||
((command "opam list --installed --short --safe --color=never")
|
|
||||||
(names (mapcar 'car opam-tools))
|
|
||||||
(command-string (mapconcat 'identity (cons command names) " "))
|
|
||||||
(reply (opam-shell-command-to-string command-string)))
|
|
||||||
(when reply (split-string reply))))
|
|
||||||
|
|
||||||
(defvar opam-tools-installed (opam-detect-installed-tools))
|
|
||||||
|
|
||||||
(defun opam-auto-tools-setup ()
|
|
||||||
(interactive)
|
|
||||||
(dolist (tool opam-tools)
|
|
||||||
(when (member (car tool) opam-tools-installed)
|
|
||||||
(funcall (symbol-function (cdr tool))))))
|
|
||||||
|
|
||||||
(opam-auto-tools-setup)
|
|
||||||
;; ## end of OPAM user-setup addition for emacs / base ## keep this line
|
|
||||||
|
|
|
||||||
|
|
@ -1,21 +0,0 @@
|
||||||
(use-package merlin
|
|
||||||
:defer t
|
|
||||||
:ensure t)
|
|
||||||
|
|
||||||
(use-package reason-mode
|
|
||||||
:defer t
|
|
||||||
:ensure t
|
|
||||||
:config (setq refmt-command 'opam))
|
|
||||||
|
|
||||||
(let ((opam-share (ignore-errors (car (process-lines "opam" "config" "var" "share")))))
|
|
||||||
(when (and opam-share (file-directory-p opam-share))
|
|
||||||
;; Register Merlin
|
|
||||||
(add-to-list 'load-path (expand-file-name "emacs/site-lisp" opam-share))
|
|
||||||
(autoload 'merlin-mode "merlin" nil t nil)
|
|
||||||
;; Use opam switch to lookup ocamlmerlin binary
|
|
||||||
(setq merlin-command 'opam)))
|
|
||||||
|
|
||||||
(add-hook 'reason-mode-hook
|
|
||||||
(lambda ()
|
|
||||||
(add-hook 'before-save-hook #'refmt-before-save)))
|
|
||||||
(add-hook 'reason-mode-hook 'merlin-mode)
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue