+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.
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
/* 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
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;
+
}
}