From: Brian Fox Date: Wed, 22 Sep 1993 18:25:03 +0000 (+0000) Subject: (file_name_completion): Install case-preserving changes from Emacs 18 X-Git-Tag: emacs-19.34~11073 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=97e98a56769de54b19b95de880b777b185bb2ca6;p=emacs.git (file_name_completion): Install case-preserving changes from Emacs 18 for completion_ignore_case. (completion_ignore_case): Declare. --- diff --git a/src/dired.c b/src/dired.c index ff51345183b..410729fe3dc 100644 --- a/src/dired.c +++ b/src/dired.c @@ -80,6 +80,7 @@ extern struct re_pattern_buffer searchbuf; #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 @@ file_name_completion (file, dirname, all_flag, ver_flag) 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; } } }