]> git.ipfire.org Git - thirdparty/vim.git/commitdiff
patch 9.1.0015: i_CTRL-R- no longer works in replace mode v9.1.0015
authorChristian Brabandt <cb@256bit.org>
Fri, 5 Jan 2024 17:19:52 +0000 (18:19 +0100)
committerChristian Brabandt <cb@256bit.org>
Fri, 5 Jan 2024 17:19:52 +0000 (18:19 +0100)
Problem:  i_CTRL-R- no longer works in replace mode
Solution: delete characters in replace mode before putting, add a test,
          add a bit warning into the documentation, that i_CTRL-R-P/O
          is not supported in Replace mode for now

fixes: #13792
closes: #13816

Signed-off-by: Christian Brabandt <cb@256bit.org>
runtime/doc/insert.txt
src/register.c
src/testdir/test_normal.vim
src/testdir/test_registers.vim
src/version.c

index de8866fc640444a217b32b43dbd8a93e2e93aed5..6ebd83e3e7b3a769f47b0ccc24250f572a6b5d27 100644 (file)
@@ -1,4 +1,4 @@
-*insert.txt*    For Vim version 9.1.  Last change: 2022 Sep 30
+*insert.txt*    For Vim version 9.1.  Last change: 2024 Jan 04
 
 
                  VIM REFERENCE MANUAL    by Bram Moolenaar
@@ -168,22 +168,22 @@ CTRL-R CTRL-O {register}                  *i_CTRL-R_CTRL-O*
                auto-indent.  Does the same as pasting with the mouse
                |<MiddleMouse>|. When the register is linewise this will
                insert the text above the current line, like with `P`.
-               Does not replace characters!
                The '.' register (last inserted text) is still inserted as
                typed.
                After this command, the '.' register contains the command
                typed and not the text. I.e., the literals "^R^O" and not the
                text from the register.
+               Does not replace characters in |Replace-mode|!
 
 CTRL-R CTRL-P {register}                       *i_CTRL-R_CTRL-P*
                Insert the contents of a register literally and fix the
                indent, like |[<MiddleMouse>|.
-               Does not replace characters!
                The '.' register (last inserted text) is still inserted as
                typed.
                After this command, the '.' register contains the command
                typed and not the text. I.e., the literals "^R^P" and not the
                text from the register.
+               Does not replace characters in |Replace-mode|!
 
                                                *i_CTRL-T*
 CTRL-T         Insert one shiftwidth of indent at the start of the current
index 1d0e46bd0bb68c2537bb3f4c35f34e9aa71758d1..f381e303beb7eb2f95592986b8a5d5df8696f00d 100644 (file)
@@ -828,9 +828,22 @@ insert_reg(
            {
                if (regname == '-')
                {
+                   int dir = BACKWARD;
+                   if ((State & REPLACE_FLAG) != 0)
+                   {
+                       pos_T curpos;
+                       u_save_cursor();
+                       del_bytes((long)STRLEN(y_current->y_array[0]), TRUE, FALSE);
+                       curpos = curwin->w_cursor;
+                       if (oneright() == FAIL)
+                           // hit end of line, need to put forward (after the current position)
+                           dir = FORWARD;
+                       curwin->w_cursor = curpos;
+                   }
+
                    AppendCharToRedobuff(Ctrl_R);
                    AppendCharToRedobuff(regname);
-                   do_put(regname, NULL, BACKWARD, 1L, PUT_CURSEND);
+                   do_put(regname, NULL, dir, 1L, PUT_CURSEND);
                }
                else
                    stuffescaped(y_current->y_array[i], literally);
index 90bedf1800d08070503bce0eae3e406132b0b7bf..38ad8107b4b10702b249dc6b342168ebafc84f01 100644 (file)
@@ -4181,4 +4181,4 @@ func Test_brace_single_line()
   bw!
 endfunc
 
-" vim: shiftwidth=2 sts=2 expandtab
+" vim: shiftwidth=2 sts=2 expandtab nofoldenable
index f85e72735a22de7ddc997ae3e63592d382ccf85c..50f39107b469a4e5c4c26267b68b52ec89c5d4a2 100644 (file)
@@ -946,4 +946,24 @@ func Test_register_y_append_reset()
   bwipe!
 endfunc
 
+func Test_insert_small_delete_replace_mode()
+  new
+  call setline(1, ['foo', 'bar', 'foobar',  'bar'])
+  let @-='foo'
+  call cursor(2, 1)
+  exe ":norm! R\<C-R>-\<C-R>-"
+  call assert_equal('foofoo', getline(2))
+  call cursor(3, 1)
+  norm! D
+  call assert_equal(['foo', 'foofoo', '',  'bar'], getline(1, 4))
+  call cursor(4, 2)
+  exe ":norm! R\<C-R>-ZZZZ"
+  call assert_equal(['foo', 'foofoo', '',  'bfoobarZZZZ'], getline(1, 4))
+  call cursor(1, 1)
+  let @-=''
+  exe ":norm! R\<C-R>-ZZZ"
+  call assert_equal(['ZZZ', 'foofoo', '',  'bfoobarZZZZ'], getline(1, 4))
+  bwipe!
+endfunc
+
 " vim: shiftwidth=2 sts=2 expandtab
index a6dae87b5b9468f18b043617db23b167511c2f67..9a4106de49ea591ccdd68f4eae63d5316a198263 100644 (file)
@@ -704,6 +704,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    15,
 /**/
     14,
 /**/