Mercurial > emacs
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; + } }