diff options
author | Eli Zaretskii <eliz@gnu.org> | 2019-11-09 21:56:30 +0200 |
---|---|---|
committer | Eli Zaretskii <eliz@gnu.org> | 2019-11-09 21:56:30 +0200 |
commit | f2019fc676c2206bbdc53855e3bc4f1086676d3d (patch) | |
tree | 5396d1b08da9f2592ac76fffee3b5bd93b19b70c | |
parent | a1a724d73afae87b8c4daa2d64382be06fa37d0e (diff) | |
download | emacs-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.c | 15 | ||||
-rw-r--r-- | test/src/minibuf-tests.el | 11 |
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 |