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))))