# HG changeset patch # User Brian Fox # Date 748722303 0 # Node ID 76f267188bbdf1ad866a60004c72b19d0b47113b # Parent 21ed9c9bb2102acba1e0e84a1089eb6d41a879a5 (file_name_completion): Install case-preserving changes from Emacs 18 for completion_ignore_case. (completion_ignore_case): Declare. diff -r 21ed9c9bb210 -r 76f267188bbd src/dired.c --- a/src/dired.c Wed Sep 22 18:16:37 1993 +0000 +++ b/src/dired.c Wed Sep 22 18:25:03 1993 +0000 @@ -80,6 +80,7 @@ #define lstat stat #endif +extern int completion_ignore_case; extern Lisp_Object Ffind_file_name_handler (); Lisp_Object Vcompletion_ignored_extensions; @@ -392,14 +393,43 @@ matchsize = scmp(p1, p2, compare); if (matchsize < 0) matchsize = compare; - /* If this dirname all matches, - see if implicit following slash does too. */ + if (completion_ignore_case) + { + /* If this is an exact match except for case, + use it as the best match rather than one that is not + an exact match. This way, we get the case pattern + of the actual match. */ + if ((matchsize == len + && matchsize + !!directoryp + < XSTRING (bestmatch)->size) + || + /* If there is no exact match ignoring case, + prefer a match that does not change the case + of the input. */ + (((matchsize == len) + == + (matchsize + !!directoryp + == XSTRING (bestmatch)->size)) + /* If there is more than one exact match aside from + case, and one of them is exact including case, + prefer that one. */ + && !bcmp (p2, XSTRING (file)->data, XSTRING (file)->size) + && bcmp (p1, XSTRING (file)->data, XSTRING (file)->size))) + { + bestmatch = make_string (dp->d_name, len); + if (directoryp) + bestmatch = Ffile_name_as_directory (bestmatch); + } + } + + /* If this dirname all matches, see if implicit following + slash does too. */ if (directoryp && compare == matchsize && bestmatchsize > matchsize && p1[matchsize] == '/') matchsize++; - bestmatchsize = min (matchsize, bestmatchsize); + bestmatchsize = matchsize; } } }