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
inheritenv
macro. - Users can modify commands like
shell-command-to-string
using theinheritenv-add-advice
macro.
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