patch 9.2.0415: Wrong behavior when executing register that ends in Insert mode

Commit: 
https://github.com/vim/vim/commit/6453a7c440648f938a9bde83213ffcf3903f44be
Author: zeertzjq <[email protected]>
Date:   Wed Apr 29 16:10:04 2026 +0000

    patch 9.2.0415: Wrong behavior when executing register that ends in Insert 
mode
    
    Problem:  Wrong behavior when executing register that ends in Insert
              mode from Ctrl-O (Emilien Breton)
    Solution: Use :startinsert etc. to restore Insert mode after executing
              the register contents (zeertzjq).
    
    fixes:  #20085
    closes: #20091
    
    Signed-off-by: zeertzjq <[email protected]>
    Signed-off-by: Christian Brabandt <[email protected]>

diff --git a/src/register.c b/src/register.c
index 9eeb88f44..9f0e06b54 100644
--- a/src/register.c
+++ b/src/register.c
@@ -787,22 +787,18 @@ do_execreg(
     static void
 put_reedit_in_typebuf(int silent)
 {
-    char_u     buf[3];
-
     if (restart_edit == NUL)
        return;
 
-    if (restart_edit == 'V')
-    {
-       buf[0] = 'g';
-       buf[1] = 'R';
-       buf[2] = NUL;
-    }
-    else
-    {
-       buf[0] = restart_edit == 'I' ? 'i' : restart_edit;
-       buf[1] = NUL;
-    }
+    char_u     buf[] = { K_SPECIAL, KS_EXTRA, KE_COMMAND,
+       // :startinsert
+       's', 't', 'a', 'r', 't', 'i', CAR, NUL };
+    if (restart_edit == 'R')
+       buf[8] = 'r';  // :startreplace
+    else if (restart_edit == 'V')
+       buf[8] = 'g';  // :startgreplace
+    else if (restart_edit == 'A')
+       buf[8] = '!';  // :startinsert!
     if (ins_typebuf(buf, REMAP_NONE, 0, TRUE, silent) == OK)
        restart_edit = NUL;
 }
diff --git a/src/testdir/test_registers.vim b/src/testdir/test_registers.vim
index 245340c82..bb1dd31f3 100644
--- a/src/testdir/test_registers.vim
+++ b/src/testdir/test_registers.vim
@@ -582,21 +582,41 @@ func Test_clipboard_regs_both_unnamed()
   bwipe!
 endfunc
 
-" Test for restarting the current mode (insert or virtual replace) after
+" Test for restarting the current mode (insert or (virtual) replace) after
 " executing the contents of a register
-func Test_put_reg_restart_mode()
+func Test_exec_reg_restart_mode()
   new
-  call append(0, 'editor')
-  normal gg
+
   let @r = "ivim \<Esc>"
-  call feedkeys("i\<C-O>@r\<C-R>=mode()\<CR>", 'xt')
+
+  call setline(1, 'editor')
+  normal gg
+  call feedkeys("i\<C-O>@r\<C-R>=mode(1)\<CR>", 'xt')
   call assert_equal('vimi editor', getline(1))
 
   call setline(1, 'editor')
   normal gg
-  call feedkeys("gR\<C-O>@r\<C-R>=mode()\<CR>", 'xt')
+  call feedkeys("R\<C-O>@r\<C-R>=mode(1)\<CR>", 'xt')
   call assert_equal('vimReditor', getline(1))
 
+  call setline(1, 'editor')
+  normal gg
+  call feedkeys("gR\<C-O>@r\<C-R>=mode(1)\<CR>", 'xt')
+  call assert_equal('vimRvditor', getline(1))
+
+  " If the register doesn't return to Normal mode, Vim should stay in whatever
+  " mode the register ends up with, and should not insert extra text. #20085
+  for [s0, expected] in
+        \ [['i', 'vim editor,i'], ['R', 'vim or,R'], ['gR', 'vim or,Rv']]
+    let @r = $"{s0}vim "
+    for s1 in ['i', 'R', 'gR']
+      call setline(1, 'editor')
+      normal gg
+      call feedkeys($"{s1}\<C-O>@r\<End>,\<C-R>=mode(1)\<CR>", 'xt')
+      call assert_equal(expected, getline(1))
+    endfor
+  endfor
+
   bwipe!
 endfunc
 
diff --git a/src/version.c b/src/version.c
index 08ebffbb5..c54177a4a 100644
--- a/src/version.c
+++ b/src/version.c
@@ -729,6 +729,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    415,
 /**/
     414,
 /**/

-- 
-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

--- 
You received this message because you are subscribed to the Google Groups 
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion visit 
https://groups.google.com/d/msgid/vim_dev/E1wI7Z5-007Yeu-Pw%40256bit.org.

Raspunde prin e-mail lui