*** runtime/doc/version7.txt (/mirror/svn-vim/tags/hack-base) (revision 249) --- runtime/doc/version7.txt (/mirror/svn-vim/branches/tabvar-func) (revision 249) *************** *** 50,55 **** --- 50,56 ---- Changed |changed-7.1| Added |added-7.1| Fixed |fixed-7.1| + Hacks |hacks-7.1| ============================================================================== INCOMPATIBLE CHANGES *incompatible-7* *************** *** 4616,4620 **** --- 4617,4629 ---- Files: src/memfile.c + Hacks *hacks-7.1* + ----- + + The following hacks are made by kana . + + - |gettabvar()| + - |settabvar()| + vim:tw=78:ts=8:ft=help:norl: *** runtime/doc/eval.txt (/mirror/svn-vim/tags/hack-base) (revision 249) --- runtime/doc/eval.txt (/mirror/svn-vim/branches/tabvar-func) (revision 249) *************** *** 1642,1647 **** --- 1642,1648 ---- getqflist() List list of quickfix items getreg( [{regname} [, 1]]) String contents of register getregtype( [{regname}]) String type of register + gettabvar( {tabnr}, {varname}) any variable {varname} in tab page {tabnr} gettabwinvar( {tabnr}, {winnr}, {name}) any {name} in {winnr} in tab page {tabnr} getwinposx() Number X coord in pixels of GUI Vim window *************** *** 1755,1760 **** --- 1756,1763 ---- 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( {tabnr}, {varname}, {val}) set {varname} in tab page {tabnr} + 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} *************** *** 2021,2028 **** char2nr(" ") returns 32 char2nr("ABC") returns 65 < The current 'encoding' is used. Example for "utf-8": > ! char2nr("?") returns 225 ! char2nr("?"[0]) returns 195 < nr2char() does the opposite. cindent({lnum}) *cindent()* --- 2024,2031 ---- char2nr(" ") returns 32 char2nr("ABC") returns 65 < The current 'encoding' is used. Example for "utf-8": > ! char2nr("á") returns 225 ! char2nr("Ã"[0]) returns 195 < nr2char() does the opposite. cindent({lnum}) *cindent()* *************** *** 3018,3023 **** --- 3021,3032 ---- is one character with value 0x16. If {regname} is not specified, |v:register| is used. + gettabvar({tabnr}, {varname}) *gettabvar()* + Get the value of variable {varname} which is local to tab page + {tabnr}. + When the variable doesn't exist an empty string is returned, + there is no error message. + gettabwinvar({tabnr}, {winnr}, {varname}) *gettabwinvar()* Get the value of window-local variable {varname} in window {winnr} in tab page {tabnr}. *************** *** 4608,4613 **** --- 4617,4630 ---- nothing: > :call setreg('a', '', 'al') + settabvar({tabnr}, {varname}, {val}) *settabvar()* + Set local variable {varname} in tab page {tabnr} to {val}. + Tabs are numbered starting with one. + Note that the variable name without "t:" must be used. + Vim briefly goes to the tab page {tabnr}, but this will never + trigger any 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}. *** src/eval.c (/mirror/svn-vim/tags/hack-base) (revision 249) --- src/eval.c (/mirror/svn-vim/branches/tabvar-func) (revision 249) *************** *** 536,541 **** --- 536,542 ---- 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)); *************** *** 627,632 **** --- 628,634 ---- 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)); *************** *** 7136,7141 **** --- 7138,7144 ---- {"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}, *************** *** 7229,7234 **** --- 7232,7238 ---- {"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, 1, f_shellescape}, *************** *** 10515,10520 **** --- 10519,10584 ---- } /* + * "gettabvar()" function + */ + static void + f_gettabvar(argvars, rettv) + typval_T *argvars; + typval_T *rettv; + { + tabpage_T *tp; + char_u *varname; + dictitem_T *v; + tabpage_T *save_curtab; + char_u *save_p_ei; + + rettv->v_type = VAR_STRING; + rettv->vval.v_string = NULL; + + tp = find_tabpage((int)get_tv_number_chk(&argvars[0], NULL)); + varname = get_tv_string_chk(&argvars[1]); + + ++emsg_off; + + if (tp != NULL && varname != NULL) + { + /* set 'eventignore' for all events to avoid side effects. */ + save_p_ei = vim_strsave(p_ei); + set_string_option_direct((char_u *)"ei", -1, + (char_u *)"all", OPT_FREE, SID_NONE); + + save_curtab = curtab; + goto_tabpage_tp(tp); + + if (*varname == NUL) + /* let gettabvar({tabnr}, "") return the "t:" dictionary. The + * scope prefix before the NUL byte is required by + * find_var_in_ht(). */ + varname = (char_u *)"t:" + 2; + /* 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); + + goto_tabpage_tp(save_curtab); + if (curtab == save_curtab) { + /* fake the flags to avoid flickering. */ + redraw_all_later(VALID); + must_redraw = VALID; + } + + /* restore 'eventignore' with the previous value. */ + if (save_p_ei != NULL) { + set_string_option_direct((char_u *)"ei", -1, + save_p_ei, OPT_FREE, SID_NONE); + free_string_option(save_p_ei); + } + } + + --emsg_off; + } + + /* * "gettabwinvar()" function */ static void *************** *** 14875,14880 **** --- 14939,15003 ---- } /* + * "settabvar()" function + */ + static void + f_settabvar(argvars, rettv) + typval_T *argvars; + typval_T *rettv; + { + tabpage_T *tp; + char_u *varname; + char_u *tabvarname; + typval_T *varp; + tabpage_T *save_curtab; + char_u *save_p_ei; + + 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) + { + /* set 'eventignore' for all events to avoid side effects. */ + save_p_ei = vim_strsave(p_ei); + set_string_option_direct((char_u *)"ei", -1, + (char_u *)"all", OPT_FREE, SID_NONE); + + 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); + } + + goto_tabpage_tp(save_curtab); + if (curtab == save_curtab) { + /* fake the flags to avoid flickering. */ + redraw_all_later(VALID); + must_redraw = VALID; + } + + /* restore 'eventignore' with the previous value. */ + if (save_p_ei != NULL) { + set_string_option_direct((char_u *)"ei", -1, + save_p_ei, OPT_FREE, SID_NONE); + free_string_option(save_p_ei); + } + } + } + + /* * "settabwinvar()" function */ static void