summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEli Zaretskii <eliz@gnu.org>2019-11-09 21:56:30 +0200
committerEli Zaretskii <eliz@gnu.org>2019-11-09 21:56:30 +0200
commitf2019fc676c2206bbdc53855e3bc4f1086676d3d (patch)
tree5396d1b08da9f2592ac76fffee3b5bd93b19b70c
parenta1a724d73afae87b8c4daa2d64382be06fa37d0e (diff)
downloademacs-f2019fc676c2206bbdc53855e3bc4f1086676d3d.tar.gz
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)
-rw-r--r--src/minibuf.c15
-rw-r--r--test/src/minibuf-tests.el11
2 files changed, 21 insertions, 5 deletions
diff --git a/src/minibuf.c b/src/minibuf.c
index f6cf47f1f28..1e87c5044af 100644
--- a/src/minibuf.c
+++ b/src/minibuf.c
@@ -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;
diff --git a/test/src/minibuf-tests.el b/test/src/minibuf-tests.el
index 12b018b8228..c64892822d6 100644
--- a/test/src/minibuf-tests.el
+++ b/test/src/minibuf-tests.el
@@ -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