Karsten Hopp a496d9
To: vim_dev@googlegroups.com
Karsten Hopp a496d9
Subject: Patch 7.4.082
Karsten Hopp a496d9
Fcc: outbox
Karsten Hopp a496d9
From: Bram Moolenaar <Bram@moolenaar.net>
Karsten Hopp a496d9
Mime-Version: 1.0
Karsten Hopp a496d9
Content-Type: text/plain; charset=UTF-8
Karsten Hopp a496d9
Content-Transfer-Encoding: 8bit
Karsten Hopp a496d9
------------
Karsten Hopp a496d9
Karsten Hopp a496d9
Patch 7.4.082
Karsten Hopp a496d9
Problem:    Using "gf" in a changed buffer suggests adding "!", which is not
Karsten Hopp a496d9
            possible. (Tim Chase)
Karsten Hopp a496d9
Solution:   Pass a flag to check_changed() wether adding ! make sense.
Karsten Hopp a496d9
Files:      src/vim.h, src/ex_cmds2.c, src/proto/ex_cmds2.pro, src/globals.h,
Karsten Hopp a496d9
            src/ex_cmds.c, src/ex_docmd.c
Karsten Hopp a496d9
Karsten Hopp a496d9
Karsten Hopp a496d9
*** ../vim-7.4.081/src/vim.h	2013-11-08 04:30:06.000000000 +0100
Karsten Hopp a496d9
--- src/vim.h	2013-11-09 03:00:00.000000000 +0100
Karsten Hopp a496d9
***************
Karsten Hopp a496d9
*** 1176,1181 ****
Karsten Hopp a496d9
--- 1176,1190 ----
Karsten Hopp a496d9
  #define RESIZE_BOTH	15	/* resize in both directions */
Karsten Hopp a496d9
  
Karsten Hopp a496d9
  /*
Karsten Hopp a496d9
+  * flags for check_changed()
Karsten Hopp a496d9
+  */
Karsten Hopp a496d9
+ #define CCGD_AW		1	/* do autowrite if buffer was changed */
Karsten Hopp a496d9
+ #define CCGD_MULTWIN	2	/* check also when several wins for the buf */
Karsten Hopp a496d9
+ #define CCGD_FORCEIT	4	/* ! used */
Karsten Hopp a496d9
+ #define CCGD_ALLBUF	8	/* may write all buffers */
Karsten Hopp a496d9
+ #define CCGD_EXCMD	16	/* may suggest using ! */
Karsten Hopp a496d9
+ 
Karsten Hopp a496d9
+ /*
Karsten Hopp a496d9
   * "flags" values for option-setting functions.
Karsten Hopp a496d9
   * When OPT_GLOBAL and OPT_LOCAL are both missing, set both local and global
Karsten Hopp a496d9
   * values, get local value.
Karsten Hopp a496d9
*** ../vim-7.4.081/src/ex_cmds2.c	2013-06-28 20:14:53.000000000 +0200
Karsten Hopp a496d9
--- src/ex_cmds2.c	2013-11-09 03:14:44.000000000 +0100
Karsten Hopp a496d9
***************
Karsten Hopp a496d9
*** 1436,1455 ****
Karsten Hopp a496d9
  }
Karsten Hopp a496d9
  
Karsten Hopp a496d9
  /*
Karsten Hopp a496d9
!  * return TRUE if buffer was changed and cannot be abandoned.
Karsten Hopp a496d9
   */
Karsten Hopp a496d9
      int
Karsten Hopp a496d9
! check_changed(buf, checkaw, mult_win, forceit, allbuf)
Karsten Hopp a496d9
      buf_T	*buf;
