vim-patch:8.0.0542: getpos() can return a negative line number (#8580)

Problem:    getpos() can return a negative line number. (haya14busa)
Solution:   Handle a zero topline and botline. (closes vim/vim#1613)
a1d5fa65bc
This commit is contained in:
Jan Edmund Lazo
2018-06-19 04:50:52 -04:00
committed by Justin M. Keyes
parent b148213366
commit 3c24a6c317
2 changed files with 9 additions and 4 deletions

View File

@@ -5182,8 +5182,10 @@ line({expr}) The result is a Number, which is the line number of the file
$ the last line in the current buffer $ the last line in the current buffer
'x position of mark x (if the mark is not set, 0 is 'x position of mark x (if the mark is not set, 0 is
returned) returned)
w0 first line visible in current window w0 first line visible in current window (one if the
w$ last line visible in current window display isn't updated, e.g. in silent Ex mode)
w$ last line visible in current window (this is one
less than "w0" if no lines are visible)
v In Visual mode: the start of the Visual area (the v In Visual mode: the start of the Visual area (the
cursor is the end). When not in Visual mode cursor is the end). When not in Visual mode
returns the cursor position. Differs from |'<| in returns the cursor position. Differs from |'<| in

View File

@@ -17838,11 +17838,14 @@ pos_T *var2fpos(const typval_T *const tv, const int dollar_lnum,
pos.col = 0; pos.col = 0;
if (name[1] == '0') { /* "w0": first visible line */ if (name[1] == '0') { /* "w0": first visible line */
update_topline(); update_topline();
pos.lnum = curwin->w_topline; // In silent Ex mode topline is zero, but that's not a valid line
// number; use one instead.
pos.lnum = curwin->w_topline > 0 ? curwin->w_topline : 1;
return &pos; return &pos;
} else if (name[1] == '$') { /* "w$": last visible line */ } else if (name[1] == '$') { /* "w$": last visible line */
validate_botline(); validate_botline();
pos.lnum = curwin->w_botline - 1; // In silent Ex mode botline is zero, return zero then.
pos.lnum = curwin->w_botline > 0 ? curwin->w_botline - 1 : 0;
return &pos; return &pos;
} }
} else if (name[0] == '$') { /* last column or line */ } else if (name[0] == '$') { /* last column or line */