0
0
mirror of https://github.com/vim/vim.git synced 2025-09-24 03:44:06 -04:00

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 <zeertzjq@outlook.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
This commit is contained in:
zeertzjq
2024-02-28 21:49:51 +01:00
committed by Christian Brabandt
parent b1289f19ef
commit 4e141c66b9
3 changed files with 45 additions and 2 deletions

View File

@@ -7323,6 +7323,9 @@ nv_put_opt(cmdarg_T *cap, int fix_indent)
int dir; int dir;
int flags = 0; int flags = 0;
int keep_registers = FALSE; int keep_registers = FALSE;
#ifdef FEAT_FOLDING
int save_fen = curwin->w_p_fen;
#endif
if (cap->oap->op_type != OP_NOP) 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); 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. // Now delete the selected text. Avoid messages here.
cap->cmdchar = 'd'; cap->cmdchar = 'd';
cap->nchar = NUL; cap->nchar = NUL;
@@ -7435,10 +7444,14 @@ nv_put_opt(cmdarg_T *cap, int fix_indent)
if (reg2 != NULL) if (reg2 != NULL)
put_register(regname, reg2); 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) 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_start = curbuf->b_op_start;
curbuf->b_visual.vi_end = curbuf->b_op_end; curbuf->b_visual.vi_end = curbuf->b_op_end;
// need to adjust cursor position // need to adjust cursor position

View File

@@ -290,5 +290,33 @@ func Test_put_in_last_displayed_line()
call VerifyScreenDump(buf, 'Test_put_in_last_displayed_line_1', {}) call VerifyScreenDump(buf, 'Test_put_in_last_displayed_line_1', {})
call StopVimInTerminal(buf) 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! bwipe!
endfunc endfunc

View File

@@ -704,6 +704,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
141,
/**/ /**/
140, 140,
/**/ /**/