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


*** ../vim-7.3.830/runtime/doc/eval.txt 2013-02-20 17:58:01.000000000 +0100
--- runtime/doc/eval.txt        2013-02-20 20:53:50.000000000 +0100
***************
*** 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')
*** ../vim-7.3.830/src/eval.c   2013-02-20 17:58:01.000000000 +0100
--- src/eval.c  2013-02-20 20:52:09.000000000 +0100
***************
*** 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)
      {
*** ../vim-7.3.830/src/testdir/test91.in        2013-02-20 21:09:20.000000000 
+0100
--- src/testdir/test91.in       2013-02-20 20:57:49.000000000 +0100
***************
*** 0 ****
--- 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:
*** ../vim-7.3.830/src/testdir/test91.ok        2013-02-20 21:09:20.000000000 
+0100
--- src/testdir/test91.ok       2013-02-20 20:57:45.000000000 +0100
***************
*** 0 ****
--- 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
*** ../vim-7.3.830/src/testdir/Make_amiga.mak   2013-02-13 17:34:59.000000000 
+0100
--- src/testdir/Make_amiga.mak  2013-02-20 20:21:03.000000000 +0100
***************
*** 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
*** ../vim-7.3.830/src/testdir/Make_dos.mak     2013-02-13 17:34:59.000000000 
+0100
--- src/testdir/Make_dos.mak    2013-02-20 20:21:13.000000000 +0100
***************
*** 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
  
*** ../vim-7.3.830/src/testdir/Make_ming.mak    2013-02-13 17:34:59.000000000 
+0100
--- src/testdir/Make_ming.mak   2013-02-20 20:21:19.000000000 +0100
***************
*** 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
  
*** ../vim-7.3.830/src/testdir/Make_os2.mak     2013-02-13 17:34:59.000000000 
+0100
--- src/testdir/Make_os2.mak    2013-02-20 20:21:25.000000000 +0100
***************
*** 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
  
*** ../vim-7.3.830/src/testdir/Make_vms.mms     2013-02-13 17:34:59.000000000 
+0100
--- src/testdir/Make_vms.mms    2013-02-20 20:21:31.000000000 +0100
***************
*** 4,10 ****
  # Authors:    Zoltan Arpadffy, <[email protected]>
  #             Sandor Kopanyi,  <[email protected]>
  #
! # 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, <[email protected]>
  #             Sandor Kopanyi,  <[email protected]>
  #
! # 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
*** ../vim-7.3.830/src/testdir/Makefile 2013-02-13 17:34:59.000000000 +0100
--- src/testdir/Makefile        2013-02-20 20:21:47.000000000 +0100
***************
*** 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
  
*** ../vim-7.3.830/src/version.c        2013-02-20 19:26:24.000000000 +0100
--- src/version.c       2013-02-20 21:08:40.000000000 +0100
***************
*** 730,731 ****
--- 730,733 ----
  {   /* Add new patch number below this line */
+ /**/
+     831,
  /**/

-- 
            |

Ceci n'est pas une pipe.

 /// Bram Moolenaar -- [email protected] -- 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    ///

-- 
-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

--- 
You received this message because you are subscribed to the Google Groups 
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/groups/opt_out.


Raspunde prin e-mail lui