Environment variables in Emacs can be set buffer-locally, like many
Emacs preferences, and this allows users to have different buffer-local
paths for executables in different projects, specified by a
.dir-locals.el file or via a direnv integration like
envrc.
However, there's a fairly common pitfall when Emacs libraries run background processes on behalf of a user: many such libraries run processes in temporary buffers that do not inherit the calling buffer's environment if it is set buffer-locally. This can result in executables not being found, or the wrong versions of executables being picked up.
An example is the Emacs built-in command
shell-command-to-string. Whatever buffer-local process-environment
(or exec-path) the user has set, that command will always use the
Emacs-wide default. This is specified behaviour, but not expected
or helpful.
inheritenv provides a couple of tools for dealing with this
issue:
- Library authors can wrap code that plans to execute processes in
temporary buffers with the
inheritenvmacro. - Users can modify commands like
shell-command-to-stringusing theinheritenv-add-advicemacro.
Ensure inheritenv.el is in a directory on your load-path, and add
the following to your ~/.emacs or ~/.emacs.d/init.el:
(require 'inheritenv)If you're an Emacs 24 user or you have a recent version of
package.el you can install inheritenv from the
MELPA repository. The version of
inheritenv there will always be up-to-date.
Author: Steve Purcell
Homepage: https://github.com/purcell/inheritenv