diff options
Diffstat (limited to 'lisp')
-rw-r--r-- | lisp/ChangeLog | 4 | ||||
-rw-r--r-- | lisp/shell.el | 26 |
2 files changed, 26 insertions, 4 deletions
diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 8a57fe75405..552c3f5c088 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,7 @@ +2011-08-28 Stefan Monnier <monnier@iro.umontreal.ca> + + * shell.el (shell-parse-pcomplete-arguments): Unquote args (bug#9160). + 2011-08-27 Alan Mackenzie <acm@muc.de> * progmodes/cc-menus.el (cc-imenu-c++-generic-expression): Make it diff --git a/lisp/shell.el b/lisp/shell.el index 01d1a688f0e..909ebb48afc 100644 --- a/lisp/shell.el +++ b/lisp/shell.el @@ -393,10 +393,28 @@ to `dirtrack-mode'." (while (< (point) end) (skip-chars-forward " \t\n") (push (point) begins) - (looking-at "\\(?:[^\s\t\n\\]\\|'[^']*'\\|\"\\(?:[^\"\\]\\|\\\\.\\)*\"\\|\\\\.\\)*\\(?:\\\\\\|'[^']*\\|\"\\(?:[^\"\\]\\|\\\\.\\)*\\)?") - (goto-char (match-end 0)) - (push (buffer-substring-no-properties (car begins) (point)) - args)) + (let ((arg ())) + (while (looking-at + (eval-when-compile + (concat + "\\(?:[^\s\t\n\\\"']+" + "\\|'\\([^']*\\)'?" + "\\|\"\\(\\(?:[^\"\\]\\|\\\\.\\)*\\)\"?" + "\\|\\\\\\(\\(?:.\\|\n\\)?\\)\\)"))) + (goto-char (match-end 0)) + (cond + ((match-beginning 3) ;Backslash escape. + (push (if (= (match-beginning 3) (match-end 3)) + "\\" (match-string 3)) + arg)) + ((match-beginning 2) ;Double quote. + (push (replace-regexp-in-string + "\\\\\\(.\\)" "\\1" (match-string 2)) + arg)) + ((match-beginning 1) ;Single quote. + (push (match-string 1) arg)) + (t (push (match-string 0) arg)))) + (push (mapconcat #'identity (nreverse arg) "") args))) (cons (nreverse args) (nreverse begins))))) (defun shell-completion-vars () |