# HG changeset patch # User Stefan Monnier # Date 1237316740 0 # Node ID 7183ab1b842ab6c67dfd1d7b0892480c37514ec4 # Parent ace8aa76b9b543090b0c749ee3ccce2e760df711 (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. diff -r ace8aa76b9b5 -r 7183ab1b842a src/ChangeLog --- 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 + + * 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 * minibuf.c (Vminibuffer_completion_confirm): Doc fix. diff -r ace8aa76b9b5 -r 7183ab1b842a src/dired.c --- 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; + } }