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

Commit: 
https://github.com/vim/vim/commit/4e141c66b9104136ddcf9cc240d2fbc83d825a5a
Author: zeertzjq <[email protected]>
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 <[email protected]>
    Signed-off-by: Christian Brabandt <[email protected]>

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,
 /**/

-- 
-- 
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 on the web visit 
https://groups.google.com/d/msgid/vim_dev/E1rfR24-007Lyt-Bj%40256bit.org.

Raspunde prin e-mail lui