| To: vim_dev@googlegroups.com |
| Subject: Patch 7.3.831 |
| Fcc: outbox |
| From: Bram Moolenaar <Bram@moolenaar.net> |
| Mime-Version: 1.0 |
| Content-Type: text/plain; charset=UTF-8 |
| Content-Transfer-Encoding: 8bit |
| |
| |
| Patch 7.3.831 |
| Problem: Clumsy to handle the situation that a variable does not exist. |
| Solution: Add default value to getbufvar() et al. (Shougo Matsushita, |
| Hirohito Higashi) |
| Files: runtime/doc/eval.txt, src/eval.c src/testdir/test91.in, |
| src/testdir/test91.ok, src/testdir/Make_amiga.mak, |
| src/testdir/Make_dos.mak, src/testdir/Make_ming.mak, |
| src/testdir/Make_os2.mak, src/testdir/Make_vms.mms, |
| src/testdir/Makefile |
| |
| |
| |
| |
| |
| *** 1761,1772 **** |
| foldtextresult( {lnum}) String text for closed fold at {lnum} |
| foreground( ) Number bring the Vim window to the foreground |
| function( {name}) Funcref reference to function {name} |
| ! garbagecollect( [at_exit]) none free memory, breaking cyclic references |
| get( {list}, {idx} [, {def}]) any get item {idx} from {list} or {def} |
| get( {dict}, {key} [, {def}]) any get item {key} from {dict} or {def} |
| getbufline( {expr}, {lnum} [, {end}]) |
| List lines {lnum} to {end} of buffer {expr} |
| ! getbufvar( {expr}, {varname}) any variable {varname} in buffer {expr} |
| getchar( [expr]) Number get one character from the user |
| getcharmod( ) Number modifiers for the last typed character |
| getcmdline() String return the current command-line |
| --- 1772,1784 ---- |
| foldtextresult( {lnum}) String text for closed fold at {lnum} |
| foreground( ) Number bring the Vim window to the foreground |
| function( {name}) Funcref reference to function {name} |
| ! garbagecollect( [{atexit}]) none free memory, breaking cyclic references |
| get( {list}, {idx} [, {def}]) any get item {idx} from {list} or {def} |
| get( {dict}, {key} [, {def}]) any get item {key} from {dict} or {def} |
| getbufline( {expr}, {lnum} [, {end}]) |
| List lines {lnum} to {end} of buffer {expr} |
| ! getbufvar( {expr}, {varname} [, {def}]) |
| ! any variable {varname} in buffer {expr} |
| getchar( [expr]) Number get one character from the user |
| getcharmod( ) Number modifiers for the last typed character |
| getcmdline() String return the current command-line |
| |
| *** 1787,1798 **** |
| 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 |
| getwinposy() Number Y coord in pixels of GUI Vim window |
| ! getwinvar( {nr}, {varname}) any variable {varname} in window {nr} |
| glob( {expr} [, {nosuf} [, {list}]]) |
| any expand file wildcards in {expr} |
| globpath( {path}, {expr} [, {flag}]) |
| --- 1799,1812 ---- |
| getqflist() List list of quickfix items |
| getreg( [{regname} [, 1]]) String contents of register |
| getregtype( [{regname}]) String type of register |
| ! gettabvar( {nr}, {varname} [, {def}]) |
| ! any variable {varname} in tab {nr} or {def} |
| ! gettabwinvar( {tabnr}, {winnr}, {name} [, {def}]) |
| any {name} in {winnr} in tab page {tabnr} |
| getwinposx() Number X coord in pixels of GUI Vim window |
| getwinposy() Number Y coord in pixels of GUI Vim window |
| ! getwinvar( {nr}, {varname} [, {def}]) |
| ! any variable {varname} in window {nr} |
| glob( {expr} [, {nosuf} [, {list}]]) |
| any expand file wildcards in {expr} |
| globpath( {path}, {expr} [, {flag}]) |
| |
| *** 3131,3137 **** |
| Example: > |
| :let lines = getbufline(bufnr("myfile"), 1, "$") |
| |
| ! getbufvar({expr}, {varname}) *getbufvar()* |
| The result is the value of option or local buffer variable |
| {varname} in buffer {expr}. Note that the name without "b:" |
| must be used. |
| --- 3146,3152 ---- |
| Example: > |
| :let lines = getbufline(bufnr("myfile"), 1, "$") |
| |
| ! getbufvar({expr}, {varname} [, {def}]) *getbufvar()* |
| The result is the value of option or local buffer variable |
| {varname} in buffer {expr}. Note that the name without "b:" |
| must be used. |
| |
| *** 3141,3148 **** |
| doesn't work for a global variable, window-local variable or |
| window-local option. |
| For the use of {expr}, see |bufname()| above. |
| ! When the buffer or variable doesn't exist an empty string is |
| ! returned, there is no error message. |
| Examples: > |
| :let bufmodified = getbufvar(1, "&mod") |
| :echo "todo myvar = " . getbufvar("todo", "myvar") |
| --- 3156,3163 ---- |
| doesn't work for a global variable, window-local variable or |
| window-local option. |
| For the use of {expr}, see |bufname()| above. |
| ! When the buffer or variable doesn't exist {def} or an empty |
| ! string is returned, there is no error message. |
| Examples: > |
| :let bufmodified = getbufvar(1, "&mod") |
| :echo "todo myvar = " . getbufvar("todo", "myvar") |
| |
| *** 3414,3439 **** |
| <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}. |t:var| |
| 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}. |
| When {varname} starts with "&" get the value of a window-local |
| option. |
| Tabs are numbered starting with one. For the current tabpage |
| use |getwinvar()|. |
| When {winnr} is zero the current window is used. |
| This also works for a global option, buffer-local option and |
| window-local option, but it doesn't work for a global variable |
| or buffer-local variable. |
| ! When {varname} is empty a dictionary with all window-local |
| ! variables is returned. |
| ! Note that {varname} must be the name without "w:". |
| Examples: > |
| :let list_is_on = gettabwinvar(1, 2, '&list') |
| :echo "myvar = " . gettabwinvar(3, 1, 'myvar') |
| --- 3434,3463 ---- |
| <CTRL-V> is one character with value 0x16. |
| If {regname} is not specified, |v:register| is used. |
| |
| ! gettabvar({tabnr}, {varname} [, {def}]) *gettabvar()* |
| Get the value of a tab-local variable {varname} in tab page |
| {tabnr}. |t:var| |
| Tabs are numbered starting with one. |
| Note that the name without "t:" must be used. |
| + When the tab or variable doesn't exist {def} or an empty |
| + string is returned, there is no error message. |
| |
| ! gettabwinvar({tabnr}, {winnr}, {varname} [, {def}]) *gettabwinvar()* |
| Get the value of window-local variable {varname} in window |
| {winnr} in tab page {tabnr}. |
| When {varname} starts with "&" get the value of a window-local |
| option. |
| + When {varname} is empty a dictionary with all window-local |
| + variables is returned. |
| + Note that {varname} must be the name without "w:". |
| Tabs are numbered starting with one. For the current tabpage |
| use |getwinvar()|. |
| When {winnr} is zero the current window is used. |
| This also works for a global option, buffer-local option and |
| window-local option, but it doesn't work for a global variable |
| or buffer-local variable. |
| ! When the tab, window or variable doesn't exist {def} or an |
| ! empty string is returned, there is no error message. |
| Examples: > |
| :let list_is_on = gettabwinvar(1, 2, '&list') |
| :echo "myvar = " . gettabwinvar(3, 1, 'myvar') |
| |
| *** 3448,3454 **** |
| the top of the GUI Vim window. The result will be -1 if the |
| information is not available. |
| |
| ! getwinvar({winnr}, {varname}) *getwinvar()* |
| Like |gettabwinvar()| for the current tabpage. |
| Examples: > |
| :let list_is_on = getwinvar(2, '&list') |
| --- 3472,3478 ---- |
| the top of the GUI Vim window. The result will be -1 if the |
| information is not available. |
| |
| ! getwinvar({winnr}, {varname} [, {def}]) *getwinvar()* |
| Like |gettabwinvar()| for the current tabpage. |
| Examples: > |
| :let list_is_on = getwinvar(2, '&list') |
| |
| |
| |
| *** 7916,7922 **** |
| {"garbagecollect", 0, 1, f_garbagecollect}, |
| {"get", 2, 3, f_get}, |
| {"getbufline", 2, 3, f_getbufline}, |
| ! {"getbufvar", 2, 2, f_getbufvar}, |
| {"getchar", 0, 1, f_getchar}, |
| {"getcharmod", 0, 0, f_getcharmod}, |
| {"getcmdline", 0, 0, f_getcmdline}, |
| --- 7916,7922 ---- |
| {"garbagecollect", 0, 1, f_garbagecollect}, |
| {"get", 2, 3, f_get}, |
| {"getbufline", 2, 3, f_getbufline}, |
| ! {"getbufvar", 2, 3, f_getbufvar}, |
| {"getchar", 0, 1, f_getchar}, |
| {"getcharmod", 0, 0, f_getcharmod}, |
| {"getcmdline", 0, 0, f_getcmdline}, |
| |
| *** 7936,7946 **** |
| {"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}, |
| ! {"getwinvar", 2, 2, f_getwinvar}, |
| {"glob", 1, 3, f_glob}, |
| {"globpath", 2, 3, f_globpath}, |
| {"has", 1, 1, f_has}, |
| --- 7936,7946 ---- |
| {"getqflist", 0, 0, f_getqflist}, |
| {"getreg", 0, 2, f_getreg}, |
| {"getregtype", 0, 1, f_getregtype}, |
| ! {"gettabvar", 2, 3, f_gettabvar}, |
| ! {"gettabwinvar", 3, 4, f_gettabwinvar}, |
| {"getwinposx", 0, 0, f_getwinposx}, |
| {"getwinposy", 0, 0, f_getwinposy}, |
| ! {"getwinvar", 2, 3, f_getwinvar}, |
| {"glob", 1, 3, f_glob}, |
| {"globpath", 2, 3, f_globpath}, |
| {"has", 1, 1, f_has}, |
| |
| *** 11115,11122 **** |
| ++emsg_off; |
| buf = get_buf_tv(&argvars[0]); |
| |
| ! rettv->v_type = VAR_STRING; |
| ! rettv->vval.v_string = NULL; |
| |
| if (buf != NULL && varname != NULL) |
| { |
| --- 11115,11128 ---- |
| ++emsg_off; |
| buf = get_buf_tv(&argvars[0]); |
| |
| ! if (argvars[2].v_type != VAR_UNKNOWN) |
| ! /* set the default value */ |
| ! copy_tv(&argvars[2], rettv); |
| ! else |
| ! { |
| ! rettv->v_type = VAR_STRING; |
| ! rettv->vval.v_string = NULL; |
| ! } |
| |
| if (buf != NULL && varname != NULL) |
| { |
| |
| *** 11785,11791 **** |
| --- 11791,11801 ---- |
| v = find_var_in_ht(&tp->tp_vars.dv_hashtab, varname, FALSE); |
| if (v != NULL) |
| copy_tv(&v->di_tv, rettv); |
| + else if (argvars[2].v_type != VAR_UNKNOWN) |
| + copy_tv(&argvars[2], rettv); |
| } |
| + else if (argvars[2].v_type != VAR_UNKNOWN) |
| + copy_tv(&argvars[2], rettv); |
| } |
| |
| /* |
| |
| *** 11907,11914 **** |
| varname = get_tv_string_chk(&argvars[off + 1]); |
| ++emsg_off; |
| |
| ! rettv->v_type = VAR_STRING; |
| ! rettv->vval.v_string = NULL; |
| |
| if (win != NULL && varname != NULL) |
| { |
| --- 11917,11930 ---- |
| varname = get_tv_string_chk(&argvars[off + 1]); |
| ++emsg_off; |
| |
| ! if (argvars[off + 2].v_type != VAR_UNKNOWN) |
| ! /* set the default return value */ |
| ! copy_tv(&argvars[off + 2], rettv); |
| ! else |
| ! { |
| ! rettv->v_type = VAR_STRING; |
| ! rettv->vval.v_string = NULL; |
| ! } |
| |
| if (win != NULL && varname != NULL) |
| { |
| |
| |
| |
| |
| --- 1,98 ---- |
| + Tests for getbufvar(), getwinvar(), gettabvar() and gettabwinvar(). |
| + vim: set ft=vim : |
| + |
| + STARTTEST |
| + :so small.vim |
| + :" |
| + :" test for getbufvar() |
| + :let b:var_num = 1234 |
| + :let def_num = 5678 |
| + :$put =string(getbufvar(1, 'var_num')) |
| + :$put =string(getbufvar(1, 'var_num', def_num)) |
| + :$put =string(getbufvar(1, '')) |
| + :$put =string(getbufvar(1, '', def_num)) |
| + :unlet b:var_num |
| + :$put =string(getbufvar(1, 'var_num', def_num)) |
| + :$put =string(getbufvar(1, '')) |
| + :$put =string(getbufvar(1, '', def_num)) |
| + :$put =string(getbufvar(9, '')) |
| + :$put =string(getbufvar(9, '', def_num)) |
| + :unlet def_num |
| + :$put =string(getbufvar(1, '&autoindent')) |
| + :$put =string(getbufvar(1, '&autoindent', 1)) |
| + :" |
| + :" test for getwinvar() |
| + :let w:var_str = "Dance" |
| + :let def_str = "Chance" |
| + :$put =string(getwinvar(1, 'var_str')) |
| + :$put =string(getwinvar(1, 'var_str', def_str)) |
| + :$put =string(getwinvar(1, '')) |
| + :$put =string(getwinvar(1, '', def_str)) |
| + :unlet w:var_str |
| + :$put =string(getwinvar(1, 'var_str', def_str)) |
| + :$put =string(getwinvar(1, '')) |
| + :$put =string(getwinvar(1, '', def_str)) |
| + :$put =string(getwinvar(9, '')) |
| + :$put =string(getwinvar(9, '', def_str)) |
| + :$put =string(getwinvar(1, '&nu')) |
| + :$put =string(getwinvar(1, '&nu', 1)) |
| + :unlet def_str |
| + :" |
| + :" test for gettabvar() |
| + :tabnew |
| + :tabnew |
| + :let t:var_list = [1, 2, 3] |
| + :let def_list = [4, 5, 6, 7] |
| + :tabrewind |
| + :$put =string(gettabvar(3, 'var_list')) |
| + :$put =string(gettabvar(3, 'var_list', def_list)) |
| + :$put =string(gettabvar(3, '')) |
| + :$put =string(gettabvar(3, '', def_list)) |
| + :tablast |
| + :unlet t:var_list |
| + :tabrewind |
| + :$put =string(gettabvar(3, 'var_list', def_list)) |
| + :$put =string(gettabvar(9, '')) |
| + :$put =string(gettabvar(9, '', def_list)) |
| + :$put =string(gettabvar(3, '&nu')) |
| + :$put =string(gettabvar(3, '&nu', def_list)) |
| + :unlet def_list |
| + :tabonly |
| + :" |
| + :" test for gettabwinvar() |
| + :tabnew |
| + :tabnew |
| + :tabprev |
| + :split |
| + :split |
| + :wincmd w |
| + :vert split |
| + :wincmd w |
| + :let w:var_dict = {'dict': 'tabwin'} |
| + :let def_dict = {'dict2': 'newval'} |
| + :wincmd b |
| + :tabrewind |
| + :$put =string(gettabwinvar(2, 3, 'var_dict')) |
| + :$put =string(gettabwinvar(2, 3, 'var_dict', def_dict)) |
| + :$put =string(gettabwinvar(2, 3, '')) |
| + :$put =string(gettabwinvar(2, 3, '', def_dict)) |
| + :tabnext |
| + :3wincmd w |
| + :unlet w:var_dict |
| + :tabrewind |
| + :$put =string(gettabwinvar(2, 3, 'var_dict', def_dict)) |
| + :$put =string(gettabwinvar(2, 3, '')) |
| + :$put =string(gettabwinvar(2, 3, '', def_dict)) |
| + :$put =string(gettabwinvar(2, 9, '')) |
| + :$put =string(gettabwinvar(2, 9, '', def_dict)) |
| + :$put =string(gettabwinvar(9, 3, '')) |
| + :$put =string(gettabwinvar(9, 3, '', def_dict)) |
| + :unlet def_dict |
| + :$put =string(gettabwinvar(2, 3, '&nux')) |
| + :$put =string(gettabwinvar(2, 3, '&nux', 1)) |
| + :tabonly |
| + :" |
| + :/^start/,$wq! test.out |
| + ENDTEST |
| + |
| + start: |
| |
| |
| |
| |
| --- 1,45 ---- |
| + start: |
| + 1234 |
| + 1234 |
| + {'var_num': 1234} |
| + {'var_num': 1234} |
| + 5678 |
| + {} |
| + {} |
| + '' |
| + 5678 |
| + 0 |
| + 0 |
| + 'Dance' |
| + 'Dance' |
| + {'var_str': 'Dance'} |
| + {'var_str': 'Dance'} |
| + 'Chance' |
| + {} |
| + {} |
| + '' |
| + 'Chance' |
| + 0 |
| + 0 |
| + [1, 2, 3] |
| + [1, 2, 3] |
| + '' |
| + [4, 5, 6, 7] |
| + [4, 5, 6, 7] |
| + '' |
| + [4, 5, 6, 7] |
| + '' |
| + [4, 5, 6, 7] |
| + {'dict': 'tabwin'} |
| + {'dict': 'tabwin'} |
| + {'var_dict': {'dict': 'tabwin'}} |
| + {'var_dict': {'dict': 'tabwin'}} |
| + {'dict2': 'newval'} |
| + {} |
| + {} |
| + '' |
| + {'dict2': 'newval'} |
| + '' |
| + {'dict2': 'newval'} |
| + '' |
| + 1 |
| |
| |
| |
| *** 32,38 **** |
| test71.out test72.out test73.out test74.out test75.out \ |
| test76.out test77.out test78.out test79.out test80.out \ |
| test81.out test82.out test83.out test84.out test88.out \ |
| ! test89.out test90.out |
| |
| .SUFFIXES: .in .out |
| |
| --- 32,38 ---- |
| test71.out test72.out test73.out test74.out test75.out \ |
| test76.out test77.out test78.out test79.out test80.out \ |
| test81.out test82.out test83.out test84.out test88.out \ |
| ! test89.out test90.out test91.out |
| |
| .SUFFIXES: .in .out |
| |
| |
| *** 139,141 **** |
| --- 139,142 ---- |
| test88.out: test88.in |
| test89.out: test89.in |
| test90.out: test90.in |
| + test91.out: test91.in |
| |
| |
| |
| *** 31,37 **** |
| test74.out test75.out test76.out test77.out test78.out \ |
| test79.out test80.out test81.out test82.out test83.out \ |
| test84.out test85.out test86.out test87.out test88.out \ |
| ! test89.out test90.out |
| |
| SCRIPTS32 = test50.out test70.out |
| |
| --- 31,37 ---- |
| test74.out test75.out test76.out test77.out test78.out \ |
| test79.out test80.out test81.out test82.out test83.out \ |
| test84.out test85.out test86.out test87.out test88.out \ |
| ! test89.out test90.out test91.out |
| |
| SCRIPTS32 = test50.out test70.out |
| |
| |
| |
| |
| *** 51,57 **** |
| test74.out test75.out test76.out test77.out test78.out \ |
| test79.out test80.out test81.out test82.out test83.out \ |
| test84.out test85.out test86.out test87.out test88.out \ |
| ! test89.out test90.out |
| |
| SCRIPTS32 = test50.out test70.out |
| |
| --- 51,57 ---- |
| test74.out test75.out test76.out test77.out test78.out \ |
| test79.out test80.out test81.out test82.out test83.out \ |
| test84.out test85.out test86.out test87.out test88.out \ |
| ! test89.out test90.out test91.out |
| |
| SCRIPTS32 = test50.out test70.out |
| |
| |
| |
| |
| *** 32,38 **** |
| test71.out test72.out test73.out test74.out test75.out \ |
| test76.out test77.out test78.out test79.out test80.out \ |
| test81.out test82.out test83.out test84.out test88.out \ |
| ! test89.out test90.out |
| |
| .SUFFIXES: .in .out |
| |
| --- 32,38 ---- |
| test71.out test72.out test73.out test74.out test75.out \ |
| test76.out test77.out test78.out test79.out test80.out \ |
| test81.out test82.out test83.out test84.out test88.out \ |
| ! test89.out test90.out test91.out |
| |
| .SUFFIXES: .in .out |
| |
| |
| |
| |
| *** 4,10 **** |
| # Authors: Zoltan Arpadffy, <arpadffy@polarhome.com> |
| # Sandor Kopanyi, <sandor.kopanyi@mailbox.hu> |
| # |
| ! # Last change: 2013 Feb 13 |
| # |
| # This has been tested on VMS 6.2 to 8.3 on DEC Alpha, VAX and IA64. |
| # Edit the lines in the Configuration section below to select. |
| --- 4,10 ---- |
| # Authors: Zoltan Arpadffy, <arpadffy@polarhome.com> |
| # Sandor Kopanyi, <sandor.kopanyi@mailbox.hu> |
| # |
| ! # Last change: 2013 Feb 20 |
| # |
| # This has been tested on VMS 6.2 to 8.3 on DEC Alpha, VAX and IA64. |
| # Edit the lines in the Configuration section below to select. |
| |
| *** 77,83 **** |
| test71.out test72.out test74.out test75.out test76.out \ |
| test77.out test78.out test79.out test80.out test81.out \ |
| test82.out test83.out test84.out test88.out test89.out \ |
| ! test90.out |
| |
| # Known problems: |
| # Test 30: a problem around mac format - unknown reason |
| --- 77,83 ---- |
| test71.out test72.out test74.out test75.out test76.out \ |
| test77.out test78.out test79.out test80.out test81.out \ |
| test82.out test83.out test84.out test88.out test89.out \ |
| ! test90.out test91.out |
| |
| # Known problems: |
| # Test 30: a problem around mac format - unknown reason |
| |
| |
| |
| *** 28,34 **** |
| test74.out test75.out test76.out test77.out test78.out \ |
| test79.out test80.out test81.out test82.out test83.out \ |
| test84.out test85.out test86.out test87.out test88.out \ |
| ! test89.out test90.out |
| |
| SCRIPTS_GUI = test16.out |
| |
| --- 28,34 ---- |
| test74.out test75.out test76.out test77.out test78.out \ |
| test79.out test80.out test81.out test82.out test83.out \ |
| test84.out test85.out test86.out test87.out test88.out \ |
| ! test89.out test90.out test91.out |
| |
| SCRIPTS_GUI = test16.out |
| |
| |
| |
| |
| *** 730,731 **** |
| --- 730,733 ---- |
| { /* Add new patch number below this line */ |
| + /**/ |
| + 831, |
| /**/ |
| |
| -- |
| | |
| |
| Ceci n'est pas une pipe. |
| |
| /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ |
| /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ |
| \\\ an exciting new programming language -- http://www.Zimbu.org /// |
| \\\ help me help AIDS victims -- http://ICCF-Holland.org /// |