emacs-elpa-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[nongnu] elpa/exec-path-from-shell 0e0af3907a 040/114: For non-POSIX she


From: ELPA Syncer
Subject: [nongnu] elpa/exec-path-from-shell 0e0af3907a 040/114: For non-POSIX shells (mainly fish and tcsh), print vars in a standard "sh" subshell
Date: Tue, 5 Sep 2023 03:59:59 -0400 (EDT)

branch: elpa/exec-path-from-shell
commit 0e0af3907aa8a96e890771098885d7e636fe63ed
Author: Steve Purcell <steve@sanityinc.com>
Commit: Steve Purcell <steve@sanityinc.com>

    For non-POSIX shells (mainly fish and tcsh), print vars in a standard "sh" 
subshell
---
 exec-path-from-shell.el | 33 +++++++++++++++++++++------------
 1 file changed, 21 insertions(+), 12 deletions(-)

diff --git a/exec-path-from-shell.el b/exec-path-from-shell.el
index 75204b0312..b301b0de65 100644
--- a/exec-path-from-shell.el
+++ b/exec-path-from-shell.el
@@ -36,6 +36,15 @@
 ;; It also allows other environment variables to be retrieved from the
 ;; shell, so that Emacs will see the same values you get in a terminal.
 
+;; If you use a non-POSIX-standard shell like "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:
 
 ;; ELPA packages are available on Marmalade and MELPA. Alternatively, place
@@ -101,6 +110,10 @@ The default value denotes an interactive login shell."
   (when exec-path-from-shell-debug
     (apply 'message msg args)))
 
+(defun exec-path-from-shell--standard-shell-p (shell)
+  "Return non-nil iff SHELL supports the standard ${VAR-default} syntax."
+  (not (string-match "\\(fish\\|tcsh\\)$" shell)))
+
 (defun exec-path-from-shell-printf (str &optional args)
   "Return the result of printing STR in the user's shell.
 
@@ -119,7 +132,10 @@ shell-escaped, so they may contain $ etc."
                   " '__RESULT\\000" str "' "
                   (mapconcat #'exec-path-from-shell--double-quote args " ")))
          (shell-args (append exec-path-from-shell-arguments
-                             (list "-c" printf-command)))
+                             (list "-c"
+                                   (if (exec-path-from-shell--standard-shell-p 
(getenv "SHELL"))
+                                       printf-command
+                                     (concat "sh -c " (shell-quote-argument 
printf-command))))))
          (shell (getenv "SHELL")))
     (with-temp-buffer
       (exec-path-from-shell--debug "Invoking shell %s with args %S" shell 
shell-args)
@@ -138,17 +154,10 @@ shell-escaped, so they may contain $ etc."
 
 Execute $SHELL according to `exec-path-from-shell-arguments'.
 The result is a list of (NAME . VALUE) pairs."
-  (let* ((is-tcsh (exec-path-from-shell--tcsh-p (getenv "SHELL")))
-         (dollar-names (mapcar (lambda (n) (format (if is-tcsh "$%s" "${%s-}") 
n)) names))
-         (values (if is-tcsh
-                     ;; Dumb shell
-                     (mapcar (lambda (v)
-                               (exec-path-from-shell-printf "%s" (list v)))
-                             dollar-names)
-                   ;; Decent shell
-                   (split-string (exec-path-from-shell-printf
-                                  (mapconcat #'identity (make-list (length 
names) "%s") "\\000")
-                                  dollar-names) "\0"))))
+  (let* ((dollar-names (mapcar (lambda (n) (format "${%s-}" n)) names))
+         (values (split-string (exec-path-from-shell-printf
+                                (mapconcat #'identity (make-list (length 
names) "%s") "\\000")
+                                dollar-names) "\0")))
     (let (result)
       (while names
         (prog1



reply via email to

[Prev in Thread] Current Thread [Next in Thread]