diff options
author | zeertzjq <zeertzjq@outlook.com> | 2024-01-13 08:29:54 +0800 |
---|---|---|
committer | zeertzjq <zeertzjq@outlook.com> | 2024-01-13 08:31:01 +0800 |
commit | 64a50d08c4866011be73d6af0e8ae90e06c3f949 (patch) | |
tree | 49958ccc99d0dde40e37abaf1a8e0c4f31715112 | |
parent | 2783b6b0a48389f5e12109d9894269768c3e9fe5 (diff) | |
download | rneovim-64a50d08c4866011be73d6af0e8ae90e06c3f949.tar.gz rneovim-64a50d08c4866011be73d6af0e8ae90e06c3f949.tar.bz2 rneovim-64a50d08c4866011be73d6af0e8ae90e06c3f949.zip |
vim-patch:9.1.0021: i_CTRL-R- doesn't work for multibyte chars in Replace mode
Problem: i_CTRL-R- doesn't work for multibyte chars in Replace mode,
Coverity complains missing return value for u_save_cursor()
Solution: Use mb_charlen() and del_chars() instead, handle failure mode
for u_save_cursor() correctly (@zeertzjq)
closes: vim/vim#13846
https://github.com/vim/vim/commit/424ec1f235a53131042aed94d30f6e2528e551d9
-rw-r--r-- | src/nvim/ops.c | 5 | ||||
-rw-r--r-- | test/old/testdir/test_registers.vim | 16 |
2 files changed, 18 insertions, 3 deletions
diff --git a/src/nvim/ops.c b/src/nvim/ops.c index 32095177be..84cba5d05c 100644 --- a/src/nvim/ops.c +++ b/src/nvim/ops.c @@ -1286,7 +1286,10 @@ int insert_reg(int regname, bool literally_arg) if ((State & REPLACE_FLAG) != 0) { pos_T curpos; u_save_cursor(); - del_bytes((colnr_T)strlen(reg->y_array[0]), true, false); + if (u_save_cursor() == FAIL) { + return FAIL; + } + del_chars(mb_charlen(reg->y_array[0]), true); curpos = curwin->w_cursor; if (oneright() == FAIL) { // hit end of line, need to put forward (after the current position) diff --git a/test/old/testdir/test_registers.vim b/test/old/testdir/test_registers.vim index 7cc5ebbe6f..bc90de806f 100644 --- a/test/old/testdir/test_registers.vim +++ b/test/old/testdir/test_registers.vim @@ -893,7 +893,7 @@ endfunc func Test_insert_small_delete_replace_mode() new call setline(1, ['foo', 'bar', 'foobar', 'bar']) - let @-='foo' + let @- = 'foo' call cursor(2, 1) exe ":norm! R\<C-R>-\<C-R>-" call assert_equal('foofoo', getline(2)) @@ -904,9 +904,21 @@ func Test_insert_small_delete_replace_mode() exe ":norm! R\<C-R>-ZZZZ" call assert_equal(['foo', 'foofoo', '', 'bfoobarZZZZ'], getline(1, 4)) call cursor(1, 1) - let @-='' + let @- = '' exe ":norm! R\<C-R>-ZZZ" call assert_equal(['ZZZ', 'foofoo', '', 'bfoobarZZZZ'], getline(1, 4)) + let @- = 'βbβ' + call cursor(4, 1) + exe ":norm! R\<C-R>-" + call assert_equal(['ZZZ', 'foofoo', '', 'βbβobarZZZZ'], getline(1, 4)) + let @- = 'bβb' + call cursor(4, 1) + exe ":norm! R\<C-R>-" + call assert_equal(['ZZZ', 'foofoo', '', 'bβbobarZZZZ'], getline(1, 4)) + let @- = 'βbβ' + call cursor(4, 1) + exe ":norm! R\<C-R>-" + call assert_equal(['ZZZ', 'foofoo', '', 'βbβobarZZZZ'], getline(1, 4)) bwipe! endfunc |