diff options
author | Stefan Monnier <[email protected]> | 2009-03-17 19:05:40 +0000 |
---|---|---|
committer | Stefan Monnier <[email protected]> | 2009-03-17 19:05:40 +0000 |
commit | 2cd298e2db4ef3cd64ee7553a21c4bd7f01f1cd4 (patch) | |
tree | 07655e5c0af95641abac2cbb15d62d1a6cac9a61 /src/dired.c | |
parent | e597afcb8ba631d19988f77c7f3d9cd46444b542 (diff) |
(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.
Diffstat (limited to 'src/dired.c')
-rw-r--r-- | src/dired.c | 29 |
1 files changed, 27 insertions, 2 deletions
diff --git a/src/dired.c b/src/dired.c index 0779fcd3c8..b6bc706773 100644 --- a/src/dired.c +++ b/src/dired.c @@ -537,6 +537,18 @@ file_name_completion (file, dirname, all_flag, ver_flag, predicate) 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 @@ file_name_completion (file, dirname, all_flag, ver_flag, predicate) /* 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 @@ file_name_completion (file, dirname, all_flag, ver_flag, predicate) 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; + } } |