diff --git a/core/cli/env.el b/core/cli/env.el index 679dd4747..1fbc050f9 100644 --- a/core/cli/env.el +++ b/core/cli/env.el @@ -3,7 +3,7 @@ (dispatcher! env (let ((env-file (abbreviate-file-name doom-env-file))) (pcase (car args) - ("refresh" + ((or "refresh" "re") (doom-reload-env-file 'force)) ("enable" (setenv "DOOMENV" "1") @@ -42,7 +42,7 @@ needs to be run once).") ;; ;; Helpers -(defvar doom-ignored-env-vars +(defvar doom-env-ignored-vars '("DBUS_SESSION_BUS_ADDRESS" "GPG_AGENT_INFO" "SSH_AGENT_PID" @@ -53,9 +53,30 @@ needs to be run once).") "YES") "Environment variables to not save in `doom-env-file'.") -;; Borrows heavily from Spacemacs'`spacemacs//init-spacemacs-env'. +(defvar doom-env-executable + (if IS-WINDOWS + "set" + (executable-find "env")) + "The program to use to scrape your shell environment with. +It is rare that you'll need to change this.") + +(defvar doom-env-switches + (if IS-WINDOWS + '("-c") + ;; Execute twice, once in a non-interactive login shell and once in an + ;; interactive shell in order to capture all the init files possible. + '("-lc" "-ic")) + "The `shell-command-switch'es to use on `doom-env-executable'. +This is a list of strings. Each entry is run separately and in sequence with +`doom-env-executable' to scrape envvars from your shell environment.") + +;; Borrows heavily from Spacemacs' `spacemacs//init-spacemacs-env'. (defun doom-reload-env-file (&optional force-p) - "Generates `doom-env-file', if it doesn't exist (or FORCE-P is non-nil)." + "Generates `doom-env-file', if it doesn't exist (or FORCE-P is non-nil). + +Runs `doom-env-executable' X times, where X = length of `doom-env-switches', to +scrape the variables from your shell environment. Duplicates are removed. The +order of `doom-env-switches' determines priority." (when (or force-p (not (file-exists-p doom-env-file))) (with-temp-file doom-env-file (message "%s envvars file at %S" @@ -63,37 +84,40 @@ needs to be run once).") "Regenerating" "Generating") (abbreviate-file-name doom-env-file)) - (insert - (concat - "# -*- mode: dotenv -*-\n" - "# ---------------------------------------------------------------------------\n" - "# This file was auto-generated by Doom. It contains all environment variables\n" - "# scraped from your default shell (excluding variables blacklisted in\n" - "# doom-ignored-env-vars).\n" - "#\n" - "# It is NOT safe to edit this file. Changes will be overwritten next time\n" - "# that `doom env refresh` is executed. Alternatively, create your own env file\n" - "# in your DOOMDIR and load that with `(load-env-vars FILE)`.\n" - "#\n" - "# To auto-regenerate this file when `doom reload` is run, use `doom env enable'\n" - "# or set DOOMENV=1 in your shell environment/config.\n" - "# ---------------------------------------------------------------------------\n\n")) - (let ((env-point (point)) - (switches - (cond (IS-WINDOWS '("-c")) - ;; Execute twice, once in a non-interactive login shell and - ;; once in an interactive shell in order to capture all the - ;; init files possible. - ((or IS-MAC IS-LINUX) '("-lc" "-ic")))) - (executable (if IS-WINDOWS - "set" - (executable-find "env")))) - (dolist (shell-command-switch switches) - (insert (shell-command-to-string executable))) - ;; sort the environment variables - (sort-lines nil env-point (point-max)) - ;; remove adjacent duplicated lines - (delete-duplicate-lines env-point (point-max) nil t) - ;; remove ignored environment variables - (dolist (var doom-ignored-env-vars) - (flush-lines (concat "^" var "=") env-point (point-max))))))) + (let ((process-environment doom-site-process-environment)) + (insert + (concat + "# -*- mode: dotenv -*-\n" + "# ---------------------------------------------------------------------------\n" + "# This file was auto-generated by Doom by running:\n" + "#\n" + (cl-loop for switch in doom-env-switches + concat (format "# %s %s %s\n" + shell-file-name + switch + doom-env-executable)) + "#\n" + "# It contains all environment variables scraped from your default shell\n" + "# (excluding variables blacklisted in doom-env-ignored-vars).\n" + "#\n" + "# It is NOT safe to edit this file. Changes will be overwritten next time\n" + "# that `doom env refresh` is executed. Alternatively, create your own env file\n" + "# in your DOOMDIR and load that with `(load-env-vars FILE)`.\n" + "#\n" + "# To auto-regenerate this file when `doom reload` is run, use `doom env enable'\n" + "# or set DOOMENV=1 in your shell environment/config.\n" + "# ---------------------------------------------------------------------------\n\n")) + (let ((env-point (point))) + (dolist (shell-command-switch doom-env-switches) + (message "Scraping env from '%s %s %s'" + shell-file-name + shell-command-switch + doom-env-executable) + (insert (shell-command-to-string doom-env-executable))) + ;; sort the environment variables + (sort-lines nil env-point (point-max)) + ;; remove adjacent duplicated lines + (delete-duplicate-lines env-point (point-max) nil t) + ;; remove ignored environment variables + (dolist (var doom-env-ignored-vars) + (flush-lines (concat "^" var "=") env-point (point-max)))))))) diff --git a/core/core.el b/core/core.el index 8703e0260..ed75e94b5 100644 --- a/core/core.el +++ b/core/core.el @@ -99,7 +99,10 @@ MacOS users).") Doom was setup, which can cause problems.") (defvar doom-site-load-path load-path - "The starting load-path, before it is altered by `doom-initialize'.") + "The starting `load-path', before it is altered by `doom-initialize'.") + +(defvar doom-site-process-environment process-environment + "The starting `process-environment', before it is altered by `doom-initialize'.") (defvar doom--last-emacs-file (concat doom-local-dir "emacs-version.el")) (defvar doom--last-emacs-version nil)