Patch 8.2.1727
Problem: A popup created with "cursorline" will ignore "firstline".
Solution: When both "cursorline" and "firstline" are present put the cursor
on "firstline". (closes #7000) Add the "winid" argument to
getcurpos().
Files: runtime/doc/eval.txt, src/evalfunc.c, src/popupwin.c,
src/evalwindow.c, src/testdir/test_popupwin.vim,
src/testdir/test_functions.vim
*** ../vim-8.2.1726/runtime/doc/eval.txt 2020-09-22 20:33:30.433223197
+0200
--- runtime/doc/eval.txt 2020-09-22 21:50:37.116094829 +0200
***************
*** 2502,2508 ****
getcmdwintype() String return current command-line
window type
getcompletion({pat}, {type} [, {filtered}])
List list of cmdline completion matches
! getcurpos() List position of the cursor
getcwd([{winnr} [, {tabnr}]]) String get the current working directory
getenv({name}) String return environment variable
getfontname([{name}]) String name of font being used
--- 2516,2522 ----
getcmdwintype() String return current command-line
window type
getcompletion({pat}, {type} [, {filtered}])
List list of cmdline completion matches
! getcurpos([{winnr}]) List position of the cursor
getcwd([{winnr} [, {tabnr}]]) String get the current working directory
getenv({name}) String return environment variable
getfontname([{name}]) String name of font being used
***************
*** 5229,5239 ****
GetPattern()->getcompletion('color')
<
*getcurpos()*
! getcurpos() Get the position of the cursor. This is like getpos('.'), but
! includes an extra item in the list:
! [bufnum, lnum, col, off, curswant] ~
The "curswant" number is the preferred column when moving the
cursor vertically. Also see |getpos()|.
This can be used to save and restore the cursor position: >
let save_cursor = getcurpos()
--- 5261,5279 ----
GetPattern()->getcompletion('color')
<
*getcurpos()*
! getcurpos([{winid}])
! Get the position of the cursor. This is like getpos('.'), but
! includes an extra "curswant" item in the list:
! [0, lnum, col, off, curswant] ~
The "curswant" number is the preferred column when moving the
cursor vertically. Also see |getpos()|.
+ The first "bufnum" item is always zero.
+
+ The optional {winid} argument can specify the window. It can
+ be the window number or the |window-ID|. The last known
+ cursor position is returned, this may be invalid for the
+ current value of the buffer if it is not the current window.
+ If {winid} is invalid a list with zeroes is returned.
This can be used to save and restore the cursor position: >
let save_cursor = getcurpos()
*** ../vim-8.2.1726/src/evalfunc.c 2020-09-22 20:33:30.437223175 +0200
--- src/evalfunc.c 2020-09-22 21:46:59.040890477 +0200
***************
*** 646,652 ****
{"getcmdtype", 0, 0, 0, ret_string, f_getcmdtype},
{"getcmdwintype", 0, 0, 0, ret_string, f_getcmdwintype},
{"getcompletion", 2, 3, FEARG_1, ret_list_string, f_getcompletion},
! {"getcurpos", 0, 0, 0, ret_list_number, f_getcurpos},
{"getcwd", 0, 2, FEARG_1, ret_string, f_getcwd},
{"getenv", 1, 1, FEARG_1, ret_string, f_getenv},
{"getfontname", 0, 1, 0, ret_string, f_getfontname},
--- 646,652 ----
{"getcmdtype", 0, 0, 0, ret_string, f_getcmdtype},
{"getcmdwintype", 0, 0, 0, ret_string, f_getcmdwintype},
{"getcompletion", 2, 3, FEARG_1, ret_list_string, f_getcompletion},
! {"getcurpos", 0, 1, FEARG_1, ret_list_number, f_getcurpos},
{"getcwd", 0, 2, FEARG_1, ret_string, f_getcwd},
{"getenv", 1, 1, FEARG_1, ret_string, f_getenv},
{"getfontname", 0, 1, 0, ret_string, f_getfontname},
***************
*** 3259,3265 ****
typval_T *rettv,
int getcurpos)
{
! pos_T *fp;
list_T *l;
int fnum = -1;
--- 3259,3266 ----
typval_T *rettv,
int getcurpos)
{
! pos_T *fp = NULL;
! win_T *wp = curwin;
list_T *l;
int fnum = -1;
***************
*** 3267,3273 ****
{
l = rettv->vval.v_list;
if (getcurpos)
! fp = &curwin->w_cursor;
else
fp = var2fpos(&argvars[0], TRUE, &fnum);
if (fnum != -1)
--- 3268,3283 ----
{
l = rettv->vval.v_list;
if (getcurpos)
! {
! if (argvars[0].v_type != VAR_UNKNOWN)
! {
! wp = find_win_by_nr_or_id(&argvars[0]);
! if (wp != NULL)
! fp = &wp->w_cursor;
! }
! else
! fp = &curwin->w_cursor;
! }
else
fp = var2fpos(&argvars[0], TRUE, &fnum);
if (fnum != -1)
***************
*** 3287,3299 ****
colnr_T save_curswant = curwin->w_curswant;
colnr_T save_virtcol = curwin->w_virtcol;
! update_curswant();
! list_append_number(l, curwin->w_curswant == MAXCOL ?
! (varnumber_T)MAXCOL : (varnumber_T)curwin->w_curswant + 1);
// Do not change "curswant", as it is unexpected that a get
// function has a side effect.
! if (save_set_curswant)
{
curwin->w_set_curswant = save_set_curswant;
curwin->w_curswant = save_curswant;
--- 3297,3310 ----
colnr_T save_curswant = curwin->w_curswant;
colnr_T save_virtcol = curwin->w_virtcol;
! if (wp == curwin)
! update_curswant();
! list_append_number(l, wp == NULL ? 0 : wp->w_curswant == MAXCOL
! ? (varnumber_T)MAXCOL : (varnumber_T)wp->w_curswant + 1);
// Do not change "curswant", as it is unexpected that a get
// function has a side effect.
! if (wp == curwin && save_set_curswant)
{
curwin->w_set_curswant = save_set_curswant;
curwin->w_curswant = save_curswant;
*** ../vim-8.2.1726/src/popupwin.c 2020-09-08 22:55:22.075652514 +0200
--- src/popupwin.c 2020-09-22 21:53:54.263314983 +0200
***************
*** 593,600 ****
++wp->w_topline;
}
! // Don't use "firstline" now.
! wp->w_firstline = 0;
}
/*
--- 593,601 ----
++wp->w_topline;
}
! // Don't let "firstline" cause a scroll.
! if (wp->w_firstline > 0)
! wp->w_firstline = wp->w_topline;
}
/*
***************
*** 948,953 ****
--- 949,966 ----
if (nr > 0)
wp->w_popup_flags |= POPF_HIDDEN;
+ // when "firstline" and "cursorline" are both set move the cursor to the
+ // "firstline".
+ if (wp->w_firstline > 0 && (wp->w_popup_flags & POPF_CURSORLINE))
+ {
+ if (wp->w_firstline > wp->w_buffer->b_ml.ml_line_count)
+ wp->w_cursor.lnum = wp->w_buffer->b_ml.ml_line_count;
+ else
+ wp->w_cursor.lnum = wp->w_firstline;
+ wp->w_topline = wp->w_cursor.lnum;
+ curwin->w_valid &= ~VALID_BOTLINE;
+ }
+
popup_mask_refresh = TRUE;
popup_highlight_curline(wp);
}
*** ../vim-8.2.1726/src/evalwindow.c 2020-09-05 21:57:49.492963210 +0200
--- src/evalwindow.c 2020-09-22 21:33:31.300388816 +0200
***************
*** 530,535 ****
--- 530,551 ----
return;
}
}
+ #ifdef FEAT_PROP_POPUP
+ if (wparg != NULL)
+ {
+ tabnr = 0;
+ FOR_ALL_TABPAGES(tp)
+ {
+ tabnr++;
+ FOR_ALL_POPUPWINS_IN_TAB(tp, wp)
+ if (wp == wparg)
+ break;
+ }
+ d = get_win_info(wparg, tp == NULL ? 0 : tabnr, 0);
+ if (d != NULL)
+ list_append_dict(rettv->vval.v_list, d);
+ }
+ #endif
}
/*
*** ../vim-8.2.1726/src/testdir/test_popupwin.vim 2020-09-08
22:06:12.825040939 +0200
--- src/testdir/test_popupwin.vim 2020-09-22 21:19:21.236593857 +0200
***************
*** 516,521 ****
--- 516,534 ----
call popup_close(winid)
endfunc
+ func Test_popup_firstline_cursorline()
+ let winid = popup_create(['1111', '222222', '33333', '44444'], #{
+ \ maxheight: 2,
+ \ firstline: 3,
+ \ cursorline: 1,
+ \ })
+ call assert_equal(3, popup_getoptions(winid).firstline)
+ call assert_equal(3, getwininfo(winid)[0].topline)
+ call assert_equal(3, getcurpos(winid)[1])
+
+ call popup_close(winid)
+ endfunc
+
func Test_popup_noscrolloff()
set scrolloff=5
let winid = popup_create(['xxx']->repeat(50), #{
*** ../vim-8.2.1726/src/testdir/test_functions.vim 2020-09-22
20:33:30.437223175 +0200
--- src/testdir/test_functions.vim 2020-09-22 21:48:32.256560891 +0200
***************
*** 2520,2526 ****
--- 2520,2538 ----
call assert_equal('6', @")
call assert_equal(-1, setpos('.', test_null_list()))
call assert_equal(-1, setpos('.', {}))
+
+ let winid = win_getid()
+ normal G$
+ let pos = getcurpos()
+ wincmd w
+ call assert_equal(pos, getcurpos(winid))
+
+ wincmd w
close!
+
+ call assert_equal(getcurpos(), getcurpos(0))
+ call assert_equal([0, 0, 0, 0, 0], getcurpos(-1))
+ call assert_equal([0, 0, 0, 0, 0], getcurpos(1999))
endfunc
" Test for glob()
*** ../vim-8.2.1726/src/version.c 2020-09-22 20:33:30.437223175 +0200
--- src/version.c 2020-09-22 20:52:49.368383997 +0200
***************
*** 752,753 ****
--- 752,755 ----
{ /* Add new patch number below this line */
+ /**/
+ 1727,
/**/
--
This computer is so slow, it takes forever to execute and endless loop!
/// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net \\\
/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\ an exciting new programming language -- http://www.Zimbu.org ///
\\\ help me help AIDS victims -- http://ICCF-Holland.org ///
--
--
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/202009221956.08MJutFV3736370%40masaka.moolenaar.net.