Add the settabvar() and gettabvar() functions.
Various runtime file updates.
diff --git a/src/eval.c b/src/eval.c
index 1803e0e..df116ad 100644
--- a/src/eval.c
+++ b/src/eval.c
@@ -573,6 +573,7 @@
 static void f_getqflist __ARGS((typval_T *argvars, typval_T *rettv));
 static void f_getreg __ARGS((typval_T *argvars, typval_T *rettv));
 static void f_getregtype __ARGS((typval_T *argvars, typval_T *rettv));
+static void f_gettabvar __ARGS((typval_T *argvars, typval_T *rettv));
 static void f_gettabwinvar __ARGS((typval_T *argvars, typval_T *rettv));
 static void f_getwinposx __ARGS((typval_T *argvars, typval_T *rettv));
 static void f_getwinposy __ARGS((typval_T *argvars, typval_T *rettv));
@@ -677,6 +678,7 @@
 static void f_setpos __ARGS((typval_T *argvars, typval_T *rettv));
 static void f_setqflist __ARGS((typval_T *argvars, typval_T *rettv));
 static void f_setreg __ARGS((typval_T *argvars, typval_T *rettv));
+static void f_settabvar __ARGS((typval_T *argvars, typval_T *rettv));
 static void f_settabwinvar __ARGS((typval_T *argvars, typval_T *rettv));
 static void f_setwinvar __ARGS((typval_T *argvars, typval_T *rettv));
 static void f_shellescape __ARGS((typval_T *argvars, typval_T *rettv));
@@ -7663,6 +7665,7 @@
     {"getqflist",	0, 0, f_getqflist},
     {"getreg",		0, 2, f_getreg},
     {"getregtype",	0, 1, f_getregtype},
+    {"gettabvar",	2, 2, f_gettabvar},
     {"gettabwinvar",	3, 3, f_gettabwinvar},
     {"getwinposx",	0, 0, f_getwinposx},
     {"getwinposy",	0, 0, f_getwinposy},
@@ -7769,6 +7772,7 @@
     {"setpos",		2, 2, f_setpos},
     {"setqflist",	1, 2, f_setqflist},
     {"setreg",		2, 3, f_setreg},
+    {"settabvar",	3, 3, f_settabvar},
     {"settabwinvar",	4, 4, f_settabwinvar},
     {"setwinvar",	3, 3, f_setwinvar},
     {"shellescape",	1, 2, f_shellescape},
@@ -11328,6 +11332,32 @@
 }
 
 /*
+ * "gettabvar()" function
+ */
+    static void
+f_gettabvar(argvars, rettv)
+    typval_T	*argvars;
+    typval_T	*rettv;
+{
+    tabpage_T	*tp;
+    dictitem_T	*v;
+    char_u	*varname;
+
+    rettv->v_type = VAR_STRING;
+    rettv->vval.v_string = NULL;
+
+    varname = get_tv_string_chk(&argvars[1]);
+    tp = find_tabpage((int)get_tv_number_chk(&argvars[0], NULL));
+    if (tp != NULL && varname != NULL)
+    {
+	/* look up the variable */
+	v = find_var_in_ht(&tp->tp_vars.dv_hashtab, varname, FALSE);
+	if (v != NULL)
+	    copy_tv(&v->di_tv, rettv);
+    }
+}
+
+/*
  * "gettabwinvar()" function
  */
     static void
@@ -15824,6 +15854,48 @@
 }
 
 /*
+ * "settabvar()" function
+ */
+    static void
+f_settabvar(argvars, rettv)
+    typval_T	*argvars;
+    typval_T	*rettv;
+{
+    tabpage_T	*save_curtab;
+    char_u	*varname, *tabvarname;
+    typval_T	*varp;
+    tabpage_T	*tp;
+
+    rettv->vval.v_number = 0;
+
+    if (check_restricted() || check_secure())
+	return;
+
+    tp = find_tabpage((int)get_tv_number_chk(&argvars[0], NULL));
+    varname = get_tv_string_chk(&argvars[1]);
+    varp = &argvars[2];
+
+    if (tp != NULL && varname != NULL && varp != NULL)
+    {
+	save_curtab = curtab;
+	goto_tabpage_tp(tp);
+
+	tabvarname = alloc((unsigned)STRLEN(varname) + 3);
+	if (tabvarname != NULL)
+	{
+	    STRCPY(tabvarname, "t:");
+	    STRCPY(tabvarname + 2, varname);
+	    set_var(tabvarname, varp, TRUE);
+	    vim_free(tabvarname);
+	}
+
+	/* Restore current tabpage */
+	if (valid_tabpage(save_curtab))
+	    goto_tabpage_tp(save_curtab);
+    }
+}
+
+/*
  * "settabwinvar()" function
  */
     static void