[opam-devel] Opam 1.2 breaks emacs on the mac sortof
Richard Mortier
mort at cantab.net
Tue Sep 9 10:09:34 BST 2014
On 9 September 2014 03:08, Yaron Minsky <yminsky at janestreet.com> wrote:
> Apologies for the following bits of emacs nonsense.
>
> Sadly, I think that opam 1.2 has broken the emacs configuration that I
> documented here:
>
> https://github.com/realworldocaml/book/wiki/Installation-Instructions#emacs
>
> I'm looking for advice as to how to fix things. It has to do with how
> paths are set up. Emacs for the mac has the annoying property of not
> propagating ordinary shell settings. Instead what I did was this:
>
> ;; -- Tweaks for OS X -------------------------------------
> ;; Tweak for problem on OS X where Emacs.app doesn't run the right
> ;; init scripts when invoking a sub-shell
> (cond
> ((eq window-system 'ns) ; macosx
> ;; Invoke login shells, so that .profile or .bash_profile is read
> (setq shell-command-switch "-lc")))
>
> This caused the .profile to get run again on every incoming shell.
> This has the property of rerunning "eval `opam config env`". That
> used to work because opam would throw its entries on the path when it
> ran. But I believe opam has been changed to not re-add entries when
> they're already there. This means that when you run the shell with
> "-lc", it redumps the entries from /etc/paths on top, thus shadowing
> the opam entries.
the fragment i have in my `~/.emacs`
(https://github.com/mor1/rc-files/blob/master/emacs.d/init.el) that
attempts to deal with this is:
```
;; <http://stackoverflow.com/questions/8606954/
;; path-and-exec-path-set-but-emacs-does-not-find-executable>
(defun set-exec-path-from-shell-PATH ()
"Set up Emacs' `exec-path' and PATH environment variable to
match that used by the user's shell.
This is particularly useful under Mac OSX, where GUI apps are not
started from a shell."
(interactive)
(let ((path-from-shell
(replace-regexp-in-string
"[ \t\n]*$" ""
(shell-command-to-string "$SHELL --login -i -c 'echo $PATH'"))
))
(setenv "PATH" path-from-shell)
(setq exec-path (split-string path-from-shell path-separator)))
)
(set-exec-path-from-shell-PATH)
```
ie., extract $PATH from a shell and then set various emacs variables
accordingly. but it's hardly pleasant.
> We could change opam 1.2 so that instead of not adding entries when
> they're already there, it instead deletes the old version of the entry
> and re-adds it to the top. Or we could come up with a more principled
> emacs-on-the-mac setup, but I can't quite figure out a good way of
> doing that.
well, encouraging emacs on the mac to propagate shell settings
properly would do it for me ;)
failing that, i like the idea of opam deleting old instances of PATH
mods and then re-adding at the front. that seems the least surprising
and tidiest option.
(probably not much help for the rwo documentation, but fwiw i got
bored of shell environment confusion a while back and wrote some shell
functions to help me keep things clean and attempt to make shell
initialisation largely idempotent; i basically never now have lines of
the form VAR=value:$VAR in any of my startup scripts.
https://github.com/mor1/rc-files/blob/master/envfns.sh
https://github.com/mor1/rc-files/blob/master/environment
)
--
Richard Mortier
mort at cantab.net
More information about the opam-devel
mailing list