aboutsummaryrefslogtreecommitdiffstats
path: root/src/dired.c
diff options
context:
space:
mode:
authorStefan Monnier <[email protected]>2009-03-17 19:05:40 +0000
committerStefan Monnier <[email protected]>2009-03-17 19:05:40 +0000
commit2cd298e2db4ef3cd64ee7553a21c4bd7f01f1cd4 (patch)
tree07655e5c0af95641abac2cbb15d62d1a6cac9a61 /src/dired.c
parente597afcb8ba631d19988f77c7f3d9cd46444b542 (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.c29
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;
+
}
}