Index: runtime/doc/eval.txt
===================================================================
RCS file: /cvsroot/vim/vim7/runtime/doc/eval.txt,v
retrieving revision 1.189
diff -c -p -r1.189 eval.txt
*** runtime/doc/eval.txt	10 Mar 2010 12:45:36 -0000	1.189
--- runtime/doc/eval.txt	15 May 2010 05:08:57 -0000
*************** getpos( {expr})			List	position of curso
*** 1753,1758 ****
--- 1753,1759 ----
  getqflist()			List	list of quickfix items
  getreg( [{regname} [, 1]])	String	contents of register
  getregtype( [{regname}])	String	type of register
+ gettabvar( {nr}, {varname})	any	variable {varname} in tab {nr}
  gettabwinvar( {tabnr}, {winnr}, {name})
  				any	{name} in {winnr} in tab page {tabnr}
  getwinposx()			Number	X coord in pixels of GUI Vim window
*************** setmatches( {list})		Number	restore a li
*** 1871,1876 ****
--- 1872,1878 ----
  setpos( {expr}, {list})		none	set the {expr} position to {list}
  setqflist( {list}[, {action}])	Number	modify quickfix list using {list}
  setreg( {n}, {v}[, {opt}])	Number	set register to value and type
+ settabvar( {nr}, {varname}, {val})	set {varname} in tab page {nr} to {val}
  settabwinvar( {tabnr}, {winnr}, {varname}, {val})    set {varname} in window
  					{winnr} in tab page {tabnr} to {val}
  setwinvar( {nr}, {varname}, {val})	set {varname} in window {nr} to {val}
*************** getregtype([{regname}])					*getregtype(
*** 3255,3260 ****
--- 3257,3268 ----
  		<CTRL-V> is one character with value 0x16.
  		If {regname} is not specified, |v:register| is used.
  
+ gettabvar({tabnr}, {varname})				*gettabvar()*
+ 		Get the value of a tab local variable {varname} in tab page
+ 		{tabnr}.
+ 		Tabs are numbered starting with one.
+ 		Note that the name without "t:" must be used.
+ 
  gettabwinvar({tabnr}, {winnr}, {varname})		*gettabwinvar()*
  		Get the value of window-local variable {varname} in window
  		{winnr} in tab page {tabnr}.
*************** setreg({regname}, {value} [,{options}])
*** 4983,4988 ****
--- 4991,5004 ----
  		nothing: >
  			:call setreg('a', '', 'al')
  
+ settabvar({tabnr}, {varname}, {val})			*settabvar()*
+ 		Set tab local variable {varname} to {val} in tab page {tabnr}.
+ 		Note that the variable name without "t:" must be used.
+ 		Tabs are numbered starting with one.
+ 		Vim briefly goes to the tab page {tabnr}, this may trigger
+ 		TabLeave and TabEnter autocommands.
+ 		This function is not available in the |sandbox|.
+ 
  settabwinvar({tabnr}, {winnr}, {varname}, {val})	*settabwinvar()*
  		Set option or local variable {varname} in window {winnr} to
  		{val}.
Index: runtime/doc/usr_41.txt
===================================================================
RCS file: /cvsroot/vim/vim7/runtime/doc/usr_41.txt,v
retrieving revision 1.39
diff -c -p -r1.39 usr_41.txt
*** runtime/doc/usr_41.txt	19 Jan 2010 14:51:55 -0000	1.39
--- runtime/doc/usr_41.txt	15 May 2010 05:08:58 -0000
*************** Variables:
*** 670,677 ****
--- 670,679 ----
  	getbufvar()		get a variable value from a specific buffer
  	setbufvar()		set a variable in a specific buffer
  	getwinvar()		get a variable from specific window
+ 	gettabvar()		get a variable from specific tab page
  	gettabwinvar()		get a variable from specific window & tab page
  	setwinvar()		set a variable in a specific window
+ 	settabvar()		set a variable in a specific tab page
  	settabwinvar()		set a variable in a specific window & tab page
  	garbagecollect()	possibly free memory
  
Index: src/eval.c
===================================================================
RCS file: /cvsroot/vim/vim7/src/eval.c,v
retrieving revision 1.302
diff -c -p -r1.302 eval.c
*** src/eval.c	14 May 2010 18:41:39 -0000	1.302
--- src/eval.c	15 May 2010 05:09:01 -0000
*************** static void f_getpos __ARGS((typval_T *a
*** 565,570 ****
--- 565,571 ----
  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));
*************** static void f_setmatches __ARGS((typval_
*** 668,673 ****
--- 669,675 ----
  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));
*************** static struct fst
*** 7641,7646 ****
--- 7643,7649 ----
      {"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},
*************** static struct fst
*** 7746,7751 ****
--- 7749,7755 ----
      {"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},
*************** f_getregtype(argvars, rettv)
*** 11194,11199 ****
--- 11198,11229 ----
  }
  
  /*
+  * "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
*************** f_setreg(argvars, rettv)
*** 15673,15678 ****
--- 15703,15751 ----
  }
  
  /*
+  * "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;
+     char_u	nbuf[NUMBUFLEN];
+     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
