@@ -861,6 +861,7 @@ static int can_free_funccal __ARGS((funccall_T *fc, int copyID)) ;
861861static void free_funccal __ARGS((funccall_T *fc, int free_val));
862862static void add_nr_var __ARGS((dict_T *dp, dictitem_T *v, char *name, varnumber_T nr));
863863static win_T *find_win_by_nr __ARGS((typval_T *vp, tabpage_T *tp));
864+ static win_T *find_tabwin __ARGS((typval_T *wvp, typval_T *tvp));
864865static void getwinvar __ARGS((typval_T *argvars, typval_T *rettv, int off));
865866static int searchpair_cmn __ARGS((typval_T *argvars, pos_T *match_pos));
866867static int search_cmn __ARGS((typval_T *argvars, pos_T *match_pos, int *flagsp));
@@ -3687,7 +3688,7 @@ do_unlet_var(lp, name_end, forceit)
36873688 {
36883689 listitem_T *li;
36893690 listitem_T *ll_li = lp->ll_li;
3690- int ll_n1 = lp->ll_n1;
3691+ int ll_n1 = lp->ll_n1;
36913692
36923693 while (ll_li != NULL && (lp->ll_empty2 || lp->ll_n2 >= ll_n1))
36933694 {
@@ -8183,7 +8184,7 @@ static struct fst
81838184 {"getcmdtype", 0, 0, f_getcmdtype},
81848185 {"getcmdwintype", 0, 0, f_getcmdwintype},
81858186 {"getcurpos", 0, 0, f_getcurpos},
8186- {"getcwd", 0, 0 , f_getcwd},
8187+ {"getcwd", 0, 2 , f_getcwd},
81878188 {"getfontname", 0, 1, f_getfontname},
81888189 {"getfperm", 1, 1, f_getfperm},
81898190 {"getfsize", 1, 1, f_getfsize},
@@ -8207,7 +8208,7 @@ static struct fst
82078208 {"globpath", 2, 5, f_globpath},
82088209 {"has", 1, 1, f_has},
82098210 {"has_key", 2, 2, f_has_key},
8210- {"haslocaldir", 0, 0 , f_haslocaldir},
8211+ {"haslocaldir", 0, 2 , f_haslocaldir},
82118212 {"hasmapto", 1, 3, f_hasmapto},
82128213 {"highlightID", 1, 1, f_hlID}, /* obsolete */
82138214 {"highlight_exists",1, 1, f_hlexists}, /* obsolete */
@@ -9127,30 +9128,11 @@ f_arglistid(argvars, rettv)
91279128 typval_T *rettv;
91289129{
91299130 win_T *wp;
9130- tabpage_T *tp = NULL;
9131- long n;
91329131
91339132 rettv->vval.v_number = -1;
9134- if (argvars[0].v_type != VAR_UNKNOWN)
9135- {
9136- if (argvars[1].v_type != VAR_UNKNOWN)
9137- {
9138- n = get_tv_number(&argvars[1]);
9139- if (n >= 0)
9140- tp = find_tabpage(n);
9141- }
9142- else
9143- tp = curtab;
9144-
9145- if (tp != NULL)
9146- {
9147- wp = find_win_by_nr(&argvars[0], tp);
9148- if (wp != NULL)
9149- rettv->vval.v_number = wp->w_alist->id;
9150- }
9151- }
9152- else
9153- rettv->vval.v_number = curwin->w_alist->id;
9133+ wp = find_tabwin(&argvars[0], &argvars[1]);
9134+ if (wp != NULL)
9135+ rettv->vval.v_number = wp->w_alist->id;
91549136}
91559137
91569138/*
@@ -12061,25 +12043,36 @@ f_getcmdwintype(argvars, rettv)
1206112043 */
1206212044 static void
1206312045f_getcwd(argvars, rettv)
12064- typval_T *argvars UNUSED ;
12046+ typval_T *argvars;
1206512047 typval_T *rettv;
1206612048{
12049+ win_T *wp = NULL;
1206712050 char_u *cwd;
1206812051
1206912052 rettv->v_type = VAR_STRING;
1207012053 rettv->vval.v_string = NULL;
12071- cwd = alloc(MAXPATHL);
12072- if (cwd != NULL)
12054+
12055+ wp = find_tabwin(&argvars[0], &argvars[1]);
12056+ if (wp != NULL)
1207312057 {
12074- if (mch_dirname(cwd, MAXPATHL) != FAIL)
12058+ if (wp->w_localdir != NULL)
12059+ rettv->vval.v_string = vim_strsave(wp->w_localdir);
12060+ else if(globaldir != NULL)
12061+ rettv->vval.v_string = vim_strsave(globaldir);
12062+ else
1207512063 {
12076- rettv->vval.v_string = vim_strsave(cwd);
12064+ cwd = alloc(MAXPATHL);
12065+ if (cwd != NULL)
12066+ {
12067+ if (mch_dirname(cwd, MAXPATHL) != FAIL)
12068+ rettv->vval.v_string = vim_strsave(cwd);
12069+ vim_free(cwd);
12070+ }
12071+ }
1207712072#ifdef BACKSLASH_IN_FILENAME
12078- if (rettv->vval.v_string != NULL)
12079- slash_adjust(rettv->vval.v_string);
12073+ if (rettv->vval.v_string != NULL)
12074+ slash_adjust(rettv->vval.v_string);
1208012075#endif
12081- }
12082- vim_free(cwd);
1208312076 }
1208412077}
1208512078
@@ -12708,6 +12701,38 @@ find_win_by_nr(vp, tp)
1270812701#endif
1270912702}
1271012703
12704+ /*
12705+ * Find window specified by "wvp" in tabpage "tvp".
12706+ */
12707+ static win_T *
12708+ find_tabwin(wvp, tvp)
12709+ typval_T *wvp; /* VAR_UNKNOWN for current window */
12710+ typval_T *tvp; /* VAR_UNKNOWN for current tab page */
12711+ {
12712+ win_T *wp = NULL;
12713+ tabpage_T *tp = NULL;
12714+ long n;
12715+
12716+ if (wvp->v_type != VAR_UNKNOWN)
12717+ {
12718+ if (tvp->v_type != VAR_UNKNOWN)
12719+ {
12720+ n = get_tv_number(tvp);
12721+ if (n >= 0)
12722+ tp = find_tabpage(n);
12723+ }
12724+ else
12725+ tp = curtab;
12726+
12727+ if (tp != NULL)
12728+ wp = find_win_by_nr(wvp, tp);
12729+ }
12730+ else
12731+ wp = curwin;
12732+
12733+ return wp;
12734+ }
12735+
1271112736/*
1271212737 * "getwinvar()" function
1271312738 */
@@ -13543,10 +13568,13 @@ f_has_key(argvars, rettv)
1354313568 */
1354413569 static void
1354513570f_haslocaldir(argvars, rettv)
13546- typval_T *argvars UNUSED ;
13571+ typval_T *argvars;
1354713572 typval_T *rettv;
1354813573{
13549- rettv->vval.v_number = (curwin->w_localdir != NULL);
13574+ win_T *wp = NULL;
13575+
13576+ wp = find_tabwin(&argvars[0], &argvars[1]);
13577+ rettv->vval.v_number = (wp != NULL && wp->w_localdir != NULL);
1355013578}
1355113579
1355213580/*
@@ -21851,15 +21879,15 @@ get_funccal()
2185121879 funccal = current_funccal;
2185221880 if (debug_backtrace_level > 0)
2185321881 {
21854- for (i = 0; i < debug_backtrace_level; i++)
21855- {
21856- temp_funccal = funccal->caller;
21857- if (temp_funccal)
21858- funccal = temp_funccal;
21882+ for (i = 0; i < debug_backtrace_level; i++)
21883+ {
21884+ temp_funccal = funccal->caller;
21885+ if (temp_funccal)
21886+ funccal = temp_funccal;
2185921887 else
21860- /* backtrace level overflow. reset to max */
21861- debug_backtrace_level = i;
21862- }
21888+ /* backtrace level overflow. reset to max */
21889+ debug_backtrace_level = i;
21890+ }
2186321891 }
2186421892 return funccal;
2186521893}
@@ -23379,8 +23407,8 @@ ex_function(eap)
2337923407 * Also handles a Funcref in a List or Dictionary.
2338023408 * Returns the function name in allocated memory, or NULL for failure.
2338123409 * flags:
23382- * TFN_INT: internal function name OK
23383- * TFN_QUIET: be quiet
23410+ * TFN_INT: internal function name OK
23411+ * TFN_QUIET: be quiet
2338423412 * TFN_NO_AUTOLOAD: do not use script autoloading
2338523413 * Advances "pp" to just after the function name (if no error).
2338623414 */
0 commit comments