comparison lisp/eshell/em-unix.el @ 106390:4eee659fa954

Cleanup. * eshell/em-unix.el (top): Require 'esh-opt and 'pcomplete. (eshell/su, eshell/sudo): Require 'tramp. Fix problems reading arguments. Expand `default-directory'. * net/tramp.el (tramp-handle-file-remote-p): Expand FILENAME for the benefit of returning an expanded localname. (tramp-tramp-file-p): Handle the case NAME is not a string.
author Michael Albinus <michael.albinus@gmx.de>
date Thu, 03 Dec 2009 11:34:11 +0000
parents 12c2a6b10caf
children 1d1d5d9bd884
comparison
equal deleted inserted replaced
106389:b537bb8db7d9 106390:4eee659fa954
35 ;; processes for common operations. 35 ;; processes for common operations.
36 36
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
43 "This module defines many of the more common UNIX utilities as 45 "This module defines many of the more common UNIX utilities as
44 aliases implemented in Lisp. These include mv, ln, cp, rm, etc. If 46 aliases implemented in Lisp. These include mv, ln, cp, rm, etc. If
1046 ;; Pacify the byte-compiler. 1048 ;; Pacify the byte-compiler.
1047 (defvar tramp-default-proxies-alist) 1049 (defvar tramp-default-proxies-alist)
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")
1058 :usage "[- | -l | --login] [USER] 1061 :usage "[- | -l | --login] [USER]
1059 Become another USER during a login session.") 1062 Become another USER during a login session.")
1060 (throw 'eshell-replace-command 1063 (throw 'eshell-replace-command
1061 (let ((user "root") 1064 (let ((user "root")
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))))
1075 (eshell-parse-command 1083 (eshell-parse-command
1076 "cd" (list (format "/su:%s@%s:%s" user host dir)))))))) 1084 "cd" (list (format "/su:%s@%s:%s" user host dir))))))))
1077 1085
1078 (put 'eshell/su 'eshell-no-numeric-conversions t) 1086 (put 'eshell/su 'eshell-no-numeric-conversions t)
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")
1087 (?u "user" t user "execute a command as another USER") 1096 (?u "user" t user "execute a command as another USER")
1088 :show-usage 1097 :show-usage
1089 :usage "[(-u | --user) USER] COMMAND 1098 :usage "[(-u | --user) USER] COMMAND
1090 Execute a COMMAND as the superuser or another USER.") 1099 Execute 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
1108 (provide 'em-unix) 1124 (provide 'em-unix)
1109 1125