]> git.eshelyaron.com Git - emacs.git/commitdiff
Treat "-" as a positional arg in 'eshell-eval-using-options'
authorJim Porter <jporterbugs@gmail.com>
Tue, 25 Jan 2022 05:08:50 +0000 (21:08 -0800)
committerLars Ingebrigtsen <larsi@gnus.org>
Tue, 25 Jan 2022 12:28:48 +0000 (13:28 +0100)
* lisp/eshell/esh-opt.el (eshell--process-args): Treat "-" as a
positional arg.

* lisp/eshell/em-tramp.el (eshell/su): Simplify checking for "-".

* test/lisp/eshell/esh-opt-tests.el
(esh-opt-test/eval-using-options-stdin): New test.

lisp/eshell/em-tramp.el
lisp/eshell/esh-opt.el
test/lisp/eshell/esh-opt-tests.el

index 791458822da7f37af91d90311c8ab4ec3a056ce6..2afd4fe066a4239954155634464f8a8364cae137 100644 (file)
 
 (autoload 'eshell-parse-command "esh-cmd")
 
-(defun eshell/su (&rest arguments)
+(defun eshell/su (&rest args)
   "Alias \"su\" to call TRAMP.
 
 Uses the system su through TRAMP's su method."
-  (setq arguments (eshell-stringify-list (flatten-tree arguments)))
   (eshell-eval-using-options
-   "su" arguments
+   "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")
@@ -77,10 +76,6 @@ Become another USER during a login session.")
                 (prefix (file-remote-p default-directory)))
             (dolist (arg args)
               (if (string-equal arg "-") (setq login t) (setq user arg)))
-            ;; `eshell-eval-using-options' tries to handle "-" as a
-            ;; short option; double-check whether the original
-            ;; arguments include it.
-            (when (member "-" arguments) (setq login t))
             (when login (setq dir "~/"))
             (if (and prefix
                      (or
index 8c29fff8096495f17291beb51009f536239884ba..0961e214f4f220727f417a1e101ac366c0a56726 100644 (file)
@@ -283,6 +283,9 @@ triggered to say that the switch is unrecognized."
                           (memq :parse-leading-options-only options))))
       (setq arg (nth ai eshell--args))
       (if (not (and (stringp arg)
+                    ;; A string of length 1 can't be an option; (if
+                    ;; it's "-", that generally means stdin).
+                    (> (length arg) 1)
                    (string-match "^-\\(-\\)?\\(.*\\)" arg)))
           ;; Positional argument found, skip
          (setq ai (1+ ai)
@@ -295,9 +298,9 @@ triggered to say that the switch is unrecognized."
              (if (> (length switch) 0)
                  (eshell--process-option name switch 1 ai options opt-vals)
                (setq ai (length eshell--args)))
-             (while (> (length switch) 0)
-               (setq switch (eshell--process-option name switch 0
-                                                     ai options opt-vals)))))))
+           (while (> (length switch) 0)
+             (setq switch (eshell--process-option name switch 0
+                                                   ai options opt-vals)))))))
     (nconc (mapcar #'cdr opt-vals) eshell--args)))
 
 (provide 'esh-opt)
index 4331c02ff5bf79c612b6b3d17be47825947404ad..5b30de414a32c863932819a396a9aa1f134b3f36 100644 (file)
    (should (equal ignore-pattern "*.txt"))
    (should (equal args '("/some/path")))))
 
+(ert-deftest esh-opt-test/eval-using-options-stdin ()
+  "Test that \"-\" is a positional arg in `eshell-eval-using-options'."
+  (eshell-eval-using-options
+   "cat" '("-")
+   '((?A "show-all" nil show-all
+         "show all characters"))
+   (should (eq show-all nil))
+   (should (equal args '("-"))))
+  (eshell-eval-using-options
+   "cat" '("-A" "-")
+   '((?A "show-all" nil show-all
+         "show all characters"))
+   (should (eq show-all t))
+   (should (equal args '("-"))))
+  (eshell-eval-using-options
+   "cat" '("-" "-A")
+   '((?A "show-all" nil show-all
+         "show all characters"))
+   (should (eq show-all t))
+   (should (equal args '("-")))))
+
 (ert-deftest esh-opt-test/eval-using-options-terminate-options ()
   "Test that \"--\" terminates options in `eshell-eval-using-options'."
   (eshell-eval-using-options