• Stars
    star
    1,325
  • Rank 35,471 (Top 0.7 %)
  • Language
    Emacs Lisp
  • License
    Other
  • Created about 12 years ago
  • Updated over 1 year ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Make Emacs use the $PATH set up by the user's shell

Melpa Status Melpa Stable Status Build Status Support me

exec-path-from-shell

A GNU Emacs library to ensure environment variables inside Emacs look the same as in the user's shell.

Motivation

Ever find that a command works in your shell, but not in Emacs?

This happens a lot on OS X, where an Emacs instance launched as a GUI app inherits a default minimal set of environment variables that are probably not the ones you see in a terminal window. Similarly, if you start Emacs as a daemon from systemd or launchd, it will run with a default set of environment variables.

This library solves this problem by copying important environment variables from the user's shell: it works by asking your shell to print out the variables of interest, then copying them into the Emacs environment.

Compatibility

If the path printed by evaluating (getenv "SHELL") in Emacs points at bash or zsh, this should work fine.

At a minimum, this package assumes that your shell is at least UNIX-y: if (getenv "SHELL") evaluates to something like ".../cmdproxy.exe", this package probably isn't for you.

Further, if you use a non-POSIX-standard shell such as tcsh or fish, your shell will be asked to execute sh as a subshell in order to print out the variables in a format which can be reliably parsed. sh must be a POSIX-compliant shell in this case.

