vim-patch:9.0.0011: reading beyond the end of the line with put command (#19166)

Problem:    Reading beyond the end of the line with put command.
Solution:   Adjust the end mark position.
d25f003342
This commit is contained in:
zeertzjq
2022-06-30 20:16:00 +08:00
committed by GitHub
parent 37af46bb4c
commit 69cd0ba27b
2 changed files with 14 additions and 3 deletions

View File

@@ -3344,7 +3344,6 @@ void do_put(int regname, yankreg_T *reg, int dir, long count, int flags)
totlen = (size_t)(count * (yanklen + spaces) totlen = (size_t)(count * (yanklen + spaces)
+ bd.startspaces + bd.endspaces); + bd.startspaces + bd.endspaces);
int addcount = (int)totlen + lines_appended;
newp = (char_u *)xmalloc(totlen + oldlen + 1); newp = (char_u *)xmalloc(totlen + oldlen + 1);
// copy part up to cursor to new line // copy part up to cursor to new line
@@ -3366,7 +3365,7 @@ void do_put(int regname, yankreg_T *reg, int dir, long count, int flags)
memset(ptr, ' ', (size_t)spaces); memset(ptr, ' ', (size_t)spaces);
ptr += spaces; ptr += spaces;
} else { } else {
addcount -= spaces; totlen -= (size_t)spaces; // didn't use these spaces
} }
} }
@@ -3380,7 +3379,7 @@ void do_put(int regname, yankreg_T *reg, int dir, long count, int flags)
memmove(ptr, oldp + bd.textcol + delcount, (size_t)columns); memmove(ptr, oldp + bd.textcol + delcount, (size_t)columns);
ml_replace(curwin->w_cursor.lnum, (char *)newp, false); ml_replace(curwin->w_cursor.lnum, (char *)newp, false);
extmark_splice_cols(curbuf, (int)curwin->w_cursor.lnum - 1, bd.textcol, extmark_splice_cols(curbuf, (int)curwin->w_cursor.lnum - 1, bd.textcol,
delcount, addcount, kExtmarkUndo); delcount, (int)totlen + lines_appended, kExtmarkUndo);
++curwin->w_cursor.lnum; ++curwin->w_cursor.lnum;
if (i == 0) { if (i == 0) {

View File

@@ -213,5 +213,17 @@ func Test_put_empty_register()
bwipe! bwipe!
endfunc endfunc
" this was putting the end mark after the end of the line
func Test_put_visual_mode()
edit! SomeNewBuffer
set selection=exclusive
exe "norm o\t"
m0
sil! norm 
p
p
bwipe!
set selection&
endfunc endfunc