]> git.eshelyaron.com Git - emacs.git/commitdiff
(PC-expand-many-files): Try be more careful when parsing the shell's output.
authorStefan Monnier <monnier@iro.umontreal.ca>
Mon, 6 Mar 2006 20:09:17 +0000 (20:09 +0000)
committerStefan Monnier <monnier@iro.umontreal.ca>
Mon, 6 Mar 2006 20:09:17 +0000 (20:09 +0000)
lisp/ChangeLog
lisp/complete.el

index c972a0d694d393142cf8f0e74aeb1020124849c2..8b3dba4f4cddf499b056b02cd5f340776477c806 100644 (file)
@@ -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.
index a48942d2df1e23797d99d465d4178008cfc21d2b..a50d02c41f056805e1c7da78c2099bddf1ce7c22 100644 (file)
@@ -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))))