Commit f2019fc6 authored by Eli Zaretskii's avatar Eli Zaretskii

Fix case-insensitive completion of buffer names

* test/src/minibuf-tests.el (test-try-completion-ignore-case):
New test, suggested by Stefan Monnier <monnier@iro.umontreal.ca>.

* src/minibuf.c (Ftry_completion): Don't treat strings that
are identical but for the case as if they were identical for
the purposes of not counting the same string twice.  This
fixes case-insensitive completion when all the candidates are
identical but for the letter-case.  (Bug#11339)
parent a1a724d7
Pipeline #3986 failed with stage
in 90 minutes and 2 seconds
......@@ -1323,13 +1323,13 @@ is used to further constrain the set of candidates. */)
else
{
compare = min (bestmatchsize, SCHARS (eltstring));
tem = Fcompare_strings (bestmatch, zero,
make_fixnum (compare),
eltstring, zero,
make_fixnum (compare),
Lisp_Object lcompare = make_fixnum (compare);
tem = Fcompare_strings (bestmatch, zero, lcompare,
eltstring, zero, lcompare,
completion_ignore_case ? Qt : Qnil);
matchsize = EQ (tem, Qt) ? compare : eabs (XFIXNUM (tem)) - 1;
Lisp_Object old_bestmatch = bestmatch;
if (completion_ignore_case)
{
/* If this is an exact match except for case,
......@@ -1363,7 +1363,12 @@ is used to further constrain the set of candidates. */)
bestmatch = eltstring;
}
if (bestmatchsize != SCHARS (eltstring)
|| bestmatchsize != matchsize)
|| bestmatchsize != matchsize
|| (completion_ignore_case
&& !EQ (Fcompare_strings (old_bestmatch, zero, lcompare,
eltstring, zero, lcompare,
Qnil),
Qt)))
/* Don't count the same string multiple times. */
matchcount += matchcount <= 1;
bestmatchsize = matchsize;
......
......@@ -399,5 +399,16 @@
(minibuf-tests--test-completion-regexp
#'minibuf-tests--strings-to-symbol-hashtable))
(ert-deftest test-try-completion-ignore-case ()
(let ((completion-ignore-case t))
(should (equal (try-completion "bar" '("bAr" "barfoo")) "bAr"))
(should (equal (try-completion "bar" '("bArfoo" "barbaz")) "bar"))
(should (equal (try-completion "bar" '("bArfoo" "barbaz"))
(try-completion "bar" '("barbaz" "bArfoo"))))
;; bug#11339
(should (equal (try-completion "baz" '("baz" "bAz")) "baz")) ;And not `t'!
(should (equal (try-completion "baz" '("bAz" "baz"))
(try-completion "baz" '("baz" "bAz"))))))
;;; minibuf-tests.el ends here
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment