]> code.delx.au - gnu-emacs/commitdiff
Added eshell-tramp module
authorAidan Gauland <aidalgol@no8wireless.co.nz>
Tue, 26 Mar 2013 22:08:58 +0000 (11:08 +1300)
committerAidan Gauland <aidalgol@no8wireless.co.nz>
Tue, 26 Mar 2013 22:08:58 +0000 (11:08 +1300)
* lisp/eshell/em-unix.el: Moved su and sudo to...
* lisp/eshell/em-tramp.el: ...Eshell tramp module
* doc/misc/eshell.texi: Updated manual to reflect changes.

External su and sudo commands are now the default; the internal,
TRAMP-using variants can still be used by enabling the eshell-tramp
module.

ChangeLog
doc/misc/eshell.texi
lisp/eshell/em-tramp.el [new file with mode: 0644]
lisp/eshell/em-unix.el

index 3d01040ca96c4eace26f649b78f6e1ae9fc6473b..500c85d2350b5793c4f57c092ff48a5192fa31c1 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,13 @@
+2013-03-27  Aidan Gauland  <aidalgol@no8wireless.co.nz
+
+       * lisp/eshell/em-unix.el: Moved su and sudo to...
+       * lisp/eshell/em-tramp.el: ...Eshell tramp module
+       * doc/misc/eshell.texi: Updated manual to reflect changes.
+
+       External su and sudo commands are now the default; the internal,
+       TRAMP-using variants can still be used by enabling the eshell-tramp
+       module.
+
 2013-03-25  Jan Djärv  <jan.h.d@swipnet.se>
 
        * configure.ac (HAVE_XKB): Define if Xkb is present.
index ec01f731daf4e5da4539aedaf15146c4562d1363..dca95da2d10a9a41c63b64e58eba0519389d3452 100644 (file)
@@ -460,8 +460,9 @@ With @samp{cd -42}, you can access the directory stack by number.
 @cmindex su
 @itemx sudo
 @cmindex sudo
-Uses TRAMP's @command{su} or @command{sudo} method to run a command via
-@command{su} or @command{sudo}.
+Uses TRAMP's @command{su} or @command{sudo} method @pxref{Inline methods, , , tramp}
+to run a command via @command{su} or @command{sudo}.  These commands
+are in the eshell-tramp module, which is disabled by default.
 
 @end table
 
