summaryrefslogtreecommitdiff
path: root/src/dired.c
diff options
context:
space:
mode:
authorBrian Fox <bfox@gnu.org>1993-09-22 18:25:03 +0000
committerBrian Fox <bfox@gnu.org>1993-09-22 18:25:03 +0000
commit1e564700087c7937686e771cbe718f51a8d25762 (patch)
tree5b8259b7fb805ea2858daede3c2ca04fcc19545d /src/dired.c
parente6c4ee0323bd348a9d4ec92bc7d643ea1de80a60 (diff)
downloademacs-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.c36
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;
}
}
}