aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorzeertzjq <zeertzjq@outlook.com>2022-06-06 05:45:59 +0800
committerGitHub <noreply@github.com>2022-06-06 05:45:59 +0800
commitae02c02f1f71e8e3a5324c4857a03156c0691ad8 (patch)
treef6db1ec63d4d0ace7a4253321a57a933f0d37911 /src
parente4df1c9b9e61e79234684d30ca700b42f82bc34a (diff)
downloadrneovim-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.c2
-rw-r--r--src/nvim/testdir/test_functions.vim39
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)