diff options
author | Stefan Monnier <monnier@iro.umontreal.ca> | 2006-03-06 20:09:17 +0000 |
---|---|---|
committer | Stefan Monnier <monnier@iro.umontreal.ca> | 2006-03-06 20:09:17 +0000 |
commit | ec12ea19c8262315c550b14fd946497afc535d13 (patch) | |
tree | 07ed958be5af2c6109ce04e823f23bca95723d26 /lisp/complete.el | |
parent | 22fe53e85b4ebe875f881b428bbfdbc205c33207 (diff) | |
download | emacs-ec12ea19c8262315c550b14fd946497afc535d13.tar.gz |
(PC-expand-many-files): Try be more careful when parsing the shell's output.
Diffstat (limited to 'lisp/complete.el')
-rw-r--r-- | lisp/complete.el | 27 |
1 files changed, 20 insertions, 7 deletions
diff --git a/lisp/complete.el b/lisp/complete.el index a48942d2df1..a50d02c41f0 100644 --- a/lisp/complete.el +++ b/lisp/complete.el @@ -94,7 +94,7 @@ :group 'convenience) (defcustom PC-first-char 'find-file - "*Control how the first character of a string is to be interpreted. + "Control how the first character of a string is to be interpreted. If nil, the first character of a string is not taken literally if it is a word delimiter, so that \".e\" matches \"*.e*\". If t, the first character of a string is always taken literally even if it is a @@ -107,13 +107,13 @@ completion." :group 'partial-completion) (defcustom PC-meta-flag t - "*If non-nil, TAB means PC completion and M-TAB means normal completion. + "If non-nil, TAB means PC completion and M-TAB means normal completion. Otherwise, TAB means normal completion and M-TAB means Partial Completion." :type 'boolean :group 'partial-completion) (defcustom PC-word-delimiters "-_. " - "*A string of characters treated as word delimiters for completion. + "A string of characters treated as word delimiters for completion. Some arcane rules: If `]' is in this string, it must come first. If `^' is in this string, it must not come first. @@ -124,13 +124,13 @@ expression (not containing character ranges like `a-z')." :group 'partial-completion) (defcustom PC-include-file-path '("/usr/include" "/usr/local/include") - "*A list of directories in which to look for include files. + "A list of directories in which to look for include files. If nil, means use the colon-separated path in the variable $INCPATH instead." :type '(repeat directory) :group 'partial-completion) (defcustom PC-disable-includes nil - "*If non-nil, include-file support in \\[find-file] is disabled." + "If non-nil, include-file support in \\[find-file] is disabled." :type 'boolean :group 'partial-completion) @@ -764,7 +764,13 @@ or properties are considered." (erase-buffer) (shell-command (concat "echo " name) t) (goto-char (point-min)) - (if (looking-at ".*No match") + ;; CSH-style shells were known to output "No match", whereas + ;; SH-style shells tend to simply output `name' when no match is found. + (if (looking-at (concat ".*No match\\|\\(^\\| \\)\\(" + (regexp-quote name) + "\\|" + (regexp-quote (expand-file-name name)) + "\\)\\( \\|$\\)")) nil (insert "(\"") (while (search-forward " " nil t) @@ -787,7 +793,14 @@ or properties are considered." "\\)\\'"))) (setq p nil) (while files - (or (string-match PC-ignored-regexp (car files)) + ;; This whole process of going through to shell, to echo, and + ;; finally parsing the output is a hack. It breaks as soon as + ;; there are spaces in the file names or when the no-match + ;; message changes. To make up for it, we check that what we read + ;; indeed exists, so we may miss some files, but we at least won't + ;; list non-existent ones. + (or (not (file-exists-p (car files))) + (string-match PC-ignored-regexp (car files)) (setq p (cons (car files) p))) (setq files (cdr files))) p)))) |