git-subtree-dir: users/wpcarro git-subtree-mainline:464bbcb15cgit-subtree-split:24f5a642afChange-Id: I6105b3762b79126b3488359c95978cadb3efa789
		
			
				
	
	
		
			145 lines
		
	
	
	
		
			6 KiB
		
	
	
	
		
			EmacsLisp
		
	
	
	
	
	
			
		
		
	
	
			145 lines
		
	
	
	
		
			6 KiB
		
	
	
	
		
			EmacsLisp
		
	
	
	
	
	
;; ## added by OPAM user-setup for emacs / base ## cfd3c9b7837c85cffd0c59de521990f0 ## you can edit, but keep this line
 | 
						|
(provide 'opam-user-setup)
 | 
						|
 | 
						|
;; Base configuration for OPAM
 | 
						|
 | 
						|
(defun opam-shell-command-to-string (command)
 | 
						|
  "Similar to shell-command-to-string, but returns nil unless the process
 | 
						|
  returned 0, and ignores stderr (shell-command-to-string ignores return value)"
 | 
						|
  (let* ((return-value 0)
 | 
						|
         (return-string
 | 
						|
          (with-output-to-string
 | 
						|
            (setq return-value
 | 
						|
                  (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)
 | 
						|
  "Update the environment to follow current OPAM switch configuration"
 | 
						|
  (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)
 | 
						|
 | 
						|
(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 ()
 | 
						|
         (company-mode)
 | 
						|
         (defalias 'auto-complete 'company-complete)))
 | 
						|
    (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
 | 
						|
;; ## added by OPAM user-setup for emacs / tuareg ## b10f42abebd2259b784b70d1a7f7e426 ## you can edit, but keep this line
 | 
						|
;; Set to autoload tuareg from its original switch when not found in current
 | 
						|
;; switch (don't load tuareg-site-file as it adds unwanted load-paths)
 | 
						|
(defun opam-tuareg-autoload (fct file doc args)
 | 
						|
  (let ((load-path (cons "/home/wpcarro/.opam/default/share/emacs/site-lisp" load-path)))
 | 
						|
    (load file))
 | 
						|
  (apply fct args))
 | 
						|
(when (not (member "tuareg" opam-tools-installed))
 | 
						|
  (defun tuareg-mode (&rest args)
 | 
						|
    (opam-tuareg-autoload 'tuareg-mode "tuareg" "Major mode for editing OCaml code" args))
 | 
						|
  (defun tuareg-run-ocaml (&rest args)
 | 
						|
    (opam-tuareg-autoload 'tuareg-run-ocaml "tuareg" "Run an OCaml toplevel process" args))
 | 
						|
  (defun ocamldebug (&rest args)
 | 
						|
    (opam-tuareg-autoload 'ocamldebug "ocamldebug" "Run the OCaml debugger" args))
 | 
						|
  (defalias 'run-ocaml 'tuareg-run-ocaml)
 | 
						|
  (defalias 'camldebug 'ocamldebug)
 | 
						|
  (add-to-list 'auto-mode-alist '("\\.ml[iylp]?\\'" . tuareg-mode))
 | 
						|
  (add-to-list 'auto-mode-alist '("\\.eliomi?\\'" . tuareg-mode))
 | 
						|
  (add-to-list 'interpreter-mode-alist '("ocamlrun" . tuareg-mode))
 | 
						|
  (add-to-list 'interpreter-mode-alist '("ocaml" . tuareg-mode))
 | 
						|
  (dolist (ext '(".cmo" ".cmx" ".cma" ".cmxa" ".cmxs" ".cmt" ".cmti" ".cmi" ".annot"))
 | 
						|
    (add-to-list 'completion-ignored-extensions ext)))
 | 
						|
;; ## end of OPAM user-setup addition for emacs / tuareg ## keep this line
 |