Emacs: Environment Variables in Emacs

By Xah Lee. Date: . Last updated: .

This page shows you how to set environment variables in emacs, especially if you have problems in Windows emacs of getting linux commands to run.

where emacs gets environment variable

Windows

Mac

Linux

Set Environment Variable within Emacs

You can set environment variables within emacs.

This lets emacs to have environment variables independent of the operating system.

Here's the elisp code to set environment variable within emacs only:

;; set env var PATH, by appending a new path to existing PATH value
(setenv "PATH"
        (concat
         "C:/cygwin/usr/local/bin" path-separator
         "C:/cygwin/usr/bin" path-separator
         "C:/cygwin/bin" path-separator
         (getenv "PATH")))
;; get value of env var PATH
(getenv "PATH")

[see Evaluate Emacs Lisp Code]

Emacs exec-path

Emacs has a variable named exec-path. Its value is a list of dir paths. Emacs uses exec-path to find executable binary programs.

For example,

If emacs complains that it cannot find these programs, the problem is probably with your exec-path.

By default, emacs copies the value of (getenv "PATH") to exec-path. So, their values should be identical.

Here's a example of setting exec-path:

(when (string-equal system-type "windows-nt")
  (setq exec-path
        '(
          "C:/Program Files (x86)/Emacs/emacs/bin/"
          "C:/Program Files (x86)/Emacs/EmacsW32/gnuwin32/bin/"
          "C:/Windows/system32/"
          "C:/Windows/"
          "C:/Windows/System32/Wbem/"
          "C:/Windows/system32/WindowsPowerShell/v1.0/"
          )))

[see Elisp: Determine OS, Emacs Version, Machine Host Name]

Difference between exec-path and PATH

The value of (getenv "PATH") and exec-path do not need to be the same.

Emacs Lisp Code for Setting PATH and exec-path

Here's emacs lisp code template to set both PATH and exec-path in sync.

(when (string-equal system-type "windows-nt")
  (let (
        (mypaths
         '(
           "C:/Python27"
           ;; "C:/Python32"
           "C:/strawberry/c/bin"
           "C:/strawberry/perl/site/bin"
           "C:/strawberry/perl/bin"

           "C:/Users/h3/AppData/Roaming/npm"
           "C:/Program Files (x86)/nodejs/"

           "C:/cygwin/usr/local/bin"
           "C:/cygwin/usr/bin"
           "C:/cygwin/bin"

           "C:/Program Files (x86)/ErgoEmacs/msys/bin"
           "C:/Program Files (x86)/Mozilla Firefox/"
           "C:/Program Files (x86)/Opera"
           "C:/Program Files (x86)/Safari"
           "C:/Users/h3/AppData/Local/Google/Chrome/Application"
           ) )
        )

    (setenv "PATH" (mapconcat 'identity mypaths ";") )

    (setq exec-path (append mypaths (list "." exec-directory)) )
    ) )

Reference

2012-07-31 Thanks to Steve Purcell [ https://twitter.com/sanityinc ] for path-separator.

Emacs Init

Init Basics

Keys

Font

Text Editing

Completion

File

Restore Things

Backup/AutoSave

Line

Appearance

Misc

Advanced Init Tips

packages