]> git.eshelyaron.com Git - emacs.git/commitdiff
Handle escaped characters in Eshell argument predicates/modifiers
authorJim Porter <jporterbugs@gmail.com>
Wed, 27 Apr 2022 04:51:23 +0000 (21:51 -0700)
committerLars Ingebrigtsen <larsi@gnus.org>
Sun, 1 May 2022 18:41:21 +0000 (20:41 +0200)
* lisp/eshell/em-pred.el (eshell-get-delimited-modifier-argument):
Unescape escaped characters.

* test/lisp/eshell/em-pred-tests.el (em-pred-test/predicate-escaping):
New test (bug#55204).

lisp/eshell/em-pred.el
test/lisp/eshell/em-pred-tests.el

index 594563554d27ce204ff8ee95c4ec73d4b5ef7fc8..d73976d34640b125ec43fe5080a0663097a29b11 100644 (file)
@@ -416,7 +416,9 @@ before the closing delimiter. This allows modifiers like
               (close (cdr (assoc open eshell-pred-delimiter-pairs)))
               (end (eshell-find-delimiter open close nil nil t)))
     (prog1
-        (buffer-substring-no-properties (1+ (point)) end)
+        (replace-regexp-in-string
+         (rx-to-string `(seq "\\" (group (or "\\" ,open ,close)))) "\\1"
+         (buffer-substring-no-properties (1+ (point)) end))
       (goto-char (if (and chained-p (eq open close))
                      end
                    (1+ end))))))
index 4d2af392923e78f23ed888c0eadf72c982ef180f..3b50543d69a37ba5907f3a579e9bcd71dc00bd03 100644 (file)
@@ -533,4 +533,16 @@ PREDICATE is the predicate used to query that attribute."
                     (format ":j%c-%c" (car delims) (cdr delims)))
                    "foo-bar-baz"))))
 
+(ert-deftest em-pred-test/predicate-escaping ()
+  "Test string escaping in predicate and modifier parameters."
+  ;; Escaping the delimiter should remove the backslash.
+  (should (equal (eshell-eval-predicate '("foo" "bar" "baz") ":j'\\''")
+                 "foo'bar'baz"))
+  ;; Escaping a backlash should remove the first backslash.
+  (should (equal (eshell-eval-predicate '("foo" "bar" "baz") ":j'\\\\'")
+                 "foo\\bar\\baz"))
+  ;; Escaping a different character should keep the backslash.
+  (should (equal (eshell-eval-predicate '("foo" "bar" "baz") ":j'\\\"'")
+                 "foo\\\"bar\\\"baz")))
+
 ;; em-pred-tests.el ends here