Commit: patch 9.1.0141: Put in Visual mode wrong if it replaces fold marker

4 views
Skip to first unread message

Christian Brabandt

unread,
Feb 28, 2024, 4:00:10 PM2/28/24
to vim...@googlegroups.com
patch 9.1.0141: Put in Visual mode wrong if it replaces fold marker

Commit: https://github.com/vim/vim/commit/4e141c66b9104136ddcf9cc240d2fbc83d825a5a
Author: zeertzjq <zeer...@outlook.com>
Date: Wed Feb 28 21:49:51 2024 +0100

patch 9.1.0141: Put in Visual mode wrong if it replaces fold marker

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 <zeer...@outlook.com>
Signed-off-by: Christian Brabandt <c...@256bit.org>

diff --git a/src/normal.c b/src/normal.c
index 015a25078..791b02f1c 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 559a4dccd..5b5c354c4 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
foo
bar

", 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
", 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 673c707c7..5a6f4c13c 100644
--- a/src/version.c
+++ b/src/version.c
@@ -704,6 +704,8 @@ static char *(features[]) =

static int included_patches[] =
{ /* Add new patch number below this line */
+/**/
+ 141,
/**/
140,
/**/
Reply all
Reply to author
Forward
0 new messages