summaryrefslogtreecommitdiffstats
path: root/src/eval.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/eval.c')
-rw-r--r--src/eval.c148
1 files changed, 121 insertions, 27 deletions
diff --git a/src/eval.c b/src/eval.c
index b0202cdb32..f857b8fc9d 100644
--- a/src/eval.c
+++ b/src/eval.c
@@ -621,7 +621,9 @@ static void f_synID __ARGS((typval_T *argvars, typval_T *rettv));
static void f_synIDattr __ARGS((typval_T *argvars, typval_T *rettv));
static void f_synIDtrans __ARGS((typval_T *argvars, typval_T *rettv));
static void f_system __ARGS((typval_T *argvars, typval_T *rettv));
+static void f_tabpagebuflist __ARGS((typval_T *argvars, typval_T *rettv));
static void f_tabpagenr __ARGS((typval_T *argvars, typval_T *rettv));
+static void f_tabpagewinnr __ARGS((typval_T *argvars, typval_T *rettv));
static void f_taglist __ARGS((typval_T *argvars, typval_T *rettv));
static void f_tagfiles __ARGS((typval_T *argvars, typval_T *rettv));
static void f_tempname __ARGS((typval_T *argvars, typval_T *rettv));
@@ -6984,7 +6986,9 @@ static struct fst
{"synIDattr", 2, 3, f_synIDattr},
{"synIDtrans", 1, 1, f_synIDtrans},
{"system", 1, 2, f_system},
+ {"tabpagebuflist", 0, 1, f_tabpagebuflist},
{"tabpagenr", 0, 1, f_tabpagenr},
+ {"tabpagewinnr", 1, 2, f_tabpagewinnr},
{"tagfiles", 0, 0, f_tagfiles},
{"taglist", 1, 1, f_taglist},
{"tempname", 0, 0, f_tempname},
@@ -14870,6 +14874,52 @@ done:
}
/*
+ * "tabpagebuflist()" function
+ */
+/* ARGSUSED */
+ static void
+f_tabpagebuflist(argvars, rettv)
+ typval_T *argvars;
+ typval_T *rettv;
+{
+#ifndef FEAT_WINDOWS
+ rettv->vval.v_number = 0;
+#else
+ tabpage_T *tp;
+ win_T *wp = NULL;
+ list_T *l;
+
+ if (argvars[0].v_type == VAR_UNKNOWN)
+ wp = firstwin;
+ else
+ {
+ tp = find_tabpage((int)get_tv_number(&argvars[0]));
+ if (tp != NULL)
+ wp = tp->tp_firstwin;
+ }
+ if (wp == NULL)
+ rettv->vval.v_number = 0;
+ else
+ {
+ l = list_alloc();
+ if (l == NULL)
+ rettv->vval.v_number = 0;
+ else
+ {
+ rettv->vval.v_list = l;
+ rettv->v_type = VAR_LIST;
+ ++l->lv_refcount;
+
+ for (; wp != NULL; wp = wp->w_next)
+ if (list_append_number(l, wp->w_buffer->b_fnum) == FAIL)
+ break;
+ }
+ }
+#endif
+}
+
+
+/*
* "tabpagenr()" function
*/
/* ARGSUSED */
@@ -14903,6 +14953,75 @@ f_tabpagenr(argvars, rettv)
rettv->vval.v_number = nr;
}
+
+#ifdef FEAT_WINDOWS
+static int get_winnr __ARGS((tabpage_T *tp, typval_T *argvar));
+
+/*
+ * Common code for tabpagewinnr() and winnr().
+ */
+ static int
+get_winnr(tp, argvar)
+ tabpage_T *tp;
+ typval_T *argvar;
+{
+ win_T *twin;
+ int nr = 1;
+ win_T *wp;
+ char_u *arg;
+
+ twin = (tp == curtab) ? curwin : tp->tp_curwin;
+ if (argvar->v_type != VAR_UNKNOWN)
+ {
+ arg = get_tv_string_chk(argvar);
+ if (arg == NULL)
+ nr = 0; /* type error; errmsg already given */
+ else if (STRCMP(arg, "$") == 0)
+ twin = (tp == curtab) ? lastwin : tp->tp_lastwin;
+ else if (STRCMP(arg, "#") == 0)
+ {
+ twin = (tp == curtab) ? prevwin : tp->tp_prevwin;
+ if (twin == NULL)
+ nr = 0;
+ }
+ else
+ {
+ EMSG2(_(e_invexpr2), arg);
+ nr = 0;
+ }
+ }
+
+ if (nr > 0)
+ for (wp = (tp == curtab) ? firstwin : tp->tp_firstwin;
+ wp != twin; wp = wp->w_next)
+ ++nr;
+ return nr;
+}
+#endif
+
+/*
+ * "tabpagewinnr()" function
+ */
+/* ARGSUSED */
+ static void
+f_tabpagewinnr(argvars, rettv)
+ typval_T *argvars;
+ typval_T *rettv;
+{
+ int nr = 1;
+#ifdef FEAT_WINDOWS
+ tabpage_T *tp;
+
+ tp = find_tabpage((int)get_tv_number(&argvars[0]));
+ if (tp == NULL)
+ nr = 0;
+ else
+ nr = get_winnr(tp, &argvars[1]);
+#endif
+ rettv->vval.v_number = nr;
+}
+
+
/*
* "tagfiles()" function
*/
@@ -15357,34 +15476,9 @@ f_winnr(argvars, rettv)
typval_T *rettv;
{
int nr = 1;
-#ifdef FEAT_WINDOWS
- win_T *wp;
- win_T *twin = curwin;
- char_u *arg;
- if (argvars[0].v_type != VAR_UNKNOWN)
- {
- arg = get_tv_string_chk(&argvars[0]);
- if (arg == NULL)
- nr = 0; /* type error; errmsg already given */
- else if (STRCMP(arg, "$") == 0)
- twin = lastwin;
- else if (STRCMP(arg, "#") == 0)
- {
- twin = prevwin;
- if (prevwin == NULL)
- nr = 0;
- }
- else
- {
- EMSG2(_(e_invexpr2), arg);
- nr = 0;
- }
- }
-
- if (nr > 0)
- for (wp = firstwin; wp != twin; wp = wp->w_next)
- ++nr;
+#ifdef FEAT_WINDOWS
+ nr = get_winnr(curtab, &argvars[0]);
#endif
rettv->vval.v_number = nr;
}