aboutsummaryrefslogtreecommitdiffstats
path: root/lisp/eshell
diff options
context:
space:
mode:
Diffstat (limited to 'lisp/eshell')
-rw-r--r--lisp/eshell/em-unix.el44
1 files changed, 30 insertions, 14 deletions
diff --git a/lisp/eshell/em-unix.el b/lisp/eshell/em-unix.el
index dfd72f6b2ac..7de13d0b8ac 100644
--- a/lisp/eshell/em-unix.el
+++ b/lisp/eshell/em-unix.el
@@ -37,6 +37,8 @@
37;;; Code: 37;;; Code:
38 38
39(require 'eshell) 39(require 'eshell)
40(require 'esh-opt)
41(require 'pcomplete)
40 42
41;;;###autoload 43;;;###autoload
42(eshell-defgroup eshell-unix nil 44(eshell-defgroup eshell-unix nil
@@ -1048,10 +1050,11 @@ Show wall-clock time elapsed during execution of COMMAND.")
1048 1050
1049(defun eshell/su (&rest args) 1051(defun eshell/su (&rest args)
1050 "Alias \"su\" to call Tramp." 1052 "Alias \"su\" to call Tramp."
1053 (require 'tramp)
1051 (setq args (eshell-stringify-list (eshell-flatten-list args))) 1054 (setq args (eshell-stringify-list (eshell-flatten-list args)))
1052 (let (login) 1055 (let ((orig-args (copy-tree args)))
1053 (eshell-eval-using-options 1056 (eshell-eval-using-options
1054 "sudo" args 1057 "su" args
1055 '((?h "help" nil nil "show this usage screen") 1058 '((?h "help" nil nil "show this usage screen")
1056 (?l "login" nil login "provide a login environment") 1059 (?l "login" nil login "provide a login environment")
1057 (? nil nil login "provide a login environment") 1060 (? nil nil login "provide a login environment")
@@ -1062,13 +1065,18 @@ Become another USER during a login session.")
1062 (host (or (file-remote-p default-directory 'host) 1065 (host (or (file-remote-p default-directory 'host)
1063 "localhost")) 1066 "localhost"))
1064 (dir (or (file-remote-p default-directory 'localname) 1067 (dir (or (file-remote-p default-directory 'localname)
1065 default-directory))) 1068 (expand-file-name default-directory))))
1066 (eshell-for arg args 1069 (eshell-for arg args
1067 (if (string-equal arg "-") (setq login t) (setq user arg))) 1070 (if (string-equal arg "-") (setq login t) (setq user arg)))
1071 ;; `eshell-eval-using-options' does not handle "-".
1072 (if (member "-" orig-args) (setq login t))
1068 (if login (setq dir "~/")) 1073 (if login (setq dir "~/"))
1069 (if (and (file-remote-p default-directory) 1074 (if (and (file-remote-p default-directory)
1070 (not (string-equal 1075 (or
1071 user (file-remote-p default-directory 'user)))) 1076 (not (string-equal
1077 "su" (file-remote-p default-directory 'method)))
1078 (not (string-equal
1079 user (file-remote-p default-directory 'user)))))
1072 (add-to-list 1080 (add-to-list
1073 'tramp-default-proxies-alist 1081 'tramp-default-proxies-alist
1074 (list host user (file-remote-p default-directory)))) 1082 (list host user (file-remote-p default-directory))))
@@ -1079,8 +1087,9 @@ Become another USER during a login session.")
1079 1087
1080(defun eshell/sudo (&rest args) 1088(defun eshell/sudo (&rest args)
1081 "Alias \"sudo\" to call Tramp." 1089 "Alias \"sudo\" to call Tramp."
1090 (require 'tramp)
1082 (setq args (eshell-stringify-list (eshell-flatten-list args))) 1091 (setq args (eshell-stringify-list (eshell-flatten-list args)))
1083 (let (user) 1092 (let ((orig-args (copy-tree args)))
1084 (eshell-eval-using-options 1093 (eshell-eval-using-options
1085 "sudo" args 1094 "sudo" args
1086 '((?h "help" nil nil "show this usage screen") 1095 '((?h "help" nil nil "show this usage screen")
@@ -1089,19 +1098,26 @@ Become another USER during a login session.")
1089 :usage "[(-u | --user) USER] COMMAND 1098 :usage "[(-u | --user) USER] COMMAND
1090Execute a COMMAND as the superuser or another USER.") 1099Execute a COMMAND as the superuser or another USER.")
1091 (throw 'eshell-external 1100 (throw 'eshell-external
1092 (let* ((user (or user "root")) 1101 (let ((user (or user "root"))
1093 (host (or (file-remote-p default-directory 'host) 1102 (host (or (file-remote-p default-directory 'host)
1094 "localhost")) 1103 "localhost"))
1095 (dir (or (file-remote-p default-directory 'localname) 1104 (dir (or (file-remote-p default-directory 'localname)
1096 default-directory))) 1105 (expand-file-name default-directory))))
1106 ;; `eshell-eval-using-options' reads options of COMMAND.
1107 (while (and (stringp (car orig-args))
1108 (member (car orig-args) '("-u" "--user")))
1109 (setq orig-args (cddr orig-args)))
1097 (if (and (file-remote-p default-directory) 1110 (if (and (file-remote-p default-directory)
1098 (not (string-equal 1111 (or
1099 user (file-remote-p default-directory 'user)))) 1112 (not (string-equal
1113 "sudo" (file-remote-p default-directory 'method)))
1114 (not (string-equal
1115 user (file-remote-p default-directory 'user)))))
1100 (add-to-list 1116 (add-to-list
1101 'tramp-default-proxies-alist 1117 'tramp-default-proxies-alist
1102 (list host user (file-remote-p default-directory)))) 1118 (list host user (file-remote-p default-directory))))
1103 (let ((default-directory (format "/sudo:%s@%s:%s" user host dir))) 1119 (let ((default-directory (format "/sudo:%s@%s:%s" user host dir)))
1104 (eshell-named-command (car args) (cdr args)))))))) 1120 (eshell-named-command (car orig-args) (cdr orig-args))))))))
1105 1121
1106(put 'eshell/sudo 'eshell-no-numeric-conversions t) 1122(put 'eshell/sudo 'eshell-no-numeric-conversions t)
1107 1123