From 6220ace290b247265de8fac66bd9e84bef388326 Mon Sep 17 00:00:00 2001 From: syl20bnr Date: Mon, 25 Jun 2018 02:16:27 -0400 Subject: [PATCH] core: rework environment variables and PATH management See updated DOCUMENTATION.org and FAQ.org for more info. * add core-env.el * add library load-env-vars.el * add bootstrap package dotenv-mode.el * remove spacemacs-environment from bootstrap layer * remove dotspacemacs variable dotspacemacs-import-env-vars-from-shell * remove dotspacemacs variable dotspacemacs-improt-env-vars-shell-file-name * add new key binding SPC f e e to open spacemacs.env file * add new key binding SPC f e E to reload environment variable from env file * add new key binding SPC f e C-e to re-initialize the env file from shell. --- core/core-configuration-layer.el | 10 +- core/core-dotspacemacs.el | 17 +--- core/core-env.el | 69 +++++++++++++ core/core-load-paths.el | 3 + core/core-spacemacs.el | 4 + core/libs/load-env-vars.el | 97 +++++++++++++++++++ core/templates/.spacemacs.template | 17 ---- doc/DOCUMENTATION.org | 76 ++++++++------- doc/FAQ.org | 7 ++ .../+completion/auto-completion/packages.el | 4 +- layers/+completion/templates/config.el | 2 +- .../spacemacs-bootstrap/config.el | 3 - .../spacemacs-bootstrap/funcs.el | 33 ------- .../spacemacs-bootstrap/packages.el | 10 +- .../spacemacs-defaults/keybindings.el | 3 + tests/core/core-configuration-layer-utest.el | 2 +- 16 files changed, 237 insertions(+), 120 deletions(-) create mode 100644 core/core-env.el create mode 100644 core/libs/load-env-vars.el diff --git a/core/core-configuration-layer.el b/core/core-configuration-layer.el index 24a9a79dd..19a42f404 100644 --- a/core/core-configuration-layer.el +++ b/core/core-configuration-layer.el @@ -37,10 +37,6 @@ (expand-file-name (concat spacemacs-start-directory "layers/")) "Spacemacs layers directory.") -(defconst configuration-layer-private-directory - (expand-file-name (concat spacemacs-start-directory "private/")) - "Spacemacs private layers base directory.") - (defconst configuration-layer-private-layer-directory (let ((dotspacemacs-layer-dir (when dotspacemacs-directory @@ -49,7 +45,7 @@ (if (and dotspacemacs-directory (file-exists-p dotspacemacs-layer-dir)) dotspacemacs-layer-dir - configuration-layer-private-directory)) + spacemacs-private-directory)) "Spacemacs default directory for private layers.") (defconst configuration-layer-lock-file @@ -1395,7 +1391,7 @@ discovery." ;; layers shipped with spacemacs (list configuration-layer-directory) ;; layers in private folder ~/.emacs.d/private - (list configuration-layer-private-directory) + (list spacemacs-private-directory) ;; layers in dotdirectory ;; this path may not exist, so check if it does (when dotspacemacs-directory @@ -1976,7 +1972,7 @@ RNAME is the name symbol of another existing layer." nil)) ((eq 'local location) (let ((dir (if (eq 'dotfile owner) - configuration-layer-private-directory + spacemacs-private-directory (let* ((owner (configuration-layer/get-layer owner))) (when owner (oref owner :dir)))))) (if dir diff --git a/core/core-dotspacemacs.el b/core/core-dotspacemacs.el index bb3898026..f72fa6365 100644 --- a/core/core-dotspacemacs.el +++ b/core/core-dotspacemacs.el @@ -60,21 +60,6 @@ exists. Otherwise, fallback to ~/.spacemacs")) `+distributions'. For now available distributions are `spacemacs-base' or `spacemacs'.") -(defvar dotspacemacs-import-env-vars-from-shell (and (display-graphic-p) - (or (eq system-type 'darwin) - (eq system-type 'gnu/linux) - (eq window-system 'x))) - "If non-nil then Spacemacs will import your PATH and environment variables -from your default shell on startup. This is enabled by default for macOS users -and X11 users.") - -(defvar dotspacemacs-import-env-vars-shell-file-name nil - "If nil then use the default shell is used to fetch the environment variables. -Set this variable to a different shell executable path to import the environment -variables from this shell. Note that `file-shell-name' is preserved and always -points to the default shell. For instance to use your fish shell environment -variables set this variable to `/usr/local/bin/fish'.") - (defvar dotspacemacs-enable-emacs-pdumper nil "If non-nil then enable support for the portable dumper. You'll need to compile Emacs 27 from source following the instructions in file @@ -535,6 +520,8 @@ Called with `C-u C-u' skips `dotspacemacs/user-config' _and_ preleminary tests." (setq dotspacemacs-editing-style (dotspacemacs//read-editing-style-config dotspacemacs-editing-style)) + ;; reload environment variables + (spacemacs/load-env) ;; try to force a redump when reloading the configuration (let ((spacemacs-force-dump t)) (configuration-layer/load)) diff --git a/core/core-env.el b/core/core-env.el new file mode 100644 index 000000000..2e0ce8b51 --- /dev/null +++ b/core/core-env.el @@ -0,0 +1,69 @@ +;;; core-env.el --- Spacemacs Core File +;; +;; Copyright (c) 2012-2018 Sylvain Benner & Contributors +;; +;; Author: Sylvain Benner +;; URL: https://github.com/syl20bnr/spacemacs +;; +;; This file is not part of GNU Emacs. +;; +;;; License: GPLv3 + +(require 'core-dotspacemacs) +(require 'load-env-vars) + +(defvar spacemacs-env-vars-file + (concat (or dotspacemacs-directory spacemacs-private-directory) "spacemacs.env") + "Absolute path to the env file where environment variables are set.") + +(defun spacemacs/init-env (&optional force) + "Attempt to fetch the environment variables from the users shell. +This solution is far from perfect and we should not rely on this function +a lot. We use it only to initialize the env file when it does not exist +yet. +If FORCE is non-nil then force the initialization of the file, note that the +current contents of the file will be overwritten." + (when (or force (not (file-exists-p spacemacs-env-vars-file))) + (with-temp-file spacemacs-env-vars-file + (let ((shell-command-switch "-ic")) + (insert (shell-command-to-string "env")))) + (spacemacs-buffer/warning + (concat "Spacemacs tried to import your environment variables from " + "your shell and saved them to `%s'. " + "Please check that the values are correct by calling " + "`spacemacs/edit-env' function and update the file if needed. " + "If you later need to add environment variables add them to this " + "file.") + spacemacs-env-vars-file))) + +(defun spacemacs/force-init-env () + "Forces a reinitialization of environment variables." + (interactive) + (spacemacs/init-env t)) + +(defun spacemacs/edit-env () + "Open the env file for edition." + (interactive) + (if (file-exists-p spacemacs-env-vars-file) + (progn + (find-file spacemacs-env-vars-file) + (when (fboundp 'dotenv-mode) + (dotenv-mode))) + (message "Cannot file env file `%s'" spacemacs-env-vars-file))) + +(defun spacemacs/load-env (&optional force) + "Load the environment variables from the env file. +If FORCE is non-nil then force the loading of environment variables from env +file." + (interactive "P") + (when (or force (and (display-graphic-p) + (or (eq system-type 'darwin) + (eq system-type 'gnu/linux) + (eq window-system 'x))))) + (if (file-exists-p spacemacs-env-vars-file) + (progn + (load-env-vars spacemacs-env-vars-file) + (message "Environment variables loaded.")) + (message "Cannot file env file `%s'" spacemacs-env-vars-file))) + +(provide 'core-env) diff --git a/core/core-load-paths.el b/core/core-load-paths.el index 68fd59262..718b27ce4 100644 --- a/core/core-load-paths.el +++ b/core/core-load-paths.el @@ -22,6 +22,9 @@ (defconst spacemacs-core-directory (expand-file-name (concat spacemacs-start-directory "core/")) "Spacemacs core directory.") +(defconst spacemacs-private-directory + (expand-file-name (concat spacemacs-start-directory "private/")) + "Spacemacs private directory.") (defconst spacemacs-info-directory (expand-file-name (concat spacemacs-core-directory "info/")) "Spacemacs info files directory") diff --git a/core/core-spacemacs.el b/core/core-spacemacs.el index 8dda8bc70..d6add6b03 100644 --- a/core/core-spacemacs.el +++ b/core/core-spacemacs.el @@ -12,6 +12,7 @@ (require 'subr-x nil 'noerror) (require 'core-emacs-backports) +(require 'core-env) (require 'page-break-lines) (require 'core-hooks) (require 'core-debug) @@ -145,6 +146,9 @@ the final step of executing code in `emacs-startup-hook'.") ;; check for new version (if dotspacemacs-mode-line-unicode-symbols (setq-default spacemacs-version-check-lighter "[⇪]")) + ;; load environment variables + (spacemacs/init-env) + (spacemacs/load-env) ;; install the dotfile if required (dotspacemacs/maybe-install-dotfile)) diff --git a/core/libs/load-env-vars.el b/core/libs/load-env-vars.el new file mode 100644 index 000000000..2023bda63 --- /dev/null +++ b/core/libs/load-env-vars.el @@ -0,0 +1,97 @@ +;;; load-env-vars.el --- Load environment variables from files -*- lexical-binding: t; -*- + +;; Copyright (C) 2018 Jorge Dias + +;; Author: Jorge Dias +;; URL: https://github.com/diasjorge/emacs-load-env-vars +;; Keywords: lisp +;; Version: 0.0.2 +;; Package-Requires: ((emacs "24")) + +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . + +;;; Commentary: + +;; This package allows you set environment variables loaded from a +;; file with bash style variable declarations. +;; Supported syntax: +;; +;; export KEY=VALUE +;; KEY=VALUE +;; KEY='VALUE' +;; KEY="VALUE" +;; # Comment lines are ignored +;; KEY=VALUE # Inline comments are ignored +;; KEY: VALUE +;; +;; Updates for Spacemacs: +;; - set `exec-path' from PATH + +;;; Code: + +(defvar load-env-vars-env-var-regexp + (rx + line-start + (0+ space) + (optional "export" (0+ space)) ;; optional export + (group (1+ (in "_" alnum))) ;; key + (or + (and (0+ space) "=" (0+ space)) + (and ":" (1+ space))) ;; separator + (or + (and "'" (group (0+ (or "\\'" (not (any "'"))))) "'") ;; single quoted value + (and ?\" (group (0+ (or "\\\"" (not (any "\""))))) ?\") ;; double quoted value + (group (1+ (not (in "#" "\n" space)))) ;; unquoted value + ) + (0+ space) + (optional "#" (0+ any)) + ) + "Regexp to match env vars in file." + ) + +(defun load-env-vars-re-seq (regexp) + "Get a list of all REGEXP matches in a buffer." + (save-excursion + (goto-char (point-min)) + (save-match-data + (let (matches) + (while (re-search-forward regexp nil t) + (push (list (match-string-no-properties 1) (or (match-string-no-properties 2) (match-string-no-properties 3) (match-string-no-properties 4))) matches)) + matches)))) + +(defun load-env-vars-extract-env-vars () + "Extract environment variable name and value from STRING." + (load-env-vars-re-seq load-env-vars-env-var-regexp)) + +(defun load-env-vars-set-env (env-vars) + "Set envariable variables from key value lists from ENV-VARS." + (dolist (element env-vars) + (let ((key (car element)) (value (cadr element))) + (when (string-equal "PATH" key) + (let ((paths (split-string value path-separator))) + (dolist (p paths) + (add-to-list 'exec-path p)))) + (setenv key value)))) + +;;;###autoload +(defun load-env-vars (file-path) + "Load environment variables found in FILE-PATH." + (interactive "fEnvironment variables file: ") + (with-temp-buffer + (insert-file-contents file-path) + (let ((env-vars (load-env-vars-extract-env-vars))) + (load-env-vars-set-env env-vars)))) + +(provide 'load-env-vars) +;;; load-env-vars.el ends here diff --git a/core/templates/.spacemacs.template b/core/templates/.spacemacs.template index eb79e32d6..6b174da79 100644 --- a/core/templates/.spacemacs.template +++ b/core/templates/.spacemacs.template @@ -155,23 +155,6 @@ It should only modify the values of Spacemacs settings." ;; If non-nil output loading progress in `*Messages*' buffer. (default nil) dotspacemacs-verbose-loading nil - ;; If non-nil then Spacemacs will import your PATH and environment variables - ;; from your default shell on startup. This is enabled by default for macOS - ;; users and X11 users. - dotspacemacs-import-env-vars-from-shell (and (display-graphic-p) - (or (eq system-type 'darwin) - (eq system-type 'gnu/linux) - (eq window-system 'x))) - - ;; If nil then use the default shell is used to fetch the environment - ;; variables. Set this variable to a different shell executable path to - ;; import the environment variables from this shell. Note that - ;; `file-shell-name' is preserved and always points to the default shell. For - ;; instance to use your fish shell environment variables set this variable to - ;; `/usr/local/bin/fish'. - ;; (default nil) - dotspacemacs-import-env-vars-shell-file-name nil - ;; Specify the startup banner. Default value is `official', it displays ;; the official spacemacs logo. An integer value is the index of text ;; banner, `random' chooses a random text banner in `core/banners' diff --git a/doc/DOCUMENTATION.org b/doc/DOCUMENTATION.org index 3a6c3bf98..ff0075fc7 100644 --- a/doc/DOCUMENTATION.org +++ b/doc/DOCUMENTATION.org @@ -61,6 +61,7 @@ - [[#differences-between-vim-evil-and-spacemacs][Differences between Vim, Evil and Spacemacs]] - [[#the-vim-surround-case][The vim-surround case]] - [[#evil-plugins][Evil plugins]] +- [[#environment-variables-and-path][Environment variables and PATH]] - [[#binding-keys][Binding keys]] - [[#gui-elements][GUI Elements]] - [[#color-themes][Color themes]] @@ -94,7 +95,6 @@ - [[#layout-key-bindings][Layout key bindings]] - [[#workspaces][Workspaces]] - [[#workspace-key-bindings][Workspace key bindings]] -- [[#environment-variables-and-path-from-the-shell][Environment variables and PATH from the shell]] - [[#commands][Commands]] - [[#vim-key-bindings][Vim key bindings]] - [[#escaping][Escaping]] @@ -1000,6 +1000,32 @@ Spacemacs ships with the following evil plugins: | [[https://github.com/bling/evil-visualstar][evil-visualstar]] | search for current selection with ~*~ | | [[https://github.com/jaypei/emacs-neotree][NeoTree]] | mimic [[https://github.com/scrooloose/nerdtree][NERD Tree]] | +* Environment variables and PATH +If you launch Emacs from a shell then Emacs process will inherit the environment +variables from your shell so you won't get any issue. + +On the other hand if you launch Emacs from a launcher without using a shell then +Emacs may not see your environment variables. This is especially true for macOS +users but it can happen to GNU/Linux too. + +To fix this issue Spacemacs first tries to import your shell environment +variable by calling = -ic env=. It then writes the result to the +=spacemacs.env= file whose location is =~/.emacs.d/private/env= or +=~/.spacemacs.d/env= directory depending on what you are using. + +Then Spacemacs loads the environment variables from the =spacemacs.env= file +directly. It won't call your shell anymore at startup. If you need to add new +environment variables or modify them you'll need to edit the =spacemacs.env= +file. You can open this file with ~SPC f e e~ or call the function +=spacemacs/edit-env=. + +At any point in time you can force an import of your shell environment variables +with ~SPC f e C-e~. Note that this function will overwrite the contents of your +=spacemacs.env= file. + +You can reload the environment variables from the =spacemacs.env= file with ~SPC +f e E~. + * Binding keys Key sequences are bound to commands in Emacs in various keymaps. The most basic map is the =global-map=. Setting a key binding in the =global-map= is achieved @@ -1717,31 +1743,6 @@ There are also some handy globally available key bindings related to workspaces: | ~gT~ | go to previous workspace | | ~SPC b W~ | go to workspace and window by buffer | -* Environment variables and PATH from the shell -To import your environment variable and =PATH= at startup set the variable -=dotspacemacs-import-env-vars-from-shell= to non-nil. - -This should be necessary only to macOS users and X11 users using the GNU -build of Emacs. - -#+BEGIN_EXAMPLE emacs-lisp -(setq-default dotspacemacs-import-env-vars-from-shell (and (display-graphic-p) - (or (eq system-type 'darwin) - (eq window-system 'x)))) -#+END_EXAMPLE - -At anytime you can import the environment variables by calling the function -=spacemacs/loadenv=. - -You can define a different shell than the default shell to look for environment -variables by setting the variable =dotspacemacs-import-env-vars-shell-file-name= -in your dotfile. Note that =shell-file-name= is not modified by this value. - -#+BEGIN_EXAMPLE emacs-lisp -(defun dotspacemacs/init () - (setq dotspacemacs-import-env-vars-shell-file-name "/usr/local/bin/fish")) -#+END_EXAMPLE - * Commands ** Vim key bindings Spacemacs is based on =Vim= modal user interface to navigate and edit text. If @@ -2385,16 +2386,19 @@ Frame manipulation commands (start with ~F~): Convenient key bindings are located under the prefix ~SPC f e~ to quickly navigate between =Emacs= and Spacemacs specific files. -| Key Binding | Description | -|-------------+-----------------------------------------------------------------| -| ~SPC f e d~ | open the spacemacs dotfile (=~/.spacemacs=) | -| ~SPC f e D~ | open =ediff= buffer of =~/.spacemacs= and =.spacemacs.template= | -| ~SPC f e f~ | discover the =FAQ= | -| ~SPC f e i~ | open the all mighty =init.el= | -| ~SPC f e l~ | locate an Emacs library | -| ~SPC f e R~ | resync the dotfile with spacemacs | -| ~SPC f e U~ | update packages | -| ~SPC f e v~ | display and copy the spacemacs version | +| Key Binding | Description | +|---------------+----------------------------------------------------------------------| +| ~SPC f e d~ | open the spacemacs dotfile (=~/.spacemacs=) | +| ~SPC f e D~ | open =ediff= buffer of =~/.spacemacs= and =.spacemacs.template= | +| ~SPC f e e~ | open the =spacemacs.env= file where environment variables are set | +| ~SPC f e E~ | reload the environment variables by reading the =spacemacs.env= file | +| ~SPC f e C-e~ | reinitialize the =spacemacs.env= file from shell | +| ~SPC f e f~ | discover the =FAQ= | +| ~SPC f e i~ | open the all mighty =init.el= | +| ~SPC f e l~ | locate an Emacs library | +| ~SPC f e R~ | resync the dotfile with spacemacs | +| ~SPC f e U~ | update packages | +| ~SPC f e v~ | display and copy the spacemacs version | **** Browsing files in completion buffer In =vim= style and =hybrid= style with the variable diff --git a/doc/FAQ.org b/doc/FAQ.org index cb962b755..a01b8351f 100644 --- a/doc/FAQ.org +++ b/doc/FAQ.org @@ -6,6 +6,7 @@ - [[#what-is-the-official-pronunciation-of-spacemacs][What is the official pronunciation of Spacemacs?]] - [[#why-do-you-call-this-a-distribution-i-dont-see-any-spacemacs-executable][Why do you call this a "distribution", I don't see any "Spacemacs" executable?]] - [[#why-are-packages-installed-with-package-install-automatically-deleted-by-spacemacs-when-it-boots][Why are packages installed with =package-install= automatically deleted by Spacemacs when it boots?]] + - [[#environment-variables-or-path-are-not-set-properly][Environment variables or PATH are not set properly]] - [[#how-to-fix-package-download-errors-when-installing-spacemacs-][How to fix package download errors when installing Spacemacs ?]] - [[#how-to-fix-symbols-value-as-variable-is-void-errors-on-startup][How to fix =Symbol's value as variable is void= errors on startup?]] - [[#how-to-fix-wrong-type-argument-arrayp-nil-errors-on-startup][How to fix =(wrong-type-argument arrayp nil)= errors on startup?]] @@ -85,6 +86,12 @@ To install packages that does not belong to any Spacemacs layers, you can: To create a new configuration layer see the [[https://github.com/syl20bnr/spacemacs/blob/master/doc/QUICK_START.org][quick start guide]] for more info. +** Environment variables or PATH are not set properly +If you use Emacs GUI and don't launch if from a terminal then edit the +environment variables in the =env= file. You can open this file with +~SPC f e e~. More information in the =Environment variables= section of the +[[https://github.com/syl20bnr/spacemacs/blob/master/doc/DOCUMENTATION.org][documentation]]. + ** How to fix package download errors when installing Spacemacs ? Since 0.105.0 HTTPS protocol is used by default to download packages. If your environment does not allow HTTPS to reach ELPA repositories then you can start diff --git a/layers/+completion/auto-completion/packages.el b/layers/+completion/auto-completion/packages.el index e0884b41b..1ee95fe02 100644 --- a/layers/+completion/auto-completion/packages.el +++ b/layers/+completion/auto-completion/packages.el @@ -75,7 +75,7 @@ (progn (setq aya-persist-snippets-dir (or auto-completion-private-snippets-directory - (concat configuration-layer-private-directory "snippets/"))) + (concat spacemacs-private-directory "snippets/"))) (spacemacs/declare-prefix "iS" "auto-yasnippet") (spacemacs/set-leader-keys "iSc" 'aya-create @@ -234,7 +234,7 @@ (let* ((spacemacs--auto-completion-dir (configuration-layer/get-layer-local-dir 'auto-completion)) (emacs-directory-snippets-dir (concat - configuration-layer-private-directory + spacemacs-private-directory "snippets/")) (spacemacs-layer-snippets-dir (expand-file-name "snippets" diff --git a/layers/+completion/templates/config.el b/layers/+completion/templates/config.el index d760162ea..66a924c3b 100644 --- a/layers/+completion/templates/config.el +++ b/layers/+completion/templates/config.el @@ -10,7 +10,7 @@ ;;; License: GPLv3 (defvar templates-private-directory - (concat configuration-layer-private-directory "templates") + (concat spacemacs-private-directory "templates") "Configurable private templates directory.") (defvar templates-use-default-templates t diff --git a/layers/+distributions/spacemacs-bootstrap/config.el b/layers/+distributions/spacemacs-bootstrap/config.el index e6fb376f9..9aa5401b2 100644 --- a/layers/+distributions/spacemacs-bootstrap/config.el +++ b/layers/+distributions/spacemacs-bootstrap/config.el @@ -81,6 +81,3 @@ if used there.") ("iedit-insert" "firebrick1" (bar . 2))) "Colors assigned to evil states with cursor definitions. To add your own, use `spacemacs/add-evil-curosr'.") - -(defvar spacemacs-env-vars-file (concat spacemacs-cache-directory ".env-vars") - "Cache file for exec-path variable.") diff --git a/layers/+distributions/spacemacs-bootstrap/funcs.el b/layers/+distributions/spacemacs-bootstrap/funcs.el index d115177f7..1c22eba5d 100644 --- a/layers/+distributions/spacemacs-bootstrap/funcs.el +++ b/layers/+distributions/spacemacs-bootstrap/funcs.el @@ -9,39 +9,6 @@ ;; ;;; License: GPLv3 - - -(defun spacemacs/loadenv () - "Gets and sets all the environment variables from user shell." - (interactive) - (spacemacs-buffer/message "Importing environment variables..") - (require 'async nil t) - (async-start - `(lambda () - ,(async-inject-variables - "\\`dotspacemacs-import-env-vars-shell-file-name\\'") - (if dotspacemacs-import-env-vars-shell-file-name - (let ((shell-file-name - dotspacemacs-import-env-vars-shell-file-name)) - (split-string (shell-command-to-string "env") "\n")) - (split-string (shell-command-to-string "env") "\n"))) - (lambda (envvars) - (spacemacs-buffer/message "Imported environment variables:") - (dolist (env envvars) - (if (string-match "^[a-zA-Z_]+[a-zA-Z0-9_]*=" env) - (let* ((var (split-string env "=")) - (k (car var)) - (v (cadr var))) - (spacemacs-buffer/message " - %s=%s" k v) - (when (string-equal "PATH" k) - (let ((paths (split-string v path-separator))) - (dolist (p paths) - (add-to-list 'exec-path p)))) - (setenv k v)))) - ;; be sure we keep the default shell in this Emacs session - ;; this is to prevent potential issues with packages which could - ;; expect a default shell - (setenv "SHELL" shell-file-name)))) diff --git a/layers/+distributions/spacemacs-bootstrap/packages.el b/layers/+distributions/spacemacs-bootstrap/packages.el index b39a52f77..3cab85d8d 100644 --- a/layers/+distributions/spacemacs-bootstrap/packages.el +++ b/layers/+distributions/spacemacs-bootstrap/packages.el @@ -18,12 +18,12 @@ (bind-key :step bootstrap) (diminish :step bootstrap) (evil :step bootstrap) - (spacemacs-environment :step bootstrap :location built-in) (hydra :step bootstrap) (use-package :step bootstrap) (which-key :step bootstrap) ;; pre packages, initialized aftert the bootstrap packages ;; these packages can use use-package + (dotenv-mode :step pre) (evil-evilified-state :location local :step pre :protected t) (pcre2el :step pre) (holy-mode :location local :step pre) @@ -42,6 +42,10 @@ (when (not (configuration-layer/package-used-p 'spaceline)) (add-hook 'after-load-functions 'spacemacs/diminish-hook))) +(defun spacemacs-bootstrap/init-dotenv-mode () + (use-package dotenv-mode + :defer t)) + (defun spacemacs-bootstrap/init-bind-map () (require 'bind-map) (bind-map spacemacs-default-map @@ -493,10 +497,6 @@ (which-key-mode) (spacemacs|diminish which-key-mode " Ⓚ" " K")) -(defun spacemacs-bootstrap/init-spacemacs-environment () - (when dotspacemacs-import-env-vars-from-shell - (spacemacs/loadenv))) - ;; pre packages (defun spacemacs-bootstrap/init-evil-evilified-state () diff --git a/layers/+spacemacs/spacemacs-defaults/keybindings.el b/layers/+spacemacs/spacemacs-defaults/keybindings.el index 0ac95cf5b..fb77f8e13 100644 --- a/layers/+spacemacs/spacemacs-defaults/keybindings.el +++ b/layers/+spacemacs/spacemacs-defaults/keybindings.el @@ -203,6 +203,9 @@ "fei" 'spacemacs/find-user-init-file "fed" 'spacemacs/find-dotfile "feD" 'spacemacs/ediff-dotfile-and-template + "fee" 'spacemacs/edit-env + "feE" 'spacemacs/load-env + "fe C-e" 'spacemacs/force-init-env "feR" 'dotspacemacs/sync-configuration-layers "fev" 'spacemacs/display-and-copy-version "feU" 'configuration-layer/update-packages diff --git a/tests/core/core-configuration-layer-utest.el b/tests/core/core-configuration-layer-utest.el index 6a97f7e52..d575ea52a 100644 --- a/tests/core/core-configuration-layer-utest.el +++ b/tests/core/core-configuration-layer-utest.el @@ -2389,7 +2389,7 @@ ((spacemacs/update-progress-bar nil ((:output nil)))) (configuration-layer//configure-packages-2 `(,(oref pkg :name))) (push (file-name-as-directory - (concat configuration-layer-private-directory "local/pkg")) + (concat spacemacs-private-directory "local/pkg")) expected-load-path) (should (equal expected-load-path load-path)))))