diff options
author | zeertzjq <zeertzjq@outlook.com> | 2022-06-06 05:45:59 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-06-06 05:45:59 +0800 |
commit | ae02c02f1f71e8e3a5324c4857a03156c0691ad8 (patch) | |
tree | f6db1ec63d4d0ace7a4253321a57a933f0d37911 /src | |
parent | e4df1c9b9e61e79234684d30ca700b42f82bc34a (diff) | |
download | rneovim-ae02c02f1f71e8e3a5324c4857a03156c0691ad8.tar.gz rneovim-ae02c02f1f71e8e3a5324c4857a03156c0691ad8.tar.bz2 rneovim-ae02c02f1f71e8e3a5324c4857a03156c0691ad8.zip |
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.
Diffstat (limited to 'src')
-rw-r--r-- | src/nvim/getchar.c | 2 | ||||
-rw-r--r-- | src/nvim/testdir/test_functions.vim | 39 |
2 files changed, 40 insertions, 1 deletions
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? \")\<CR>B\<CR>", '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')\<CR>\<CR>", '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')\<CR>" + \ .. "\<C-A>\<CR>", '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\\<BS>y\")\<CR>\<CR>", 'xt') + call assert_equal('y', c) + + " Test for using text with composing characters as default input + call feedkeys(":let c = input('name? ', \"ã̳\")\<CR>\<CR>", 'xt') + call assert_equal('ã̳', c) + + " Test for using <CR> as default input + call feedkeys(":let c = input('name? ', \"\\<CR>\")\<CR>x\<CR>", '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'])\<cr>1\<cr>", 'tx') call assert_equal(1, c) |