diff --git a/lisp/eshell/em-tramp.el b/lisp/eshell/em-tramp.el
new file mode 100644 (file)
index 0000000..c60d0e6
--- /dev/null
@@ -0,0 +1,143 @@
+;;; em-tramp.el --- Eshell features that require TRAMP
+
+;; Copyright (C) 1999-2013 Free Software Foundation, Inc.
+
+;; Author: Aidan Gauland <aidalgol@no8wireless.co.nz>
+
+;; This file is part of GNU Emacs.
+
+;; GNU Emacs 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.
+
+;; GNU Emacs 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 GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;; Eshell features that require TRAMP.
+
+;;; Code:
+
+(eval-when-compile
+  (require 'esh-mode)
+  (require 'eshell)
+  (require 'tramp))
+
+(require 'esh-util)
+
+;;;###autoload
+(progn
+ (defgroup eshell-tramp nil
+   "This module defines commands that use TRAMP in a way that is
+  not transparent to the user.  So far, this includes only the
+  built-in su and sudo commands, which are not compatible with
+  the full, external su and sudo commands, and require the user
+  to understand how to use the TRAMP sudo method."
+   :tag "TRAMP Eshell features"
+   :group 'eshell-module))
+
+(defun eshell-tramp-initialize ()
+  "Initialize the TRAMP-using commands code."
+  (when (eshell-using-module 'eshell-cmpl)
+    (add-hook 'pcomplete-try-first-hook
+             'eshell-complete-host-reference nil t))
+  (make-local-variable 'eshell-complex-commands)
+  (setq eshell-complex-commands
+       (append '("su" "sudo")
+               eshell-complex-commands)))
+
+(defun eshell/su (&rest args)
+  "Alias \"su\" to call TRAMP.
+
+Uses the system su through TRAMP's su method."
+  (setq args (eshell-stringify-list (eshell-flatten-list args)))
+  (let ((orig-args (copy-tree args)))
+    (eshell-eval-using-options
+     "su" args
+     '((?h "help" nil nil "show this usage screen")
+       (?l "login" nil login "provide a login environment")
+       (?  nil nil login "provide a login environment")
+       :usage "[- | -l | --login] [USER]
+Become another USER during a login session.")
+     (throw 'eshell-replace-command
+           (let ((user "root")
+                 (host (or (file-remote-p default-directory 'host)
+                           "localhost"))
+                 (dir (or (file-remote-p default-directory 'localname)
+                          (expand-file-name default-directory)))
+                 (prefix (file-remote-p default-directory)))
+             (dolist (arg args)
+               (if (string-equal arg "-") (setq login t) (setq user arg)))
+             ;; `eshell-eval-using-options' does not handle "-".
+             (if (member "-" orig-args) (setq login t))
+             (if login (setq dir "~/"))
+             (if (and prefix
+                      (or
+                       (not (string-equal
+                             "su" (file-remote-p default-directory 'method)))
+                       (not (string-equal
+                             user (file-remote-p default-directory 'user)))))
+                 (eshell-parse-command
+                  "cd" (list (format "%s|su:%s@%s:%s"
+                                     (substring prefix 0 -1) user host dir)))
+               (eshell-parse-command
+                "cd" (list (format "/su:%s@%s:%s" user host dir)))))))))
+
+(put 'eshell/su 'eshell-no-numeric-conversions t)
+
+(defun eshell/sudo (&rest args)
+  "Alias \"sudo\" to call Tramp.
+
+Uses the system sudo through TRAMP's sudo method."
+  (setq args (eshell-stringify-list (eshell-flatten-list args)))
+  (let ((orig-args (copy-tree args)))
+    (eshell-eval-using-options
+     "sudo" args
+     '((?h "help" nil nil "show this usage screen")
+       (?u "user" t user "execute a command as another USER")
+       :show-usage
+       :usage "[(-u | --user) USER] COMMAND
+Execute a COMMAND as the superuser or another USER.")
+     (throw 'eshell-external
+           (let ((user (or user "root"))
+                 (host (or (file-remote-p default-directory 'host)
+                           "localhost"))
+                 (dir (or (file-remote-p default-directory 'localname)
+                          (expand-file-name default-directory)))
+                 (prefix (file-remote-p default-directory)))
+             ;; `eshell-eval-using-options' reads options of COMMAND.
+             (while (and (stringp (car orig-args))
+                         (member (car orig-args) '("-u" "--user")))
+               (setq orig-args (cddr orig-args)))
+             (let ((default-directory
+                     (if (and prefix
+                              (or
+                               (not
+                                (string-equal
+                                 "sudo"
+                                 (file-remote-p default-directory 'method)))
+                               (not
+                                (string-equal
+                                 user
+                                 (file-remote-p default-directory 'user)))))
+                         (format "%s|sudo:%s@%s:%s"
+                                 (substring prefix 0 -1) user host dir)
+                       (format "/sudo:%s@%s:%s" user host dir))))
+               (eshell-named-command (car orig-args) (cdr orig-args))))))))
+
+(put 'eshell/sudo 'eshell-no-numeric-conversions t)
+
+(provide 'em-tramp)
+
+;; Local Variables:
+;; generated-autoload-file: "esh-groups.el"
+;; End:
+
+;;; em-tramp.el ends here
index 94508d71592f361970905558c58bbd02f6c4080b..60caf38710a9123ab49a5caffbf103cbc60304d8 100644 (file)
@@ -148,7 +148,7 @@ Otherwise, Emacs will attempt to use rsh to invoke du on the remote machine."
   (make-local-variable 'eshell-complex-commands)
   (setq eshell-complex-commands
        (append '("grep" "egrep" "fgrep" "agrep" "glimpse" "locate"
-                 "cat" "time" "cp" "mv" "make" "du" "diff" "su" "sudo")
+                 "cat" "time" "cp" "mv" "make" "du" "diff")
                eshell-complex-commands)))
 
 (defalias 'eshell/date     'current-time-string)
@@ -1038,85 +1038,6 @@ Show wall-clock time elapsed during execution of COMMAND.")
 
 (put 'eshell/occur 'eshell-no-numeric-conversions t)
 
-(defun eshell/su (&rest args)
-  "Alias \"su\" to call Tramp."
-  (require 'tramp)
-  (setq args (eshell-stringify-list (eshell-flatten-list args)))
-  (let ((orig-args (copy-tree args)))
-    (eshell-eval-using-options
-     "su" args
-     '((?h "help" nil nil "show this usage screen")
-       (?l "login" nil login "provide a login environment")
-       (?  nil nil login "provide a login environment")
-       :usage "[- | -l | --login] [USER]
-Become another USER during a login session.")
-     (throw 'eshell-replace-command
-           (let ((user "root")
-                 (host (or (file-remote-p default-directory 'host)
-                           "localhost"))
-                 (dir (or (file-remote-p default-directory 'localname)
-                          (expand-file-name default-directory)))
-                 (prefix (file-remote-p default-directory)))
-             (dolist (arg args)
-               (if (string-equal arg "-") (setq login t) (setq user arg)))
-             ;; `eshell-eval-using-options' does not handle "-".
-             (if (member "-" orig-args) (setq login t))
-             (if login (setq dir "~/"))
-             (if (and prefix
-                      (or
-                       (not (string-equal
-                             "su" (file-remote-p default-directory 'method)))
-                       (not (string-equal
-                             user (file-remote-p default-directory 'user)))))
-                 (eshell-parse-command
-                  "cd" (list (format "%s|su:%s@%s:%s"
-                                     (substring prefix 0 -1) user host dir)))
-               (eshell-parse-command
-                "cd" (list (format "/su:%s@%s:%s" user host dir)))))))))
-
-(put 'eshell/su 'eshell-no-numeric-conversions t)
-
-(defun eshell/sudo (&rest args)
-  "Alias \"sudo\" to call Tramp."
-  (require 'tramp)
-  (setq args (eshell-stringify-list (eshell-flatten-list args)))
-  (let ((orig-args (copy-tree args)))
-    (eshell-eval-using-options
-     "sudo" args
-     '((?h "help" nil nil "show this usage screen")
-       (?u "user" t user "execute a command as another USER")
-       :show-usage
-       :usage "[(-u | --user) USER] COMMAND
-Execute a COMMAND as the superuser or another USER.")
-     (throw 'eshell-external
-           (let ((user (or user "root"))
-                 (host (or (file-remote-p default-directory 'host)
-                           "localhost"))
-                 (dir (or (file-remote-p default-directory 'localname)
-                          (expand-file-name default-directory)))
-                 (prefix (file-remote-p default-directory)))
-             ;; `eshell-eval-using-options' reads options of COMMAND.
-             (while (and (stringp (car orig-args))
-                         (member (car orig-args) '("-u" "--user")))
-               (setq orig-args (cddr orig-args)))
-             (let ((default-directory
-                     (if (and prefix
-                              (or
-                               (not
-                                (string-equal
-                                 "sudo"
-                                 (file-remote-p default-directory 'method)))
-                               (not
-                                (string-equal
-                                 user
-                                 (file-remote-p default-directory 'user)))))
-                         (format "%s|sudo:%s@%s:%s"
-                                 (substring prefix 0 -1) user host dir)
-                       (format "/sudo:%s@%s:%s" user host dir))))
-               (eshell-named-command (car orig-args) (cdr orig-args))))))))
-
-(put 'eshell/sudo 'eshell-no-numeric-conversions t)
-
 (provide 'em-unix)
 
 ;; Local Variables: