diff options
author | zeertzjq <zeertzjq@outlook.com> | 2024-02-28 21:49:51 +0100 |
---|---|---|
committer | Christian Brabandt <cb@256bit.org> | 2024-02-28 21:49:51 +0100 |
commit | 4e141c66b9104136ddcf9cc240d2fbc83d825a5a (patch) | |
tree | 3d1d9fcb2de233207301b5b045a299bb6fa151b6 /src | |
parent | b1289f19efb75a3234c8f22bdd303a6ebe56f78c (diff) |
patch 9.1.0141: Put in Visual mode wrong if it replaces fold markerv9.1.0141
Problem: Put in Visual mode wrong if it replaces fold marker.
Solution: Temporarily disable folding during put in Visual mode.
(zeertzjq)
fixes: #14097
closes: #14100
Signed-off-by: zeertzjq <zeertzjq@outlook.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
Diffstat (limited to 'src')
-rw-r--r-- | src/normal.c | 17 | ||||
-rw-r--r-- | src/testdir/test_put.vim | 28 | ||||
-rw-r--r-- | src/version.c | 2 |
3 files changed, 45 insertions, 2 deletions
diff --git a/src/normal.c b/src/normal.c index 015a250781..791b02f1cd 100644 --- a/src/normal.c +++ b/src/normal.c @@ -7323,6 +7323,9 @@ nv_put_opt(cmdarg_T *cap, int fix_indent) int dir; int flags = 0; int keep_registers = FALSE; +#ifdef FEAT_FOLDING + int save_fen = curwin->w_p_fen; +#endif if (cap->oap->op_type != OP_NOP) { @@ -7388,6 +7391,12 @@ nv_put_opt(cmdarg_T *cap, int fix_indent) reg1 = get_register(regname, TRUE); } +#ifdef FEAT_FOLDING + // Temporarily disable folding, as deleting a fold marker may cause + // the cursor to be included in a fold. + curwin->w_p_fen = FALSE; +#endif + // Now delete the selected text. Avoid messages here. cap->cmdchar = 'd'; cap->nchar = NUL; @@ -7435,10 +7444,14 @@ nv_put_opt(cmdarg_T *cap, int fix_indent) if (reg2 != NULL) put_register(regname, reg2); - // What to reselect with "gv"? Selecting the just put text seems to - // be the most useful, since the original text was removed. if (was_visual) { +#ifdef FEAT_FOLDING + if (save_fen) + curwin->w_p_fen = TRUE; +#endif + // What to reselect with "gv"? Selecting the just put text seems to + // be the most useful, since the original text was removed. curbuf->b_visual.vi_start = curbuf->b_op_start; curbuf->b_visual.vi_end = curbuf->b_op_end; // need to adjust cursor position diff --git a/src/testdir/test_put.vim b/src/testdir/test_put.vim index 559a4dccd6..5b5c354c45 100644 --- a/src/testdir/test_put.vim +++ b/src/testdir/test_put.vim @@ -290,5 +290,33 @@ func Test_put_in_last_displayed_line() call StopVimInTerminal(buf) endfunc +func Test_put_visual_replace_whole_fold() + new + let lines = repeat(['{{{1', 'foo', 'bar', ''], 2) + call setline(1, lines) + setlocal foldmethod=marker + call setreg('"', 'baz') + call setreg('1', '') + normal! Vp + call assert_equal("{{{1\nfoo\nbar\n\n", getreg('1')) + call assert_equal(['baz', '{{{1', 'foo', 'bar', ''], getline(1, '$')) + + bwipe! +endfunc + +func Test_put_visual_replace_fold_marker() + new + let lines = repeat(['{{{1', 'foo', 'bar', ''], 4) + call setline(1, lines) + setlocal foldmethod=marker + normal! Gkzo + call setreg('"', '{{{1') + call setreg('1', '') + normal! Vp + call assert_equal("{{{1\n", getreg('1')) + call assert_equal(lines, getline(1, '$')) + + bwipe! +endfunc " vim: shiftwidth=2 sts=2 expandtab diff --git a/src/version.c b/src/version.c index 673c707c7d..5a6f4c13c9 100644 --- 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 */ /**/ + 141, +/**/ 140, /**/ 139, |