diff options
author | zeertzjq <zeertzjq@outlook.com> | 2024-12-17 09:03:26 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-12-17 09:03:26 +0800 |
commit | 15153c4cd5319652bcdcd608fe5d4f0fa1eb9419 (patch) | |
tree | a1c7d651870d90a102fe006d203f0060eb8711fa | |
parent | 137308a3c9b658c7dc9268201dfaea4d601b79c7 (diff) | |
download | rneovim-15153c4cd5319652bcdcd608fe5d4f0fa1eb9419.tar.gz rneovim-15153c4cd5319652bcdcd608fe5d4f0fa1eb9419.tar.bz2 rneovim-15153c4cd5319652bcdcd608fe5d4f0fa1eb9419.zip |
vim-patch:9.1.0938: exclusive selection not respected when re-selecting block mode (#31603)
Problem: exclusive selection not respected when re-selecting block mode
(Matt Ellis)
Solution: advance selection by another character when using
selection=exclusive and visual block mode
fixes: vim/vim#16202
closes: vim/vim#16219
https://github.com/vim/vim/commit/bb955894734b287abfadd3a25786a42038d18d61
Co-authored-by: Christian Brabandt <cb@256bit.org>
-rw-r--r-- | src/nvim/normal.c | 3 | ||||
-rw-r--r-- | test/old/testdir/test_visual.vim | 46 |
2 files changed, 49 insertions, 0 deletions
diff --git a/src/nvim/normal.c b/src/nvim/normal.c index 4d2abf1c8c..a664535c0f 100644 --- a/src/nvim/normal.c +++ b/src/nvim/normal.c @@ -5038,6 +5038,9 @@ static void nv_visual(cmdarg_T *cap) assert(cap->count0 >= INT_MIN && cap->count0 <= INT_MAX); curwin->w_curswant += resel_VIsual_vcol * cap->count0 - 1; curwin->w_cursor.lnum = lnum; + if (*p_sel == 'e') { + curwin->w_curswant++; + } coladvance(curwin, curwin->w_curswant); } else { curwin->w_set_curswant = true; diff --git a/test/old/testdir/test_visual.vim b/test/old/testdir/test_visual.vim index e25327ddd4..39388cbc27 100644 --- a/test/old/testdir/test_visual.vim +++ b/test/old/testdir/test_visual.vim @@ -2718,4 +2718,50 @@ func Test_visual_block_cursor_insert_enter() bwipe! endfunc +func Test_visual_block_exclusive_selection() + new + set selection=exclusive + call setline(1, ['asöd asdf', 'asdf asdf', 'as€d asdf', 'asdf asdf']) + call cursor(1, 1) + exe ":norm! \<c-v>eh3j~" + call assert_equal(['ASÖd asdf', 'ASDf asdf', 'AS€d asdf', 'ASDf asdf'], getline(1, '$')) + exe ":norm! 1v~" + call assert_equal(['asöd asdf', 'asdf asdf', 'as€d asdf', 'asdf asdf'], getline(1, '$')) + bwipe! + set selection&vim +endfunc + +func Test_visual_block_exclusive_selection_adjusted() + new + " Test that the end-position of the visual selection is adjusted for exclusive selection + set selection=exclusive + call setline(1, ['asöd asdf ', 'asdf asdf ', 'as€d asdf ', 'asdf asdf ']) + call cursor(1, 1) + " inclusive motion + exe ":norm! \<c-v>e3jy" + call assert_equal([0, 4, 5, 0], getpos("'>")) + " exclusive motion + exe ":norm! \<c-v>ta3jy" + call assert_equal([0, 4, 6, 0], getpos("'>")) + " another inclusive motion + exe ":norm! \<c-v>g_3jy" + call assert_equal([0, 4, 10, 0], getpos("'>")) + + " Reset selection option to Vim default + set selection&vim + call cursor(1, 1) + + " inclusive motion + exe ":norm! \<c-v>e3jy" + call assert_equal([0, 4, 4, 0], getpos("'>")) + " exclusive motion + exe ":norm! \<c-v>ta3jy" + call assert_equal([0, 4, 5, 0], getpos("'>")) + " another inclusive motion + exe ":norm! \<c-v>g_3jy" + call assert_equal([0, 4, 9, 0], getpos("'>")) + bwipe! + set selection&vim +endfunc + " vim: shiftwidth=2 sts=2 expandtab |