diff options
author | Brian Fox <bfox@gnu.org> | 1993-09-22 18:25:03 +0000 |
---|---|---|
committer | Brian Fox <bfox@gnu.org> | 1993-09-22 18:25:03 +0000 |
commit | 1e564700087c7937686e771cbe718f51a8d25762 (patch) | |
tree | 5b8259b7fb805ea2858daede3c2ca04fcc19545d /src/dired.c | |
parent | e6c4ee0323bd348a9d4ec92bc7d643ea1de80a60 (diff) | |
download | emacs-1e564700087c7937686e771cbe718f51a8d25762.tar.gz |
(file_name_completion): Install case-preserving changes from Emacs 18
for completion_ignore_case.
(completion_ignore_case): Declare.
Diffstat (limited to 'src/dired.c')
-rw-r--r-- | src/dired.c | 36 |
1 files changed, 33 insertions, 3 deletions
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; } } } |