@@ -528,6 +528,7 @@ static void f_getpos __ARGS((typval_T *argvars, typval_T *rettv));
528528static void f_getqflist __ARGS ((typval_T * argvars , typval_T * rettv ));
529529static void f_getreg __ARGS ((typval_T * argvars , typval_T * rettv ));
530530static void f_getregtype __ARGS ((typval_T * argvars , typval_T * rettv ));
531+ static void f_gettabwinvar __ARGS ((typval_T * argvars , typval_T * rettv ));
531532static void f_getwinposx __ARGS ((typval_T * argvars , typval_T * rettv ));
532533static void f_getwinposy __ARGS ((typval_T * argvars , typval_T * rettv ));
533534static void f_getwinvar __ARGS ((typval_T * argvars , typval_T * rettv ));
@@ -614,6 +615,7 @@ static void f_setloclist __ARGS((typval_T *argvars, typval_T *rettv));
614615static void f_setpos __ARGS ((typval_T * argvars , typval_T * rettv ));
615616static void f_setqflist __ARGS ((typval_T * argvars , typval_T * rettv ));
616617static void f_setreg __ARGS ((typval_T * argvars , typval_T * rettv ));
618+ static void f_settabwinvar __ARGS ((typval_T * argvars , typval_T * rettv ));
617619static void f_setwinvar __ARGS ((typval_T * argvars , typval_T * rettv ));
618620static void f_simplify __ARGS ((typval_T * argvars , typval_T * rettv ));
619621static void f_sort __ARGS ((typval_T * argvars , typval_T * rettv ));
@@ -728,9 +730,11 @@ static void func_unref __ARGS((char_u *name));
728730static void func_ref __ARGS ((char_u * name ));
729731static void call_user_func __ARGS ((ufunc_T * fp , int argcount , typval_T * argvars , typval_T * rettv , linenr_T firstline , linenr_T lastline , dict_T * selfdict ));
730732static void add_nr_var __ARGS ((dict_T * dp , dictitem_T * v , char * name , varnumber_T nr ));
731- static win_T * find_win_by_nr __ARGS ((typval_T * vp ));
733+ static win_T * find_win_by_nr __ARGS ((typval_T * vp , tabpage_T * tp ));
734+ static void getwinvar __ARGS ((typval_T * argvars , typval_T * rettv , int off ));
732735static int searchpair_cmn __ARGS ((typval_T * argvars , pos_T * match_pos ));
733736static int search_cmn __ARGS ((typval_T * argvars , pos_T * match_pos , int * flagsp ));
737+ static void setwinvar __ARGS ((typval_T * argvars , typval_T * rettv , int off ));
734738
735739/* Character used as separated in autoload function/variable names. */
736740#define AUTOLOAD_CHAR '#'
@@ -7035,6 +7039,7 @@ static struct fst
70357039 {"getqflist" , 0 , 0 , f_getqflist },
70367040 {"getreg" , 0 , 2 , f_getreg },
70377041 {"getregtype" , 0 , 1 , f_getregtype },
7042+ {"gettabwinvar" , 3 , 3 , f_gettabwinvar },
70387043 {"getwinposx" , 0 , 0 , f_getwinposx },
70397044 {"getwinposy" , 0 , 0 , f_getwinposy },
70407045 {"getwinvar" , 2 , 2 , f_getwinvar },
@@ -7123,6 +7128,7 @@ static struct fst
71237128 {"setpos" , 2 , 2 , f_setpos },
71247129 {"setqflist" , 1 , 2 , f_setqflist },
71257130 {"setreg" , 2 , 3 , f_setreg },
7131+ {"settabwinvar" , 4 , 4 , f_settabwinvar },
71267132 {"setwinvar" , 3 , 3 , f_setwinvar },
71277133 {"simplify" , 1 , 1 , f_simplify },
71287134 {"sort" , 1 , 2 , f_sort },
@@ -10129,7 +10135,7 @@ f_getqflist(argvars, rettv)
1012910135 wp = NULL ;
1013010136 if (argvars [0 ].v_type != VAR_UNKNOWN ) /* getloclist() */
1013110137 {
10132- wp = find_win_by_nr (& argvars [0 ]);
10138+ wp = find_win_by_nr (& argvars [0 ], NULL );
1013310139 if (wp == NULL )
1013410140 return ;
1013510141 }
@@ -10218,6 +10224,17 @@ f_getregtype(argvars, rettv)
1021810224 rettv -> vval .v_string = vim_strsave (buf );
1021910225}
1022010226
10227+ /*
10228+ * "gettabwinvar()" function
10229+ */
10230+ static void
10231+ f_gettabwinvar (argvars , rettv )
10232+ typval_T * argvars ;
10233+ typval_T * rettv ;
10234+ {
10235+ getwinvar (argvars , rettv , 1 );
10236+ }
10237+
1022110238/*
1022210239 * "getwinposx()" function
1022310240 */
@@ -10260,9 +10277,13 @@ f_getwinposy(argvars, rettv)
1026010277#endif
1026110278}
1026210279
10280+ /*
10281+ * Find window specifed by "vp" in tabpage "tp".
10282+ */
1026310283 static win_T *
10264- find_win_by_nr (vp )
10284+ find_win_by_nr (vp , tp )
1026510285 typval_T * vp ;
10286+ tabpage_T * tp ; /* NULL for current tab page */
1026610287{
1026710288#ifdef FEAT_WINDOWS
1026810289 win_T * wp ;
@@ -10277,7 +10298,8 @@ find_win_by_nr(vp)
1027710298 if (nr == 0 )
1027810299 return curwin ;
1027910300
10280- for (wp = firstwin ; wp != NULL ; wp = wp -> w_next )
10301+ for (wp = (tp == NULL || tp == curtab ) ? firstwin : tp -> tp_firstwin ;
10302+ wp != NULL ; wp = wp -> w_next )
1028110303 if (-- nr <= 0 )
1028210304 break ;
1028310305 return wp ;
@@ -10295,13 +10317,32 @@ find_win_by_nr(vp)
1029510317f_getwinvar (argvars , rettv )
1029610318 typval_T * argvars ;
1029710319 typval_T * rettv ;
10320+ {
10321+ getwinvar (argvars , rettv , 0 );
10322+ }
10323+
10324+ /*
10325+ * getwinvar() and gettabwinvar()
10326+ */
10327+ static void
10328+ getwinvar (argvars , rettv , off )
10329+ typval_T * argvars ;
10330+ typval_T * rettv ;
10331+ int off ; /* 1 for gettabwinvar() */
1029810332{
1029910333 win_T * win , * oldcurwin ;
1030010334 char_u * varname ;
1030110335 dictitem_T * v ;
10336+ tabpage_T * tp ;
1030210337
10303- win = find_win_by_nr (& argvars [0 ]);
10304- varname = get_tv_string_chk (& argvars [1 ]);
10338+ #ifdef FEAT_WINDOWS
10339+ if (off == 1 )
10340+ tp = find_tabpage ((int )get_tv_number_chk (& argvars [0 ], NULL ));
10341+ else
10342+ tp = curtab ;
10343+ #endif
10344+ win = find_win_by_nr (& argvars [off ], tp );
10345+ varname = get_tv_string_chk (& argvars [off + 1 ]);
1030510346 ++ emsg_off ;
1030610347
1030710348 rettv -> v_type = VAR_STRING ;
@@ -14245,7 +14286,7 @@ f_setloclist(argvars, rettv)
1424514286
1424614287 rettv -> vval .v_number = -1 ;
1424714288
14248- win = find_win_by_nr (& argvars [0 ]);
14289+ win = find_win_by_nr (& argvars [0 ], NULL );
1424914290 if (win != NULL )
1425014291 set_qf_ll_list (win , & argvars [1 ], & argvars [2 ], rettv );
1425114292}
@@ -14368,37 +14409,71 @@ f_setreg(argvars, rettv)
1436814409 rettv -> vval .v_number = 0 ;
1436914410}
1437014411
14412+ /*
14413+ * "settabwinvar()" function
14414+ */
14415+ static void
14416+ f_settabwinvar (argvars , rettv )
14417+ typval_T * argvars ;
14418+ typval_T * rettv ;
14419+ {
14420+ setwinvar (argvars , rettv , 1 );
14421+ }
1437114422
1437214423/*
14373- * "setwinvar(expr )" function
14424+ * "setwinvar()" function
1437414425 */
14375- /*ARGSUSED*/
1437614426 static void
1437714427f_setwinvar (argvars , rettv )
1437814428 typval_T * argvars ;
1437914429 typval_T * rettv ;
14430+ {
14431+ setwinvar (argvars , rettv , 0 );
14432+ }
14433+
14434+ /*
14435+ * "setwinvar()" and "settabwinvar()" functions
14436+ */
14437+ static void
14438+ setwinvar (argvars , rettv , off )
14439+ typval_T * argvars ;
14440+ typval_T * rettv ;
14441+ int off ;
1438014442{
1438114443 win_T * win ;
1438214444#ifdef FEAT_WINDOWS
1438314445 win_T * save_curwin ;
14446+ tabpage_T * save_curtab ;
1438414447#endif
1438514448 char_u * varname , * winvarname ;
1438614449 typval_T * varp ;
1438714450 char_u nbuf [NUMBUFLEN ];
14451+ tabpage_T * tp ;
1438814452
1438914453 rettv -> vval .v_number = 0 ;
1439014454
1439114455 if (check_restricted () || check_secure ())
1439214456 return ;
14393- win = find_win_by_nr (& argvars [0 ]);
14394- varname = get_tv_string_chk (& argvars [1 ]);
14395- varp = & argvars [2 ];
14457+
14458+ #ifdef FEAT_WINDOWS
14459+ if (off == 1 )
14460+ tp = find_tabpage ((int )get_tv_number_chk (& argvars [0 ], NULL ));
14461+ else
14462+ tp = curtab ;
14463+ #endif
14464+ win = find_win_by_nr (& argvars [off ], tp );
14465+ varname = get_tv_string_chk (& argvars [off + 1 ]);
14466+ varp = & argvars [off + 2 ];
1439614467
1439714468 if (win != NULL && varname != NULL && varp != NULL )
1439814469 {
1439914470#ifdef FEAT_WINDOWS
1440014471 /* set curwin to be our win, temporarily */
1440114472 save_curwin = curwin ;
14473+ save_curtab = curtab ;
14474+ goto_tabpage_tp (tp );
14475+ if (!win_valid (win ))
14476+ return ;
1440214477 curwin = win ;
1440314478 curbuf = curwin -> w_buffer ;
1440414479#endif
@@ -14428,8 +14503,10 @@ f_setwinvar(argvars, rettv)
1442814503 }
1442914504
1443014505#ifdef FEAT_WINDOWS
14431- /* Restore current window, if it's still valid (autocomands can make
14432- * it invalid). */
14506+ /* Restore current tabpage and window, if still valid (autocomands can
14507+ * make them invalid). */
14508+ if (valid_tabpage (save_curtab ))
14509+ goto_tabpage_tp (save_curtab );
1443314510 if (win_valid (save_curwin ))
1443414511 {
1443514512 curwin = save_curwin ;
@@ -15901,7 +15978,7 @@ f_winbufnr(argvars, rettv)
1590115978{
1590215979 win_T * wp ;
1590315980
15904- wp = find_win_by_nr (& argvars [0 ]);
15981+ wp = find_win_by_nr (& argvars [0 ], NULL );
1590515982 if (wp == NULL )
1590615983 rettv -> vval .v_number = -1 ;
1590715984 else
@@ -15931,7 +16008,7 @@ f_winheight(argvars, rettv)
1593116008{
1593216009 win_T * wp ;
1593316010
15934- wp = find_win_by_nr (& argvars [0 ]);
16011+ wp = find_win_by_nr (& argvars [0 ], NULL );
1593516012 if (wp == NULL )
1593616013 rettv -> vval .v_number = -1 ;
1593716014 else
@@ -16092,7 +16169,7 @@ f_winwidth(argvars, rettv)
1609216169{
1609316170 win_T * wp ;
1609416171
16095- wp = find_win_by_nr (& argvars [0 ]);
16172+ wp = find_win_by_nr (& argvars [0 ], NULL );
1609616173 if (wp == NULL )
1609716174 rettv -> vval .v_number = -1 ;
1609816175 else
0 commit comments