changeset 102621:7183ab1b842a

(file_name_completion): Check completion-ignored-extensions only if the entry can't affect bestmatch anyway. Stop the search early, as Ftry_completion already does.
author Stefan Monnier <monnier@iro.umontreal.ca>
date Tue, 17 Mar 2009 19:05:40 +0000
parents ace8aa76b9b5
children d4e19d304e30
files src/ChangeLog src/dired.c
diffstat 2 files changed, 33 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/src/ChangeLog	Tue Mar 17 10:32:20 2009 +0000
+++ b/src/ChangeLog	Tue Mar 17 19:05:40 2009 +0000
@@ -1,3 +1,9 @@
+2009-03-17  Stefan Monnier  <monnier@iro.umontreal.ca>
+
+	* dired.c (file_name_completion): Check completion-ignored-extensions
+	only if the entry can't affect bestmatch anyway.
+	Stop the search early, as Ftry_completion already does.
+
 2009-03-17  Chong Yidong  <cyd@stupidchicken.com>
 
 	* minibuf.c (Vminibuffer_completion_confirm): Doc fix.
--- a/src/dired.c	Tue Mar 17 10:32:20 2009 +0000
+++ b/src/dired.c	Tue Mar 17 19:05:40 2009 +0000
@@ -537,6 +537,18 @@
       if (!all_flag)
 	{
 	  int skip;
+
+	  /* If this entry matches the current bestmatch, the only
+	     thing it can do is increase matchcount, so don't bother
+	     investigating it any further.  */
+	  if (!completion_ignore_case
+	      /* The return result depends on whether it's the sole match.  */
+	      && matchcount > 1
+	      && !includeall /* This match may allow includeall to 0.  */
+	      && len >= bestmatchsize
+	      && 0 > scmp (dp->d_name, SDATA (bestmatch), bestmatchsize))
+	    continue;
+
 	  if (directoryp)
 	    {
 #ifndef TRIVIAL_DIRECTORY_ENTRY
@@ -705,8 +717,7 @@
 	      /* This tests that the current file is an exact match
 		 but BESTMATCH is not (it is too long).  */
 	      if ((matchsize == SCHARS (name)
-		   && matchsize + !!directoryp
-		   < SCHARS (bestmatch))
+		   && matchsize + !!directoryp < SCHARS (bestmatch))
 		  ||
 		  /* If there is no exact match ignoring case,
 		     prefer a match that does not change the case
@@ -734,6 +745,20 @@
 		bestmatch = name;
 	    }
 	  bestmatchsize = matchsize;
+
+	  /* If the best completion so far is reduced to the string
+	     we're trying to complete, then we already know there's no
+	     other completion, so there's no point looking any further.  */
+	  if (matchsize <= SCHARS (file)
+	      && !includeall /* A future match may allow includeall to 0.  */
+	      /* If completion-ignore-case is non-nil, don't
+		 short-circuit because we want to find the best
+		 possible match *including* case differences.  */
+	      && (!completion_ignore_case || matchsize == 0)
+	      /* The return value depends on whether it's the sole match.  */
+	      && matchcount > 1)
+	    break;
+
 	}
     }