Note that shell variables which have not been exported as environment variables (e.g. using the "export" keyword) may not be visible to `exec-path-from-shell'.

Installation

Installable packages are available via MELPA: do M-x package-install RET exec-path-from-shell RET.

Alternatively, download the latest release or clone the repository, and install exec-path-from-shell.el with M-x package-install-file.

Usage

Add the following to your init.el (after calling package-initialize):

(when (memq window-system '(mac ns x))
  (exec-path-from-shell-initialize))

This sets $MANPATH, $PATH and exec-path from your shell, but only when executed in a GUI frame on OS X and Linux.

If you launch Emacs as a daemon from systemd or similar, you might like to use the following snippet:

(when (daemonp)
  (exec-path-from-shell-initialize))

You can copy values of other environment variables by customizing exec-path-from-shell-variables before invoking exec-path-from-shell-initialize, or by calling exec-path-from-shell-copy-env, e.g.:

(exec-path-from-shell-copy-env "PYTHONPATH")

This function may also be called interactively.

The author uses the following configuration snippet before calling exec-path-from-shell-initialize:

(dolist (var '("SSH_AUTH_SOCK" "SSH_AGENT_PID" "GPG_AGENT_INFO" "LANG" "LC_CTYPE" "NIX_SSL_CERT_FILE" "NIX_PATH"))
  (add-to-list 'exec-path-from-shell-variables var))

Setting up your shell startup files correctly

Note that your shell will inherit Emacs's environment variables when it is run by exec-path-from-shell -- to avoid surprises your config files should therefore set the environment variables to their exact desired final values, i.e. don't do this:

export PATH=/usr/local/bin:$PATH

but instead do this:

export PATH=/usr/local/bin:/usr/bin:/bin

To be safe, exec-path-from-shell starts an interactive (and login) shell by default, but this can be much slower than necessary. Interactive shells often have fancy features enabled that are only helpful when one interacts directly with the shell, and this can frequently cause startup time to exceed 750ms. This can be avoided:

  • Follow best practice by setting your environment variables so that they are available to both interactive and non-interactive shells. In practical terms, for most people this means setting them in ~/.profile, ~/.bash_profile, ~/.zshenv instead of ~/.bashrc and ~/.zshrc.
  • Once a non-interactive shell sets your environment variables correctly, adjust exec-path-from-shell-arguments appropriately (often to nil) before calling exec-path-from-shell-initialize so that it will start a non-interactive shell.

To learn more about how popular shells load start-up files, read this helpful article.

Making exec-path-from-shell faster

If evaluation takes more than exec-path-from-shell-warn-duration-millis (500ms by default) then exec-path-from-shell will print a warning.

  • Non-interactive shells start up faster. Follow the steps in the section above so that you can run your shell without -i and still get the right environment variable settings. When "-i" is then removed from exec-path-from-shell-arguments, this package becomes more efficient.
  • Invoking the shell has a non-trivial overhead in any case. Don't call exec-path-from-shell-copy-env repeatedly, since each invocation starts a shell. Instead, set exec-path-from-shell-variables to the full list of vars you want, and call exec-path-from-shell-initialize once.

Further help

  • C-h f exec-path-from-shell-initialize
  • C-h f exec-path-from-shell-copy-env

💝 Support this project and my other Open Source work via Patreon

💼 LinkedIn profile

sanityinc.com

🐦 @sanityinc

More Repositories

1

emacs.d

An Emacs configuration bundle with batteries included
Emacs Lisp
6,646
star
2

sqlint

Simple SQL linter supporting ANSI and PostgreSQL syntaxes
Ruby
404
star
3

color-theme-sanityinc-tomorrow

A set of comprehensive Emacs color themes based on Chris Kempson's 'tomorrow' themes
Emacs Lisp
392
star
4

envrc

Emacs support for direnv which operates buffer-locally
Emacs Lisp
252
star
5

page-break-lines

Emacs: display ugly ^L page breaks as tidy horizontal lines
Emacs Lisp
222
star
6

emacs-reformatter

Define commands which run reformatters on the current Emacs buffer
Emacs Lisp
213
star
7

package-lint

A linting library for elisp package metadata
Emacs Lisp
191
star
8

nix-emacs-ci

Emacs installations for continuous integration
Nix
166
star
9

ibuffer-vc

Let Emacs' ibuffer-mode group files by git project etc., and show file state
Emacs Lisp
163
star
10

elisp-slime-nav

Slime-style navigation of Emacs Lisp source with M-. & M-,
Emacs Lisp
148
star
11

whitespace-cleanup-mode

In Emacs, intelligently call whitespace-cleanup on save
Emacs Lisp
118
star
12

setup-emacs

Github action which installs a given Emacs version
Shell
117
star
13

diredfl

Extra Emacs font lock rules for a more colourful dired
Emacs Lisp
115
star
14

ac-slime

Emacs auto-complete plugin for Slime symbols
Emacs Lisp
109
star
15

whole-line-or-region

In Emacs, operate on current line if no region is active
Emacs Lisp
106
star
16

less-css-mode

Emacs mode for LESS CSS (lesscss.org), with support for compile-on-save
Emacs Lisp
101
star
17

disable-mouse

Disable the mouse in Emacs
Emacs Lisp
100
star
18

darcs-to-git

Convert/mirror darcs repos into git repos
Ruby
96
star
19

airspeed

A lightweight Python template engine compatible with Velocity, used in OpenStack
Python
86
star
20

color-theme-sanityinc-solarized

A pair of Emacs color themes based on Ethan Schoonover's 'solarized' theme
Emacs Lisp
80
star
21

default-text-scale

Easily adjust the font size in all Emacs frames
Emacs Lisp
73
star
22

unfill

Functions providing the inverse of Emacs' fill-paragraph and fill-region
Emacs Lisp
72
star
23

jargs

GNU getopt-style command-line argument parser for Java, used in JBoss
Java
64
star
24

ibuffer-projectile

Group buffers in Emacs ibuffer-mode by their projectile root directory
Emacs Lisp
63
star
25

rails-runit

Run Rails reliably as runit services
Shell
43
star
26

paredit-everywhere

Enable some paredit features in non-lisp buffers
Emacs Lisp
38
star
27

flycheck-package

Flycheck checker for elisp package metadata
Emacs Lisp
38
star
28

postgresql-migrations

Simple Schema Migrations for PostgreSQL
PLpgSQL
36
star
29

flymake-easy

Helpers for easily building Emacs flymake checkers
Emacs Lisp
35
star
30

inheritenv

Make emacs temp buffers inherit buffer-local environment variables
Emacs Lisp
35
star
31

emacs-shfmt

Reformat shell script code in Emacs using shfmt
Emacs Lisp
33
star
32

flymake-flycheck

Use any Emacs flycheck checker as a flymake backend
Emacs Lisp
32
star
33

flymake-python-pyflakes

Emacs flymake handler for python using pyflakes
Emacs Lisp
29
star
34

flycheck-ledger

A flychecker for checking ledger files
Emacs Lisp
28
star
35

flymake-ruby

Emacs flymake handler for ruby-mode
Emacs Lisp
24
star
36

ns-auto-titlebar

In Emacs, set the MacOS transparent titlebar to match the current theme
Emacs Lisp
23
star
37

ruby-hash-syntax

In Emacs, toggle ruby hash syntax between classic and 1.9 styles
Emacs Lisp
22
star
38

windswap

Like Emacs's "windmove.el", but swaps buffers while moving
Emacs Lisp
20
star
39

osx-location

Make Emacs watch and respond to changes in geographical location on OS X
Emacs Lisp
19
star
40

flymake-jslint

Emacs flymake syntax-checker for javascript using jslint
Emacs Lisp
18
star
41

flymake-coffee

Emacs flymake handler for CoffeeScript
Emacs Lisp
15
star
42

flymake-php

Emacs flymake syntax-checker for php files
Emacs Lisp
15
star
43

mode-line-bell

Flash the Emacs mode line instead of ringing the bell
Emacs Lisp
15
star
44

adventofcode2016

Advent of Code 2016, in Haskell
Haskell
15
star
45

list-unicode-display

Search for and list unicode characters in Emacs
Emacs Lisp
15
star
46

ac-haskell-process

Haskell completion source for Emacs auto-complete package
Emacs Lisp
15
star
47

servant-elm

WIP: Generate Elm modules which talk to Haskell Servant APIs
Haskell
14
star
48

cl-libify

Update elisp code to use cl-lib instead of cl
Emacs Lisp
12
star
49

flymake-json

Emacs flymake handler for json using jsonlint
Emacs Lisp
11
star
50

emacs-nixpkgs-fmt

Reformat Nix code with nixpkgs-fmt in Emacs
Emacs Lisp
10
star
51

ac-inf-ruby

An Emacs auto-complete source for use in inf-ruby sessions
Emacs Lisp
10
star
52

flymake-shell

Emacs flymake syntax-checker for shell scripts
Emacs Lisp
9
star
53

rosettacode-clojure

My Clojure contributions to Rosettacode
Clojure
8
star
54

skewer-less

Live LESS stylesheet updates from Emacs via skewer-mode
Emacs Lisp
8
star
55

flycheck-relint

Flycheck integration for `relint`, which checks regexps in emacs lisp
Emacs Lisp
7
star
56

flymake-sass

Emacs flymake syntax-checker for sass stylesheets
Emacs Lisp
7
star
57

icfpc2017

2017 ICFP Contest - The Flux Ambassadors
Haskell
7
star
58

elm-life

Conway's Game of Life in Elm
Elm
7
star
59

ivy-smex

Use Ivy completion with Smex command matching
Emacs Lisp
6
star
60

hippie-expand-slime

Plug slime completion into Emacs' "hippie-expand"
Emacs Lisp
6
star
61

git-timemachine

Step through historic versions of git controlled file using everyone's favourite editor
Emacs Lisp
6
star
62

icfpc2015

My solo entry for the 2015 ICFP Contest - http://2015.icfpcontest.org/
Haskell
6
star
63

lively

Live-evaluated emacs lisp snippets
Emacs Lisp
6
star
64

dbdoc

Generate javadoc-style html documentation for a database schema
Python
6
star
65

adventofcode2017

Advent of Code 2017 in Haskell
Haskell
5
star
66

flymake-css

Emacs flymake syntax-checker for css using csslint
Emacs Lisp
5
star
67

company-cmake

Completion back-end for CMake
Emacs Lisp
5
star
68

wordchainsrevenge

Another run at the WordChains kata in haskell
Haskell
4
star
69

with-temp-postgres

Temporarily run postgres against a pre-existing data directory while you run a command
Shell
4
star
70

icfpc2018

2018 ICFP Contest
Haskell
4
star
71

elpa-audit

Handy functions for inspecting and comparing Emas package archives
Emacs Lisp
4
star
72

flymake-haskell-multi

Syntax-check haskell source in Emacs using both ghc and hlint
Emacs Lisp
4
star
73

adventofcode2018

Advent of Code 2018, in Haskell again because yay Haskell
Haskell
4
star
74

flymake-haml

Emacs flymake handler for haml and sass files
Emacs Lisp
4
star
75

redis-memo

Memoize clojure functions using redis as an out-of-process store for cached results
Clojure
4
star
76

dotr

Ruby wrapper for the 'dot' utility from graphviz
Ruby
3
star
77

dot-hammerspoon

My hammerspoon configuration
Lua
3
star
78

haskell-anagrams

A Haskell anagram generator, written for West London Hack Night
Haskell
3
star
79

emacs-docker

WIP: Tools for building docker images that contain emacs versions
Makefile
3
star
80

db_console

Defunct Rails plugin (now merged into Rails as script/dbconsole)
Ruby
3
star
81

gemdocindex

Generate an HTML index of your ruby gem rdocs, like a static 'gem --server'
3
star
82

color-theme-sanityinc

Two pleasant medium-contrast Emacs color themes in light and dark flavours
Emacs Lisp
3
star
83

codejam2016

Haskell solutions for qualification round of codejam 2016
Haskell
3
star
84

netstubs

Stub http and smtp servers, written in Python
Python
3
star
85

mockr

Tiny Ruby mock object library inspired by JMock
Ruby
2
star
86

fleeceminer

A toy crypto miner in ruby
Ruby
2
star
87

purcell

GitHub metadata
2
star
88

flymake-less

Emacs flymake handler for LESS stylesheets
Emacs Lisp
2
star
89

replit-j

Repl.it support for jlang
Nix
2
star
90

jquery.placeholder

Shows ghost text in empty input boxes, suggesting what the user should enter.
JavaScript
2
star
91

vm5294

"5294" Virtual Machine
Haskell
2
star
92

maintenance_server

Rails plugin providing a fallback server for mongrel
Ruby
2
star
93

farsync

A toy rsync-like tool written in ruby
Ruby
2
star
94

markov-chains-hs

A toy Markov Chain text generator in Haskell
Haskell
2
star
95

rsshole

Fetch a bunch of RSS feeds and classify new items (WIP)
Haskell
2
star
96

flymake-hlint

Emacs flymake handler for checking Haskell source code with hlint
Emacs Lisp
2
star
97

adventofcode2020

Advent of Code 2020, in J
J
2
star
98

purescript-life

WIP: purescript port of my Elm version of Conway's Game of Life (https://github.com/purcell/elm-life)
PureScript
2
star
99

adventofcodeteam

A team effort to solve all the Advent of Code challenges with Haskell in 2 days
Haskell
2
star
100

renumber_migrations

Rails plugin for renumbering clashing migrations in a project kept in svn
Ruby
2
star