From 95983b950a75b69cc6b70cd5be70808747718cc8 Mon Sep 17 00:00:00 2001 From: Stefan Monnier Date: Mon, 6 Mar 2006 20:09:17 +0000 Subject: [PATCH] (PC-expand-many-files): Try be more careful when parsing the shell's output. --- lisp/ChangeLog | 5 +++++ lisp/complete.el | 27 ++++++++++++++++++++------- 2 files changed, 25 insertions(+), 7 deletions(-) diff --git a/lisp/ChangeLog b/lisp/ChangeLog index c972a0d694d..8b3dba4f4cd 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,8 @@ +2006-03-06 Stefan Monnier + + * complete.el (PC-expand-many-files): Try be more careful when parsing + the shell's output. + 2006-03-05 Stefan Monnier * outline.el (hide-sublevels): Provide better interactive default. 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)))) -- 2.11.4.GIT