;;; esh-arg.el --- argument processing
-;; Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004,
-;; 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
+;; Copyright (C) 1999-2011 Free Software Foundation, Inc.
;; Author: John Wiegley <johnw@gnu.org>
(goto-char (match-end 0))
(let ((str (match-string 0)))
(if (> (length str) 0)
- (add-text-properties 0 1 '(number t) str))
+ (add-text-properties 0 (length str) '(number t) str))
str))))
;; parse any non-special characters, based on the current context
;; argument delimiter
'eshell-parse-delimiter)
- "*Define how to process Eshell command line arguments.
+ "Define how to process Eshell command line arguments.
When each function on this hook is called, point will be at the
current position within the argument list. The function should either
return nil, meaning that it did no argument parsing, or it should
;;; User Variables:
(defcustom eshell-arg-load-hook '(eshell-arg-initialize)
- "*A hook that gets run when `eshell-arg' is loaded."
+ "A hook that gets run when `eshell-arg' is loaded."
:type 'hook
:group 'eshell-arg)
-(defcustom eshell-delimiter-argument-list '(?\; ?& ?\| ?\> ? ?\t ?\n)
+(defcustom eshell-delimiter-argument-list '(?\; ?& ?\| ?\> ?\s ?\t ?\n)
"List of characters to recognize as argument separators."
:type '(repeat character)
:group 'eshell-arg)
(defcustom eshell-special-chars-inside-quoting '(?\\ ?\")
- "*Characters which are still special inside double quotes."
+ "Characters which are still special inside double quotes."
:type '(repeat character)
:group 'eshell-arg)
(defcustom eshell-special-chars-outside-quoting
(append eshell-delimiter-argument-list '(?# ?! ?\\ ?\" ?\'))
- "*Characters that require escaping outside of double quotes.
+ "Characters that require escaping outside of double quotes.
Without escaping them, they will introduce a change in the argument."
:type '(repeat character)
:group 'eshell-arg)
(narrow-to-region beg end)
(let ((inhibit-point-motion-hooks t)
(args (list t))
- after-change-functions
delim)
- (remove-text-properties (point-min) (point-max)
- '(arg-begin nil arg-end nil))
- (if (setq
- delim
- (catch 'eshell-incomplete
- (while (not (eobp))
- (let* ((here (point))
- (arg (eshell-parse-argument)))
- (if (= (point) here)
- (error "Failed to parse argument '%s'"
- (buffer-substring here (point-max))))
- (and arg (nconc args (list arg)))))))
- (if (listp delim)
- (throw 'eshell-incomplete delim)
- (throw 'eshell-incomplete
- (list delim (point) (cdr args)))))
- (cdr args)))))
+ (with-silent-modifications
+ (remove-text-properties (point-min) (point-max)
+ '(arg-begin nil arg-end nil))
+ (if (setq
+ delim
+ (catch 'eshell-incomplete
+ (while (not (eobp))
+ (let* ((here (point))
+ (arg (eshell-parse-argument)))
+ (if (= (point) here)
+ (error "Failed to parse argument '%s'"
+ (buffer-substring here (point-max))))
+ (and arg (nconc args (list arg)))))))
+ (throw 'eshell-incomplete (if (listp delim)
+ delim
+ (list delim (point) (cdr args)))))
+ (cdr args))))))
(defun eshell-parse-argument ()
"Get the next argument. Leave point after it."
(= (+ pos 2) (point-max))))))
(defun eshell-quote-backslash (string &optional index)
- "Intelligently backslash the character occuring in STRING at INDEX.
+ "Intelligently backslash the character occurring in STRING at INDEX.
If the character is itself a backslash, it needs no escaping."
(let ((char (aref string index)))
- (if (eq char ?\\)
+ (if (and (eq char ?\\)
+ ;; In Emacs directory-sep-char is always ?/, so this does nothing.
+ (not (and (featurep 'xemacs)
+ (featurep 'mswindows)
+ (eq directory-sep-char ?\\)
+ (eq (1- (string-width string))
+ index))))
(char-to-string char)
(if (memq char eshell-special-chars-outside-quoting)
(string ?\\ char)))))
(char-to-string (char-after)))))
(goto-char end)))))))
-;; arch-tag: 7f593a2b-8fc1-4def-8f84-8f51ed0198d6
;;; esh-arg.el ends here