Karsten Hopp a496d9
!     int		checkaw;	/* do autowrite if buffer was changed */
Karsten Hopp a496d9
!     int		mult_win;	/* check also when several wins for the buf */
Karsten Hopp a496d9
!     int		forceit;
Karsten Hopp a496d9
!     int		allbuf UNUSED;	/* may write all buffers */
Karsten Hopp a496d9
  {
Karsten Hopp a496d9
      if (       !forceit
Karsten Hopp a496d9
  	    && bufIsChanged(buf)
Karsten Hopp a496d9
! 	    && (mult_win || buf->b_nwindows <= 1)
Karsten Hopp a496d9
! 	    && (!checkaw || autowrite(buf, forceit) == FAIL))
Karsten Hopp a496d9
      {
Karsten Hopp a496d9
  #if defined(FEAT_GUI_DIALOG) || defined(FEAT_CON_DIALOG)
Karsten Hopp a496d9
  	if ((p_confirm || cmdmod.confirm) && p_write)
Karsten Hopp a496d9
--- 1436,1455 ----
Karsten Hopp a496d9
  }
Karsten Hopp a496d9
  
Karsten Hopp a496d9
  /*
Karsten Hopp a496d9
!  * Return TRUE if buffer was changed and cannot be abandoned.
Karsten Hopp a496d9
!  * For flags use the CCGD_ values.
Karsten Hopp a496d9
   */
Karsten Hopp a496d9
      int
Karsten Hopp a496d9
! check_changed(buf, flags)
Karsten Hopp a496d9
      buf_T	*buf;
Karsten Hopp a496d9
!     int		flags;
Karsten Hopp a496d9
  {
Karsten Hopp a496d9
+     int forceit = (flags & CCGD_FORCEIT);
Karsten Hopp a496d9
+ 
Karsten Hopp a496d9
      if (       !forceit
Karsten Hopp a496d9
  	    && bufIsChanged(buf)
Karsten Hopp a496d9
! 	    && ((flags & CCGD_MULTWIN) || buf->b_nwindows <= 1)
Karsten Hopp a496d9
! 	    && (!(flags & CCGD_AW) || autowrite(buf, forceit) == FAIL))
Karsten Hopp a496d9
      {
Karsten Hopp a496d9
  #if defined(FEAT_GUI_DIALOG) || defined(FEAT_CON_DIALOG)
Karsten Hopp a496d9
  	if ((p_confirm || cmdmod.confirm) && p_write)
Karsten Hopp a496d9
***************
Karsten Hopp a496d9
*** 1457,1463 ****
Karsten Hopp a496d9
  	    buf_T	*buf2;
Karsten Hopp a496d9
  	    int		count = 0;
Karsten Hopp a496d9
  
Karsten Hopp a496d9
! 	    if (allbuf)
Karsten Hopp a496d9
  		for (buf2 = firstbuf; buf2 != NULL; buf2 = buf2->b_next)
Karsten Hopp a496d9
  		    if (bufIsChanged(buf2)
Karsten Hopp a496d9
  				     && (buf2->b_ffname != NULL
Karsten Hopp a496d9
--- 1457,1463 ----
Karsten Hopp a496d9
  	    buf_T	*buf2;
Karsten Hopp a496d9
  	    int		count = 0;
Karsten Hopp a496d9
  
Karsten Hopp a496d9
! 	    if (flags & CCGD_ALLBUF)
Karsten Hopp a496d9
  		for (buf2 = firstbuf; buf2 != NULL; buf2 = buf2->b_next)
Karsten Hopp a496d9
  		    if (bufIsChanged(buf2)
Karsten Hopp a496d9
  				     && (buf2->b_ffname != NULL
Karsten Hopp a496d9
***************
Karsten Hopp a496d9
*** 1480,1486 ****
Karsten Hopp a496d9
  	    return bufIsChanged(buf);
Karsten Hopp a496d9
  	}
Karsten Hopp a496d9
  #endif
Karsten Hopp a496d9
! 	EMSG(_(e_nowrtmsg));
Karsten Hopp a496d9
  	return TRUE;
Karsten Hopp a496d9
      }
Karsten Hopp a496d9
      return FALSE;
Karsten Hopp a496d9
--- 1480,1489 ----
Karsten Hopp a496d9
  	    return bufIsChanged(buf);
Karsten Hopp a496d9
  	}
Karsten Hopp a496d9
  #endif
Karsten Hopp a496d9
! 	if (flags & CCGD_EXCMD)
Karsten Hopp a496d9
! 	    EMSG(_(e_nowrtmsg));
Karsten Hopp a496d9
! 	else
Karsten Hopp a496d9
! 	    EMSG(_(e_nowrtmsg_nobang));
Karsten Hopp a496d9
  	return TRUE;
Karsten Hopp a496d9
      }
Karsten Hopp a496d9
      return FALSE;
Karsten Hopp a496d9
***************
Karsten Hopp a496d9
*** 1690,1696 ****
Karsten Hopp a496d9
  	{
Karsten Hopp a496d9
  	    /* Try auto-writing the buffer.  If this fails but the buffer no
Karsten Hopp a496d9
  	    * longer exists it's not changed, that's OK. */
Karsten Hopp a496d9
! 	    if (check_changed(buf, p_awa, TRUE, FALSE, TRUE) && buf_valid(buf))
Karsten Hopp a496d9
  		break;	    /* didn't save - still changes */
Karsten Hopp a496d9
  	}
Karsten Hopp a496d9
      }
Karsten Hopp a496d9
--- 1693,1701 ----
Karsten Hopp a496d9
  	{
Karsten Hopp a496d9
  	    /* Try auto-writing the buffer.  If this fails but the buffer no
Karsten Hopp a496d9
  	    * longer exists it's not changed, that's OK. */
Karsten Hopp a496d9
! 	    if (check_changed(buf, (p_awa ? CCGD_AW : 0)
Karsten Hopp a496d9
! 				 | CCGD_MULTWIN
Karsten Hopp a496d9
! 				 | CCGD_ALLBUF) && buf_valid(buf))
Karsten Hopp a496d9
  		break;	    /* didn't save - still changes */
Karsten Hopp a496d9
  	}
Karsten Hopp a496d9
      }
Karsten Hopp a496d9
***************
Karsten Hopp a496d9
*** 2274,2280 ****
Karsten Hopp a496d9
  		vim_free(p);
Karsten Hopp a496d9
  	    }
