[opam-devel] [Caml-list] Setting up OPAM in emacs

Anil Madhavapeddy anil at recoil.org
Sat Jun 15 16:14:35 BST 2013

I don't use Emacs, but OPAM has several global command-line options that
may make your OS^H^Heditor integration easier.

* --root will set the home directory of OPAM (~/.opam by default)

* --switch will explicitly run the command under a compiler switch that
  isn't the default one, but without performing a global switch.

* "opam config exec" will run the sub-command with the right environment
  variables set to the selected switch.  So:

    $ opam config exec "ocamlc -version"

  will get the version of the current OPAM switch ocaml, irrespective
  of your PATH settings. (This is what Leo is doing for his interactive
  shell below, but I'm not sure how this interacts with the rest of 

I would appreciate an Emacs user summarising best practises here and
letting me know so that I can include a short summary in Real World OCaml.


On 15 Jun 2013, at 13:07, Gabriel Scherer <gabriel.scherer at gmail.com> wrote:

> I don't (want to) understand the details of why opam switches don't
> work well with Emacs right now, or of any of the proposed solutions.
> Is there a solution integrated in OPAM by now? If not, is there a
> consensus on what simple users like me should use to solve the
> problem? Could you (the thread participants) decide on something, and
> send that to the OPAM upstream, so that future versions solve this
> issue?
> (The immediate problem I observe is that compile-command does not use
> the OCaml versions I would expect it to, in general defaulting to my
> system OCaml -- that may depend on the way Emacs is launched. More
> sophisticated things such as being able to call "opam switch" from
> inside Emacs are probably secondary needs, and I would be fine with a
> basic integration not supporting that, and letting people hone their
> emacs-lisp skills for that.)
> On Tue, Jun 4, 2013 at 4:55 PM, Leo White <lpw25 at cam.ac.uk> wrote:
>> My personal solution for Tuareg mode is to put:
>>  ;; Use OPAM's ocaml
>>  (setq tuareg-interactive-program "opam config exec ocaml")
>> in my .emacs.
>> Regards,
>> Leo
>> Wojciech Meyer <wojciech.meyer at gmail.com> writes:
>>> Christophe's function hook is probably much better and elegant solution,
>>> but this works for me:
>>> (defun dm-opam-switch-root (ocaml-version opam-root)
>>>  (interactive "sOCaml version: \nsOPAM root: ")
>>>  (let* ((path (if (string-match "\\.opam" (car exec-path)) (cdr exec-path) exec-path))
>>>         (entry
>>>          (replace-regexp-in-string
>>>           "\n" ""
>>>           (shell-command-to-string
>>>            (format "opam switch --root %s %s > /dev/null && opam config env | sed -n 's/^PATH=\\([^:]\\+\\):.*$/\\1/p'" opam-root ocaml-version))))
>>>         (env-path (replace-regexp-in-string "\n" "" (shell-command-to-string (format "opam config env --root %s | sed -n 's/^PATH=\\(.*\\)/\\1/p'" opam-root)))))
>>>    (setq exec-path (cons entry path))
>>>    (setenv "PATH" env-path)))
>>> (defun dm-opam-switch (ocaml-version)
>>>  (interactive "sOCaml version: ")
>>>  (dm-opam-switch-root ocaml-version "~/.opam"))
>>> <<
>>> I wouldn't say myself it's a perfect script, but it works. Note that I
>>> use a lot of shell trickery instead of Emacs buffers, which is probably
>>> not a good idea.
>>> You just say M-x dm-opam-switch, and indicate which version you would
>>> like.
>>> Best,
>>> Wojciech
>>> Christophe TROESTLER <Christophe.Troestler at umons.ac.be> writes:
>>>> On Tue, 28 May 2013 09:59:53 +0400, Ivan Gotovchits wrote:
>>>>> 2. Use «eval `opam env config`» in the begining of a compile-command.
>>>>>   This works fine when you switch compiler, but other commands, such as
>>>>>   «C-c C-s» doesn't use new environment.
>>>> I use this for the compilation:
>>>>    ;; OPAM compilation — one must update to the current compiler
>>>>    ;; before launching the compilation.
>>>>    (defadvice compile (before compile-opam activate)
>>>>      "Run opam to update environment variables"
>>>>      (set (make-local-variable 'compilation-environment)
>>>>        (with-temp-buffer
>>>>          (ignore-errors (call-process "opam" nil t nil "config" "-env"))
>>>>          (goto-char (point-min))
>>>>          (while (re-search-forward "; *export.*$" nil t)
>>>>            (replace-match "" nil nil))
>>>>          (split-string (buffer-substring 1 (point-max)))
>>>>          )))
>>>> For the toplevel, I am afraid one needs to restart it.  I guess a
>>>> similar trick is possible to automatically select the right one.
>>>> Hope it helps,
>>>> C.
>> --
>> Caml-list mailing list.  Subscription management and archives:
>> https://sympa.inria.fr/sympa/arc/caml-list
>> Beginner's list: http://groups.yahoo.com/group/ocaml_beginners
>> Bug reports: http://caml.inria.fr/bin/caml-bugs
> _______________________________________________
> opam-devel mailing list
> opam-devel at lists.ocaml.org
> http://lists.ocaml.org/listinfo/opam-devel

More information about the opam-devel mailing list