Mercurial > emacs
changeset 69309:f0678aafb24e
(PC-expand-many-files): Try be more careful when parsing the shell's output.
author | Stefan Monnier <monnier@iro.umontreal.ca> |
---|---|
date | Mon, 06 Mar 2006 20:09:17 +0000 |
parents | 53ba4b6eeb04 |
children | 270a2959d019 |
files | lisp/ChangeLog lisp/complete.el |
diffstat | 2 files changed, 25 insertions(+), 7 deletions(-) [+] |
line wrap: on
line diff
--- a/lisp/ChangeLog Mon Mar 06 18:41:53 2006 +0000 +++ b/lisp/ChangeLog Mon Mar 06 20:09:17 2006 +0000 @@ -1,3 +1,8 @@ +2006-03-06 Stefan Monnier <monnier@iro.umontreal.ca> + + * complete.el (PC-expand-many-files): Try be more careful when parsing + the shell's output. + 2006-03-05 Stefan Monnier <monnier@iro.umontreal.ca> * outline.el (hide-sublevels): Provide better interactive default.
--- a/lisp/complete.el Mon Mar 06 18:41:53 2006 +0000 +++ b/lisp/complete.el Mon Mar 06 20:09:17 2006 +0000 @@ -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 @@ :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 @@ :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 @@ (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 @@ "\\)\\'"))) (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))))