changeset 27418:6ecfb8d99353 v8.2.4237

patch 8.2.4237: record buffer wrong if character in Select mode was not typed Commit: https://github.com/vim/vim/commit/fbf4f1ca159028382eaeb3bfc31bb6bb96dbb67a Author: zeertzjq <zeertzjq@outlook.com> Date: Fri Jan 28 12:50:43 2022 +0000 patch 8.2.4237: record buffer wrong if character in Select mode was not typed Problem: Record buffer wrong if character in Select mode was not typed. Solution: Only delete the tail from the record buffer if the character was typed. (closes #9650)
author Bram Moolenaar <Bram@vim.org>
date Fri, 28 Jan 2022 14:00:04 +0100
parents 98239fdd09c5
children ae3d7c317382
files src/normal.c src/testdir/test_registers.vim src/version.c
diffstat 3 files changed, 17 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/src/normal.c
+++ b/src/normal.c
@@ -1054,9 +1054,10 @@ normal_cmd(
 	// be mapped in Insert mode.  Required for ":lmap" to work.
 	len = ins_char_typebuf(vgetc_char, vgetc_mod_mask);
 
-	// When recording the character will be recorded again, remove the
-	// previously recording.
-	ungetchars(len);
+	// When recording and gotchars() was called the character will be
+	// recorded again, remove the previous recording.
+	if (KeyTyped)
+	    ungetchars(len);
 
 	if (restart_edit != 0)
 	    c = 'd';
--- a/src/testdir/test_registers.vim
+++ b/src/testdir/test_registers.vim
@@ -745,6 +745,17 @@ func Test_record_in_select_mode()
   sil norm q00
   sil norm q
   call assert_equal('0ext', getline(1))
+
+  %delete
+  let @r = ''
+  call setline(1, ['abc', 'abc', 'abc'])
+  smap <F2> <Right><Right>,
+  call feedkeys("qrgh\<F2>Dk\<Esc>q", 'xt')
+  call assert_equal("gh\<F2>Dk\<Esc>", @r)
+  norm j0@rj0@@
+  call assert_equal([',Dk', ',Dk', ',Dk'], getline(1, 3))
+  sunmap <F2>
+
   bwipe!
 endfunc
 
--- a/src/version.c
+++ b/src/version.c
@@ -751,6 +751,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    4237,
+/**/
     4236,
 /**/
     4235,