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


*** ../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, <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
*** ../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 -- 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    ///
