]> git.ipfire.org Git - thirdparty/vim.git/commitdiff
patch 9.1.0938: exclusive selection not respected when re-selecting block mode v9.1.0938
authorChristian Brabandt <cb@256bit.org>
Mon, 16 Dec 2024 21:49:15 +0000 (22:49 +0100)
committerChristian Brabandt <cb@256bit.org>
Mon, 16 Dec 2024 21:49:15 +0000 (22:49 +0100)
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: #16202
closes: #16219

Signed-off-by: Christian Brabandt <cb@256bit.org>
src/normal.c
src/testdir/test_visual.vim
src/version.c

index 87e2cd4750c193d77ef5b17e56f33d00a1fb7ebd..6cf2b9d2f3118abe9f2d2558b76c428bd15b7d04 100644 (file)
@@ -5518,6 +5518,8 @@ nv_visual(cmdarg_T *cap)
                update_curswant_force();
                curwin->w_curswant += resel_VIsual_vcol * cap->count0 - 1;
                curwin->w_cursor.lnum = lnum;
+               if (*p_sel == 'e')
+                   ++curwin->w_curswant;
                coladvance(curwin->w_curswant);
            }
            else
index 3750ebf6b9986e46304503f4fd6d5e430791e950..0be73ecc1342b9f9e75016ec2d9867b0a53206fe 100644 (file)
@@ -2714,4 +2714,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
index b52eaaedaffa1d4ccd095700a401e8c332ec61d7..1bf116308c50e7482250430e4cbbe4500ce28beb 100644 (file)
@@ -704,6 +704,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    938,
 /**/
     937,
 /**/