Karsten Hopp a496d9
  	    if ((!P_HID(curbuf) || !other)
Karsten Hopp a496d9
! 		  && check_changed(curbuf, TRUE, !other, eap->forceit, FALSE))
Karsten Hopp a496d9
  		return;
Karsten Hopp a496d9
  	}
Karsten Hopp a496d9
  
Karsten Hopp a496d9
--- 2279,2288 ----
Karsten Hopp a496d9
  		vim_free(p);
Karsten Hopp a496d9
  	    }
Karsten Hopp a496d9
  	    if ((!P_HID(curbuf) || !other)
Karsten Hopp a496d9
! 		  && check_changed(curbuf, CCGD_AW
Karsten Hopp a496d9
! 					 | (other ? 0 : CCGD_MULTWIN)
Karsten Hopp a496d9
! 					 | (eap->forceit ? CCGD_FORCEIT : 0)
Karsten Hopp a496d9
! 					 | CCGD_EXCMD))
Karsten Hopp a496d9
  		return;
Karsten Hopp a496d9
  	}
Karsten Hopp a496d9
  
Karsten Hopp a496d9
***************
Karsten Hopp a496d9
*** 2315,2321 ****
Karsten Hopp a496d9
       */
Karsten Hopp a496d9
      if (       P_HID(curbuf)
Karsten Hopp a496d9
  	    || eap->cmdidx == CMD_snext
Karsten Hopp a496d9
! 	    || !check_changed(curbuf, TRUE, FALSE, eap->forceit, FALSE))
Karsten Hopp a496d9
      {
Karsten Hopp a496d9
  	if (*eap->arg != NUL)		    /* redefine file list */
Karsten Hopp a496d9
  	{
Karsten Hopp a496d9
--- 2323,2331 ----
Karsten Hopp a496d9
       */
Karsten Hopp a496d9
      if (       P_HID(curbuf)
Karsten Hopp a496d9
  	    || eap->cmdidx == CMD_snext
Karsten Hopp a496d9
! 	    || !check_changed(curbuf, CCGD_AW
Karsten Hopp a496d9
! 				    | (eap->forceit ? CCGD_FORCEIT : 0)
Karsten Hopp a496d9
! 				    | CCGD_EXCMD))
Karsten Hopp a496d9
      {
Karsten Hopp a496d9
  	if (*eap->arg != NUL)		    /* redefine file list */
Karsten Hopp a496d9
  	{
Karsten Hopp a496d9
***************
Karsten Hopp a496d9
*** 2458,2464 ****
Karsten Hopp a496d9
      if (eap->cmdidx == CMD_windo
Karsten Hopp a496d9
  	    || eap->cmdidx == CMD_tabdo
Karsten Hopp a496d9
  	    || P_HID(curbuf)
Karsten Hopp a496d9
! 	    || !check_changed(curbuf, TRUE, FALSE, eap->forceit, FALSE))
Karsten Hopp a496d9
      {
Karsten Hopp a496d9
  	/* start at the first argument/window/buffer */
Karsten Hopp a496d9
  	i = 0;
Karsten Hopp a496d9
--- 2468,2476 ----
Karsten Hopp a496d9
      if (eap->cmdidx == CMD_windo
Karsten Hopp a496d9
  	    || eap->cmdidx == CMD_tabdo
Karsten Hopp a496d9
  	    || P_HID(curbuf)
Karsten Hopp a496d9
! 	    || !check_changed(curbuf, CCGD_AW
Karsten Hopp a496d9
! 				    | (eap->forceit ? CCGD_FORCEIT : 0)
Karsten Hopp a496d9
! 				    | CCGD_EXCMD))
Karsten Hopp a496d9
      {
Karsten Hopp a496d9
  	/* start at the first argument/window/buffer */
Karsten Hopp a496d9
  	i = 0;
Karsten Hopp a496d9
*** ../vim-7.4.081/src/proto/ex_cmds2.pro	2013-08-10 13:37:10.000000000 +0200
Karsten Hopp a496d9
--- src/proto/ex_cmds2.pro	2013-11-09 03:18:02.000000000 +0100
Karsten Hopp a496d9
***************
Karsten Hopp a496d9
*** 35,41 ****
Karsten Hopp a496d9
  int prof_def_func __ARGS((void));
Karsten Hopp a496d9
  int autowrite __ARGS((buf_T *buf, int forceit));
Karsten Hopp a496d9
  void autowrite_all __ARGS((void));
Karsten Hopp a496d9
! int check_changed __ARGS((buf_T *buf, int checkaw, int mult_win, int forceit, int allbuf));
Karsten Hopp a496d9
  void browse_save_fname __ARGS((buf_T *buf));
Karsten Hopp a496d9
  void dialog_changed __ARGS((buf_T *buf, int checkall));
Karsten Hopp a496d9
  int can_abandon __ARGS((buf_T *buf, int forceit));
Karsten Hopp a496d9
--- 35,41 ----
Karsten Hopp a496d9
  int prof_def_func __ARGS((void));
Karsten Hopp a496d9
  int autowrite __ARGS((buf_T *buf, int forceit));
Karsten Hopp a496d9
  void autowrite_all __ARGS((void));
Karsten Hopp a496d9
! int check_changed __ARGS((buf_T *buf, int flags));
Karsten Hopp a496d9
  void browse_save_fname __ARGS((buf_T *buf));
Karsten Hopp a496d9
  void dialog_changed __ARGS((buf_T *buf, int checkall));
Karsten Hopp a496d9
  int can_abandon __ARGS((buf_T *buf, int forceit));
Karsten Hopp a496d9
*** ../vim-7.4.081/src/globals.h	2013-07-04 19:53:44.000000000 +0200
Karsten Hopp a496d9
--- src/globals.h	2013-11-09 03:05:54.000000000 +0100
Karsten Hopp a496d9
***************
Karsten Hopp a496d9
*** 1490,1495 ****
Karsten Hopp a496d9
--- 1490,1496 ----
Karsten Hopp a496d9
  EXTERN char_u e_notopen[]	INIT(= N_("E484: Can't open file %s"));
Karsten Hopp a496d9
  EXTERN char_u e_notread[]	INIT(= N_("E485: Can't read file %s"));
Karsten Hopp a496d9
  EXTERN char_u e_nowrtmsg[]	INIT(= N_("E37: No write since last change (add ! to override)"));
Karsten Hopp a496d9
+ EXTERN char_u e_nowrtmsg_nobang[]   INIT(= N_("E37: No write since last change"));
Karsten Hopp a496d9
  EXTERN char_u e_null[]		INIT(= N_("E38: Null argument"));
Karsten Hopp a496d9
  #ifdef FEAT_DIGRAPHS
Karsten Hopp a496d9
  EXTERN char_u e_number_exp[]	INIT(= N_("E39: Number expected"));
Karsten Hopp a496d9
*** ../vim-7.4.081/src/ex_cmds.c	2013-10-02 18:43:00.000000000 +0200
Karsten Hopp a496d9
--- src/ex_cmds.c	2013-11-09 03:19:25.000000000 +0100
Karsten Hopp a496d9
***************
Karsten Hopp a496d9
*** 3253,3260 ****
Karsten Hopp a496d9
      if (  ((!other_file && !(flags & ECMD_OLDBUF))
Karsten Hopp a496d9
  	    || (curbuf->b_nwindows == 1
Karsten Hopp a496d9
  		&& !(flags & (ECMD_HIDE | ECMD_ADDBUF))))
Karsten Hopp a496d9
! 	&& check_changed(curbuf, p_awa, !other_file,
Karsten Hopp a496d9
! 					(flags & ECMD_FORCEIT), FALSE))
Karsten Hopp a496d9
      {
Karsten Hopp a496d9
  	if (fnum == 0 && other_file && ffname != NULL)
Karsten Hopp a496d9
  	    (void)setaltfname(ffname, sfname, newlnum < 0 ? 0 : newlnum);
Karsten Hopp a496d9
--- 3253,3262 ----
Karsten Hopp a496d9
      if (  ((!other_file && !(flags & ECMD_OLDBUF))
Karsten Hopp a496d9
  	    || (curbuf->b_nwindows == 1
Karsten Hopp a496d9
  		&& !(flags & (ECMD_HIDE | ECMD_ADDBUF))))
Karsten Hopp a496d9
! 	&& check_changed(curbuf, (p_awa ? CCGD_AW : 0)
Karsten Hopp a496d9
! 			       | (other_file ? 0 : CCGD_MULTWIN)
Karsten Hopp a496d9
! 			       | ((flags & ECMD_FORCEIT) ? CCGD_FORCEIT : 0)
Karsten Hopp a496d9
! 			       | (eap == NULL ? 0 : CCGD_EXCMD)))
Karsten Hopp a496d9
      {
Karsten Hopp a496d9
  	if (fnum == 0 && other_file && ffname != NULL)
Karsten Hopp a496d9
  	    (void)setaltfname(ffname, sfname, newlnum < 0 ? 0 : newlnum);
Karsten Hopp a496d9
***************
Karsten Hopp a496d9
*** 7664,7670 ****
Karsten Hopp a496d9
  # ifdef FEAT_WINDOWS
Karsten Hopp a496d9
  	    ++emsg_off;
Karsten Hopp a496d9
  # endif
Karsten Hopp a496d9
! 	    split = check_changed(curbuf, TRUE, FALSE, FALSE, FALSE);
Karsten Hopp a496d9
  # ifdef FEAT_WINDOWS
Karsten Hopp a496d9
  	    --emsg_off;
Karsten Hopp a496d9
  # else
Karsten Hopp a496d9
--- 7666,7672 ----
Karsten Hopp a496d9
  # ifdef FEAT_WINDOWS
Karsten Hopp a496d9
  	    ++emsg_off;
Karsten Hopp a496d9
  # endif
Karsten Hopp a496d9
! 	    split = check_changed(curbuf, CCGD_AW | CCGD_EXCMD);
Karsten Hopp a496d9
  # ifdef FEAT_WINDOWS
Karsten Hopp a496d9
  	    --emsg_off;
Karsten Hopp a496d9
  # else
Karsten Hopp a496d9
*** ../vim-7.4.081/src/ex_docmd.c	2013-11-08 04:30:06.000000000 +0100
Karsten Hopp a496d9
--- src/ex_docmd.c	2013-11-09 03:30:10.000000000 +0100
Karsten Hopp a496d9
***************
Karsten Hopp a496d9
*** 6565,6571 ****
Karsten Hopp a496d9
      if (check_more(FALSE, eap->forceit) == OK && only_one_window())
Karsten Hopp a496d9
  	exiting = TRUE;
Karsten Hopp a496d9
      if ((!P_HID(curbuf)
Karsten Hopp a496d9
! 		&& check_changed(curbuf, p_awa, FALSE, eap->forceit, FALSE))
Karsten Hopp a496d9
  	    || check_more(TRUE, eap->forceit) == FAIL
Karsten Hopp a496d9
  	    || (only_one_window() && check_changed_any(eap->forceit)))
Karsten Hopp a496d9
      {
Karsten Hopp a496d9
--- 6565,6573 ----
Karsten Hopp a496d9
      if (check_more(FALSE, eap->forceit) == OK && only_one_window())
Karsten Hopp a496d9
  	exiting = TRUE;
Karsten Hopp a496d9
      if ((!P_HID(curbuf)
Karsten Hopp a496d9
! 		&& check_changed(curbuf, (p_awa ? CCGD_AW : 0)
Karsten Hopp a496d9
! 				       | (eap->forceit ? CCGD_FORCEIT : 0)
Karsten Hopp a496d9
! 				       | CCGD_EXCMD))
Karsten Hopp a496d9
  	    || check_more(TRUE, eap->forceit) == FAIL
Karsten Hopp a496d9
  	    || (only_one_window() && check_changed_any(eap->forceit)))
Karsten Hopp a496d9
      {
Karsten Hopp a496d9
***************
Karsten Hopp a496d9
*** 7099,7105 ****
Karsten Hopp a496d9
      if (!P_HID(curbuf) && !split)
Karsten Hopp a496d9
      {
Karsten Hopp a496d9
  	++emsg_off;
Karsten Hopp a496d9
! 	split = check_changed(curbuf, TRUE, FALSE, FALSE, FALSE);
Karsten Hopp a496d9
  	--emsg_off;
Karsten Hopp a496d9
      }
Karsten Hopp a496d9
      if (split)
Karsten Hopp a496d9
--- 7101,7107 ----
Karsten Hopp a496d9
      if (!P_HID(curbuf) && !split)
Karsten Hopp a496d9
      {
Karsten Hopp a496d9
  	++emsg_off;
Karsten Hopp a496d9
! 	split = check_changed(curbuf, CCGD_AW);
Karsten Hopp a496d9
  	--emsg_off;
Karsten Hopp a496d9
      }
Karsten Hopp a496d9
      if (split)
Karsten Hopp a496d9
***************
Karsten Hopp a496d9
*** 7361,7367 ****
Karsten Hopp a496d9
  {
Karsten Hopp a496d9
      /* Set recoverymode right away to avoid the ATTENTION prompt. */
Karsten Hopp a496d9
      recoverymode = TRUE;
Karsten Hopp a496d9
!     if (!check_changed(curbuf, p_awa, TRUE, eap->forceit, FALSE)
Karsten Hopp a496d9
  	    && (*eap->arg == NUL
Karsten Hopp a496d9
  			     || setfname(curbuf, eap->arg, NULL, TRUE) == OK))
Karsten Hopp a496d9
  	ml_recover();
Karsten Hopp a496d9
--- 7363,7373 ----
Karsten Hopp a496d9
  {
Karsten Hopp a496d9
      /* Set recoverymode right away to avoid the ATTENTION prompt. */
Karsten Hopp a496d9
      recoverymode = TRUE;
Karsten Hopp a496d9
!     if (!check_changed(curbuf, (p_awa ? CCGD_AW : 0)
Karsten Hopp a496d9
! 			     | CCGD_MULTWIN
Karsten Hopp a496d9
! 			     | (eap->forceit ? CCGD_FORCEIT : 0)
Karsten Hopp a496d9
! 			     | CCGD_EXCMD)
Karsten Hopp a496d9
! 
Karsten Hopp a496d9
  	    && (*eap->arg == NUL
Karsten Hopp a496d9
  			     || setfname(curbuf, eap->arg, NULL, TRUE) == OK))
Karsten Hopp a496d9
  	ml_recover();
Karsten Hopp a496d9
*** ../vim-7.4.081/src/version.c	2013-11-09 02:32:15.000000000 +0100
Karsten Hopp a496d9
--- src/version.c	2013-11-09 03:26:06.000000000 +0100
Karsten Hopp a496d9
***************
Karsten Hopp a496d9
*** 740,741 ****
Karsten Hopp a496d9
--- 740,743 ----
Karsten Hopp a496d9
  {   /* Add new patch number below this line */
Karsten Hopp a496d9
+ /**/
Karsten Hopp a496d9
+     82,
Karsten Hopp a496d9
  /**/
Karsten Hopp a496d9
Karsten Hopp a496d9
-- 
Karsten Hopp a496d9
People who want to share their religious views with you
Karsten Hopp a496d9
almost never want you to share yours with them.
Karsten Hopp a496d9
Karsten Hopp a496d9
 /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net   \\\
Karsten Hopp a496d9
///        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
Karsten Hopp a496d9
\\\  an exciting new programming language -- http://www.Zimbu.org        ///
Karsten Hopp a496d9
 \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///