From ae02c02f1f71e8e3a5324c4857a03156c0691ad8 Mon Sep 17 00:00:00 2001 From: zeertzjq Date: Mon, 6 Jun 2022 05:45:59 +0800 Subject: vim-patch:8.2.5058: input() does not handle composing characters properly (#18872) Problem: input() does not handle composing characters properly. Solution: Use mb_cptr2char_adv() instead of mb_ptr2char_adv(). (closes vim/vim#10527) https://github.com/vim/vim/commit/e3a529bc877909a9eccf792461050b4f6737ed33 Cherry-pick all of Test_input_func() from patch 8.2.0316. --- src/nvim/getchar.c | 2 +- src/nvim/testdir/test_functions.vim | 39 +++++++++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/nvim/getchar.c b/src/nvim/getchar.c index 85ac52cafd..e532735bef 100644 --- a/src/nvim/getchar.c +++ b/src/nvim/getchar.c @@ -629,7 +629,7 @@ void stuffReadbuffSpec(const char *s) stuffReadbuffLen(s, 3); s += 3; } else { - int c = mb_ptr2char_adv((const char_u **)&s); + int c = mb_cptr2char_adv((const char_u **)&s); if (c == CAR || c == NL || c == ESC) { c = ' '; } diff --git a/src/nvim/testdir/test_functions.vim b/src/nvim/testdir/test_functions.vim index 87606f17b8..2391b4a485 100644 --- a/src/nvim/testdir/test_functions.vim +++ b/src/nvim/testdir/test_functions.vim @@ -1180,6 +1180,45 @@ func Test_col() bw! endfunc +" Test for input() +func Test_input_func() + " Test for prompt with multiple lines + redir => v + call feedkeys(":let c = input(\"A\\nB\\nC\\n? \")\B\", 'xt') + redir END + call assert_equal("B", c) + call assert_equal(['A', 'B', 'C'], split(v, "\n")) + + " Test for default value + call feedkeys(":let c = input('color? ', 'red')\\", 'xt') + call assert_equal('red', c) + + " Test for completion at the input prompt + func! Tcomplete(arglead, cmdline, pos) + return "item1\nitem2\nitem3" + endfunc + call feedkeys(":let c = input('Q? ', '', 'custom,Tcomplete')\" + \ .. "\\", 'xt') + delfunc Tcomplete + call assert_equal('item1 item2 item3', c) + + " Test for using special characters as default input + call feedkeys(":let c = input('name? ', \"x\\y\")\\", 'xt') + call assert_equal('y', c) + + " Test for using text with composing characters as default input + call feedkeys(":let c = input('name? ', \"ã̳\")\\", 'xt') + call assert_equal('ã̳', c) + + " Test for using as default input + call feedkeys(":let c = input('name? ', \"\\\")\x\", 'xt') + call assert_equal(' x', c) + + call assert_fails("call input('F:', '', 'invalid')", 'E180:') + call assert_fails("call input('F:', '', [])", 'E730:') +endfunc + +" Test for inputlist() func Test_inputlist() call feedkeys(":let c = inputlist(['Select color:', '1. red', '2. green', '3. blue'])\1\", 'tx') call assert_equal(1, c) -- cgit