mirror of
https://github.com/vim/vim.git
synced 2025-09-23 03:43:49 -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:
committed by
Christian Brabandt
parent
b1289f19ef
commit
4e141c66b9
17
src/normal.c
17
src/normal.c
@@ -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
|
||||||
|
@@ -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
|
||||||
|
@@ -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,
|
||||||
/**/
|
/**/
|
||||||
|
Reference in New Issue
Block a user