# HG changeset patch # User Christian Brabandt # Date 1704475804 -3600 # Node ID 429644dfc97548cad142991d125473bb2b7b8b39 # Parent e75125d884a982e180cdb343667397ea651fd2b9 patch 9.1.0015: i_CTRL-R- no longer works in replace mode Commit: https://github.com/vim/vim/commit/5d5cbb2b9ac526fb6fad2116e24a282affc45efe Author: Christian Brabandt Date: Fri Jan 5 18:19:52 2024 +0100 patch 9.1.0015: i_CTRL-R- no longer works in replace mode 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 diff --git a/runtime/doc/insert.txt b/runtime/doc/insert.txt --- a/runtime/doc/insert.txt +++ b/runtime/doc/insert.txt @@ -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_CTR auto-indent. Does the same as pasting with the mouse ||. 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 |[|. - 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 diff --git a/src/register.c b/src/register.c --- a/src/register.c +++ b/src/register.c @@ -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); diff --git a/src/testdir/test_normal.vim b/src/testdir/test_normal.vim --- a/src/testdir/test_normal.vim +++ b/src/testdir/test_normal.vim @@ -4181,4 +4181,4 @@ func Test_brace_single_line() bw! endfunc -" vim: shiftwidth=2 sts=2 expandtab +" vim: shiftwidth=2 sts=2 expandtab nofoldenable diff --git a/src/testdir/test_registers.vim b/src/testdir/test_registers.vim --- a/src/testdir/test_registers.vim +++ b/src/testdir/test_registers.vim @@ -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\-\-" + 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\-ZZZZ" + call assert_equal(['foo', 'foofoo', '', 'bfoobarZZZZ'], getline(1, 4)) + call cursor(1, 1) + let @-='' + exe ":norm! R\-ZZZ" + call assert_equal(['ZZZ', 'foofoo', '', 'bfoobarZZZZ'], getline(1, 4)) + bwipe! +endfunc + " vim: shiftwidth=2 sts=2 expandtab diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -705,6 +705,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 15, +/**/ 14, /**/ 13,