Karsten Hopp 7b074b
To: vim_dev@googlegroups.com
Karsten Hopp 7b074b
Subject: Patch 7.4.753
Karsten Hopp 7b074b
Fcc: outbox
Karsten Hopp 7b074b
From: Bram Moolenaar <Bram@moolenaar.net>
Karsten Hopp 7b074b
Mime-Version: 1.0
Karsten Hopp 7b074b
Content-Type: text/plain; charset=UTF-8
Karsten Hopp 7b074b
Content-Transfer-Encoding: 8bit
Karsten Hopp 7b074b
------------
Karsten Hopp 7b074b
Karsten Hopp 7b074b
Patch 7.4.753
Karsten Hopp 7b074b
Problem:    Appending in Visual mode with 'linebreak' set does not work
Karsten Hopp 7b074b
            properly.  Also when 'selection' is "exclusive". (Ingo Karkat)
Karsten Hopp 7b074b
Solution:   Recalculate virtual columns. (Christian Brabandt)
Karsten Hopp 7b074b
Files:      src/normal.c, src/testdir/test_listlbr.in,
Karsten Hopp 7b074b
            src/testdir/test_listlbr.ok, src/testdir/test_listlbr_utf8.in,
Karsten Hopp 7b074b
            src/testdir/test_listlbr_utf8.ok
Karsten Hopp 7b074b
Karsten Hopp 7b074b
Karsten Hopp 7b074b
*** ../vim-7.4.752/src/normal.c	2015-06-10 12:16:41.926648740 +0200
Karsten Hopp 7b074b
--- src/normal.c	2015-06-25 12:47:07.989550746 +0200
Karsten Hopp 7b074b
***************
Karsten Hopp 7b074b
*** 174,179 ****
Karsten Hopp 7b074b
--- 174,180 ----
Karsten Hopp 7b074b
  #ifdef FEAT_AUTOCMD
Karsten Hopp 7b074b
  static void	nv_cursorhold __ARGS((cmdarg_T *cap));
Karsten Hopp 7b074b
  #endif
Karsten Hopp 7b074b
+ static void	get_op_vcol __ARGS((oparg_T *oap, colnr_T col, int initial));
Karsten Hopp 7b074b
  
Karsten Hopp 7b074b
  static char *e_noident = N_("E349: No identifier under cursor");
Karsten Hopp 7b074b
  
Karsten Hopp 7b074b
***************
Karsten Hopp 7b074b
*** 1418,1423 ****
Karsten Hopp 7b074b
--- 1419,1426 ----
Karsten Hopp 7b074b
      {
Karsten Hopp 7b074b
  #ifdef FEAT_LINEBREAK
Karsten Hopp 7b074b
  	/* Avoid a problem with unwanted linebreaks in block mode. */
Karsten Hopp 7b074b
+ 	if (curwin->w_p_lbr)
Karsten Hopp 7b074b
+ 	    curwin->w_valid &= ~VALID_VIRTCOL;
Karsten Hopp 7b074b
  	curwin->w_p_lbr = FALSE;
Karsten Hopp 7b074b
  #endif
Karsten Hopp 7b074b
  	oap->is_VIsual = VIsual_active;
Karsten Hopp 7b074b
***************
Karsten Hopp 7b074b
*** 1631,1691 ****
Karsten Hopp 7b074b
  
Karsten Hopp 7b074b
  	if (VIsual_active || redo_VIsual_busy)
Karsten Hopp 7b074b
  	{
Karsten Hopp 7b074b
! 	    if (VIsual_mode == Ctrl_V)	/* block mode */
Karsten Hopp 7b074b
! 	    {
Karsten Hopp 7b074b
! 		colnr_T	    start, end;
Karsten Hopp 7b074b
! 
Karsten Hopp 7b074b
! 		oap->block_mode = TRUE;
Karsten Hopp 7b074b
! 
Karsten Hopp 7b074b
! 		getvvcol(curwin, &(oap->start),
Karsten Hopp 7b074b
! 				      &oap->start_vcol, NULL, &oap->end_vcol);
Karsten Hopp 7b074b
! 		if (!redo_VIsual_busy)
Karsten Hopp 7b074b
! 		{
Karsten Hopp 7b074b
! 		    getvvcol(curwin, &(oap->end), &start, NULL, &end;;
Karsten Hopp 7b074b
! 
Karsten Hopp 7b074b
! 		    if (start < oap->start_vcol)
Karsten Hopp 7b074b
! 			oap->start_vcol = start;
Karsten Hopp 7b074b
! 		    if (end > oap->end_vcol)
Karsten Hopp 7b074b
! 		    {
Karsten Hopp 7b074b
! 			if (*p_sel == 'e' && start >= 1
Karsten Hopp 7b074b
! 						&& start - 1 >= oap->end_vcol)
Karsten Hopp 7b074b
! 			    oap->end_vcol = start - 1;
Karsten Hopp 7b074b
! 			else
Karsten Hopp 7b074b
! 			    oap->end_vcol = end;
Karsten Hopp 7b074b
! 		    }
Karsten Hopp 7b074b
! 		}
Karsten Hopp 7b074b
! 
Karsten Hopp 7b074b
! 		/* if '$' was used, get oap->end_vcol from longest line */
Karsten Hopp 7b074b
! 		if (curwin->w_curswant == MAXCOL)
Karsten Hopp 7b074b
! 		{
Karsten Hopp 7b074b
! 		    curwin->w_cursor.col = MAXCOL;
Karsten Hopp 7b074b
! 		    oap->end_vcol = 0;
Karsten Hopp 7b074b
! 		    for (curwin->w_cursor.lnum = oap->start.lnum;
Karsten Hopp 7b074b
! 			    curwin->w_cursor.lnum <= oap->end.lnum;
Karsten Hopp 7b074b
! 						      ++curwin->w_cursor.lnum)
Karsten Hopp 7b074b
! 		    {
Karsten Hopp 7b074b
! 			getvvcol(curwin, &curwin->w_cursor, NULL, NULL, &end;;
Karsten Hopp 7b074b
! 			if (end > oap->end_vcol)
Karsten Hopp 7b074b
! 			    oap->end_vcol = end;
Karsten Hopp 7b074b
! 		    }
Karsten Hopp 7b074b
! 		}
Karsten Hopp 7b074b
! 		else if (redo_VIsual_busy)
Karsten Hopp 7b074b
! 		    oap->end_vcol = oap->start_vcol + redo_VIsual_vcol - 1;
Karsten Hopp 7b074b
! 		/*
Karsten Hopp 7b074b
! 		 * Correct oap->end.col and oap->start.col to be the
Karsten Hopp 7b074b
! 		 * upper-left and lower-right corner of the block area.
Karsten Hopp 7b074b
! 		 *
Karsten Hopp 7b074b
! 		 * (Actually, this does convert column positions into character
Karsten Hopp 7b074b
! 		 * positions)
Karsten Hopp 7b074b
! 		 */
Karsten Hopp 7b074b
! 		curwin->w_cursor.lnum = oap->end.lnum;
Karsten Hopp 7b074b
! 		coladvance(oap->end_vcol);
Karsten Hopp 7b074b
! 		oap->end = curwin->w_cursor;
Karsten Hopp 7b074b
! 
Karsten Hopp 7b074b
! 		curwin->w_cursor = oap->start;
Karsten Hopp 7b074b
! 		coladvance(oap->start_vcol);
Karsten Hopp 7b074b
! 		oap->start = curwin->w_cursor;
Karsten Hopp 7b074b
! 	    }
Karsten Hopp 7b074b
  
Karsten Hopp 7b074b
  	    if (!redo_VIsual_busy && !gui_yank)
Karsten Hopp 7b074b
  	    {
Karsten Hopp 7b074b
--- 1634,1640 ----
Karsten Hopp 7b074b
  
Karsten Hopp 7b074b
  	if (VIsual_active || redo_VIsual_busy)
Karsten Hopp 7b074b
  	{
Karsten Hopp 7b074b
! 	    get_op_vcol(oap, redo_VIsual_vcol, TRUE);
Karsten Hopp 7b074b
  
Karsten Hopp 7b074b
  	    if (!redo_VIsual_busy && !gui_yank)
Karsten Hopp 7b074b
  	    {
Karsten Hopp 7b074b
***************
Karsten Hopp 7b074b
*** 1982,1988 ****
Karsten Hopp 7b074b
  #ifdef FEAT_LINEBREAK
Karsten Hopp 7b074b
  		/* Restore linebreak, so that when the user edits it looks as
Karsten Hopp 7b074b
  		 * before. */
Karsten Hopp 7b074b
! 		curwin->w_p_lbr = lbr_saved;
Karsten Hopp 7b074b
  #endif
Karsten Hopp 7b074b
  		/* Reset finish_op now, don't want it set inside edit(). */
Karsten Hopp 7b074b
  		finish_op = FALSE;
Karsten Hopp 7b074b
--- 1931,1941 ----
Karsten Hopp 7b074b
  #ifdef FEAT_LINEBREAK
Karsten Hopp 7b074b
  		/* Restore linebreak, so that when the user edits it looks as
Karsten Hopp 7b074b
  		 * before. */
Karsten Hopp 7b074b
! 		if (curwin->w_p_lbr != lbr_saved)
Karsten Hopp 7b074b
! 		{
Karsten Hopp 7b074b
! 		    curwin->w_p_lbr = lbr_saved;
Karsten Hopp 7b074b
! 		    get_op_vcol(oap, redo_VIsual_mode, FALSE);
Karsten Hopp 7b074b
! 		}
Karsten Hopp 7b074b
  #endif
Karsten Hopp 7b074b
  		/* Reset finish_op now, don't want it set inside edit(). */
Karsten Hopp 7b074b
  		finish_op = FALSE;
Karsten Hopp 7b074b
***************
Karsten Hopp 7b074b
*** 2082,2088 ****
Karsten Hopp 7b074b
  #ifdef FEAT_LINEBREAK
Karsten Hopp 7b074b
  		/* Restore linebreak, so that when the user edits it looks as
Karsten Hopp 7b074b
  		 * before. */
Karsten Hopp 7b074b
! 		curwin->w_p_lbr = lbr_saved;
Karsten Hopp 7b074b
  #endif
Karsten Hopp 7b074b
  		op_insert(oap, cap->count1);
Karsten Hopp 7b074b
  #ifdef FEAT_LINEBREAK
Karsten Hopp 7b074b
--- 2035,2045 ----
Karsten Hopp 7b074b
  #ifdef FEAT_LINEBREAK
Karsten Hopp 7b074b
  		/* Restore linebreak, so that when the user edits it looks as
Karsten Hopp 7b074b
  		 * before. */
Karsten Hopp 7b074b
! 		if (curwin->w_p_lbr != lbr_saved)
Karsten Hopp 7b074b
! 		{
Karsten Hopp 7b074b
! 		    curwin->w_p_lbr = lbr_saved;
Karsten Hopp 7b074b
! 		    get_op_vcol(oap, redo_VIsual_mode, FALSE);
Karsten Hopp 7b074b
! 		}
Karsten Hopp 7b074b
  #endif
Karsten Hopp 7b074b
  		op_insert(oap, cap->count1);
Karsten Hopp 7b074b
  #ifdef FEAT_LINEBREAK
Karsten Hopp 7b074b
***************
Karsten Hopp 7b074b
*** 2114,2124 ****
Karsten Hopp 7b074b
  #ifdef FEAT_VISUALEXTRA
Karsten Hopp 7b074b
  	    else
Karsten Hopp 7b074b
  	    {
Karsten Hopp 7b074b
! #ifdef FEAT_LINEBREAK
Karsten Hopp 7b074b
  		/* Restore linebreak, so that when the user edits it looks as
Karsten Hopp 7b074b
  		 * before. */
Karsten Hopp 7b074b
! 		curwin->w_p_lbr = lbr_saved;
Karsten Hopp 7b074b
! #endif
Karsten Hopp 7b074b
  		op_replace(oap, cap->nchar);
Karsten Hopp 7b074b
  	    }
Karsten Hopp 7b074b
  #endif
Karsten Hopp 7b074b
--- 2071,2085 ----
Karsten Hopp 7b074b
  #ifdef FEAT_VISUALEXTRA
Karsten Hopp 7b074b
  	    else
Karsten Hopp 7b074b
  	    {
Karsten Hopp 7b074b
! # ifdef FEAT_LINEBREAK
Karsten Hopp 7b074b
  		/* Restore linebreak, so that when the user edits it looks as
Karsten Hopp 7b074b
  		 * before. */
Karsten Hopp 7b074b
! 		if (curwin->w_p_lbr != lbr_saved)
Karsten Hopp 7b074b
! 		{
Karsten Hopp 7b074b
! 		    curwin->w_p_lbr = lbr_saved;
Karsten Hopp 7b074b
! 		    get_op_vcol(oap, redo_VIsual_mode, FALSE);
Karsten Hopp 7b074b
! 		}
Karsten Hopp 7b074b
! # endif
Karsten Hopp 7b074b
  		op_replace(oap, cap->nchar);
Karsten Hopp 7b074b
  	    }
Karsten Hopp 7b074b
  #endif
Karsten Hopp 7b074b
***************
Karsten Hopp 7b074b
*** 9542,9544 ****
Karsten Hopp 7b074b
--- 9503,9572 ----
Karsten Hopp 7b074b
      cap->retval |= CA_COMMAND_BUSY;	/* don't call edit() now */
Karsten Hopp 7b074b
  }
Karsten Hopp 7b074b
  #endif
Karsten Hopp 7b074b
+ 
Karsten Hopp 7b074b
+ /*
Karsten Hopp 7b074b
+  * calculate start/end virtual columns for operating in block mode
Karsten Hopp 7b074b
+  */
Karsten Hopp 7b074b
+     static void
Karsten Hopp 7b074b
+ get_op_vcol(oap, redo_VIsual_vcol, initial)
Karsten Hopp 7b074b
+     oparg_T	*oap;
Karsten Hopp 7b074b
+     colnr_T	redo_VIsual_vcol;
Karsten Hopp 7b074b
+     int		initial;            /* when true: adjust position for 'selectmode' */
Karsten Hopp 7b074b
+ {
Karsten Hopp 7b074b
+     colnr_T	    start, end;
Karsten Hopp 7b074b
+ 
Karsten Hopp 7b074b
+     if (VIsual_mode != Ctrl_V)
Karsten Hopp 7b074b
+ 	return;
Karsten Hopp 7b074b
+ 
Karsten Hopp 7b074b
+     oap->block_mode = TRUE;
Karsten Hopp 7b074b
+ 
Karsten Hopp 7b074b
+ #ifdef FEAT_MBYTE
Karsten Hopp 7b074b
+     /* prevent from moving onto a trail byte */
Karsten Hopp 7b074b
+     if (has_mbyte)
Karsten Hopp 7b074b
+ 	mb_adjustpos(curwin->w_buffer, &oap->end);
Karsten Hopp 7b074b
+ #endif
Karsten Hopp 7b074b
+ 
Karsten Hopp 7b074b
+     getvvcol(curwin, &(oap->start), &oap->start_vcol, NULL, &oap->end_vcol);
Karsten Hopp 7b074b
+     getvvcol(curwin, &(oap->end), &start, NULL, &end;;
Karsten Hopp 7b074b
+ 
Karsten Hopp 7b074b
+     if (start < oap->start_vcol)
Karsten Hopp 7b074b
+ 	oap->start_vcol = start;
Karsten Hopp 7b074b
+     if (end > oap->end_vcol)
Karsten Hopp 7b074b
+     {
Karsten Hopp 7b074b
+ 	if (initial && *p_sel == 'e' && start >= 1
Karsten Hopp 7b074b
+ 			&& start - 1 >= oap->end_vcol)
Karsten Hopp 7b074b
+ 	    oap->end_vcol = start - 1;
Karsten Hopp 7b074b
+ 	else
Karsten Hopp 7b074b
+ 	    oap->end_vcol = end;
Karsten Hopp 7b074b
+     }
Karsten Hopp 7b074b
+     /* if '$' was used, get oap->end_vcol from longest line */
Karsten Hopp 7b074b
+     if (curwin->w_curswant == MAXCOL)
Karsten Hopp 7b074b
+     {
Karsten Hopp 7b074b
+ 	curwin->w_cursor.col = MAXCOL;
Karsten Hopp 7b074b
+ 	oap->end_vcol = 0;
Karsten Hopp 7b074b
+ 	for (curwin->w_cursor.lnum = oap->start.lnum;
Karsten Hopp 7b074b
+ 		curwin->w_cursor.lnum <= oap->end.lnum;
Karsten Hopp 7b074b
+ 					++curwin->w_cursor.lnum)
Karsten Hopp 7b074b
+ 	{
Karsten Hopp 7b074b
+ 	    getvvcol(curwin, &curwin->w_cursor, NULL, NULL, &end;;
Karsten Hopp 7b074b
+ 	    if (end > oap->end_vcol)
Karsten Hopp 7b074b
+ 		oap->end_vcol = end;
Karsten Hopp 7b074b
+ 	}
Karsten Hopp 7b074b
+     }
Karsten Hopp 7b074b
+     else if (redo_VIsual_busy)
Karsten Hopp 7b074b
+ 	oap->end_vcol = oap->start_vcol + redo_VIsual_vcol - 1;
Karsten Hopp 7b074b
+     /*
Karsten Hopp 7b074b
+     * Correct oap->end.col and oap->start.col to be the
Karsten Hopp 7b074b
+     * upper-left and lower-right corner of the block area.
Karsten Hopp 7b074b
+     *
Karsten Hopp 7b074b
+     * (Actually, this does convert column positions into character
Karsten Hopp 7b074b
+     * positions)
Karsten Hopp 7b074b
+     */
Karsten Hopp 7b074b
+     curwin->w_cursor.lnum = oap->end.lnum;
Karsten Hopp 7b074b
+     coladvance(oap->end_vcol);
Karsten Hopp 7b074b
+     oap->end = curwin->w_cursor;
Karsten Hopp 7b074b
+ 
Karsten Hopp 7b074b
+     curwin->w_cursor = oap->start;
Karsten Hopp 7b074b
+     coladvance(oap->start_vcol);
Karsten Hopp 7b074b
+     oap->start = curwin->w_cursor;
Karsten Hopp 7b074b
+ }
Karsten Hopp 7b074b
*** ../vim-7.4.752/src/testdir/test_listlbr.in	2014-10-09 13:22:41.804886993 +0200
Karsten Hopp 7b074b
--- src/testdir/test_listlbr.in	2015-06-25 12:45:05.854814853 +0200
Karsten Hopp 7b074b
***************
Karsten Hopp 7b074b
*** 59,69 ****
Karsten Hopp 7b074b
--- 59,79 ----
Karsten Hopp 7b074b
  :set cpo&vim linebreak
Karsten Hopp 7b074b
  :let g:test ="Test 6: set linebreak with visual block mode"
Karsten Hopp 7b074b
  :let line="REMOVE: this not"
Karsten Hopp 7b074b
+ :$put =g:test
Karsten Hopp 7b074b
  :$put =line
Karsten Hopp 7b074b
  :let line="REMOVE: aaaaaaaaaaaaa"
Karsten Hopp 7b074b
  :$put =line
Karsten Hopp 7b074b
  :1/^REMOVE:
Karsten Hopp 7b074b
  0?jf x:$put
Karsten Hopp 7b074b
+ :set cpo&vim linebreak
Karsten Hopp 7b074b
+ :let g:test ="Test 7: set linebreak with visual block mode and v_b_A"
Karsten Hopp 7b074b
+ :$put =g:test
Karsten Hopp 7b074b
+ Golong line: ?40afoobar ?aTARGET at end?
Karsten Hopp 7b074b
+ :exe "norm! $3B\<C-v>eAx\<Esc>"
Karsten Hopp 7b074b
+ :set cpo&vim linebreak sbr=
Karsten Hopp 7b074b
+ :let g:test ="Test 8: set linebreak with visual char mode and changing block"
Karsten Hopp 7b074b
+ :$put =g:test
Karsten Hopp 7b074b
+ Go1111-1111-1111-11-1111-1111-1111?0f-lv3lc2222?bgj.
Karsten Hopp 7b074b
  :%w! test.out
Karsten Hopp 7b074b
  :qa!
Karsten Hopp 7b074b
  ENDTEST
Karsten Hopp 7b074b
*** ../vim-7.4.752/src/testdir/test_listlbr.ok	2014-10-09 13:22:41.808886993 +0200
Karsten Hopp 7b074b
--- src/testdir/test_listlbr.ok	2015-06-25 12:45:05.854814853 +0200
Karsten Hopp 7b074b
***************
Karsten Hopp 7b074b
*** 32,38 ****
Karsten Hopp 7b074b
--- 32,43 ----
Karsten Hopp 7b074b
  ~                   
Karsten Hopp 7b074b
  ~                   
Karsten Hopp 7b074b
  ~                   
Karsten Hopp 7b074b
+ Test 6: set linebreak with visual block mode
Karsten Hopp 7b074b
  this not
Karsten Hopp 7b074b
  aaaaaaaaaaaaa
Karsten Hopp 7b074b
  REMOVE: 
Karsten Hopp 7b074b
  REMOVE: 
Karsten Hopp 7b074b
+ Test 7: set linebreak with visual block mode and v_b_A
Karsten Hopp 7b074b
+ long line: foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar TARGETx at end
Karsten Hopp 7b074b
+ Test 8: set linebreak with visual char mode and changing block
Karsten Hopp 7b074b
+ 1111-2222-1111-11-1111-2222-1111
Karsten Hopp 7b074b
*** ../vim-7.4.752/src/testdir/test_listlbr_utf8.in	2015-02-17 17:26:04.561123749 +0100
Karsten Hopp 7b074b
--- src/testdir/test_listlbr_utf8.in	2015-06-25 13:28:00.739775396 +0200
Karsten Hopp 7b074b
***************
Karsten Hopp 7b074b
*** 91,96 ****
Karsten Hopp 7b074b
--- 91,101 ----
Karsten Hopp 7b074b
  :else
Karsten Hopp 7b074b
  :   call append('$', "Not all attributes are different")
Karsten Hopp 7b074b
  :endif
Karsten Hopp 7b074b
+ :set cpo&vim linebreak selection=exclusive
Karsten Hopp 7b074b
+ :let g:test ="Test 8: set linebreak with visual block mode and v_b_A and selection=exclusive and multibyte char"
Karsten Hopp 7b074b
+ :$put =g:test
Karsten Hopp 7b074b
+ Golong line: ?40afoobar ?aTARGETÃ' at end?
Karsten Hopp 7b074b
+ :exe "norm! $3B\<C-v>eAx\<Esc>"
Karsten Hopp 7b074b
  :%w! test.out
Karsten Hopp 7b074b
  :qa!
Karsten Hopp 7b074b
  ENDTEST
Karsten Hopp 7b074b
*** ../vim-7.4.752/src/testdir/test_listlbr_utf8.ok	2015-02-17 17:26:04.561123749 +0100
Karsten Hopp 7b074b
--- src/testdir/test_listlbr_utf8.ok	2015-06-25 13:28:20.459568969 +0200
Karsten Hopp 7b074b
***************
Karsten Hopp 7b074b
*** 44,46 ****
Karsten Hopp 7b074b
--- 44,48 ----
Karsten Hopp 7b074b
   /*		 and some more */
Karsten Hopp 7b074b
  ScreenAttributes for test6:
Karsten Hopp 7b074b
  Attribut 0 and 1 and 3 and 5 are different!
Karsten Hopp 7b074b
+ Test 8: set linebreak with visual block mode and v_b_A and selection=exclusive and multibyte char
Karsten Hopp 7b074b
+ long line: foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar foobar TARGETÃx' at end
Karsten Hopp 7b074b
*** ../vim-7.4.752/src/version.c	2015-06-21 14:21:54.477599972 +0200
Karsten Hopp 7b074b
--- src/version.c	2015-06-25 12:44:49.274986455 +0200
Karsten Hopp 7b074b
***************
Karsten Hopp 7b074b
*** 743,744 ****
Karsten Hopp 7b074b
--- 743,746 ----
Karsten Hopp 7b074b
  {   /* Add new patch number below this line */
Karsten Hopp 7b074b
+ /**/
Karsten Hopp 7b074b
+     753,
Karsten Hopp 7b074b
  /**/
Karsten Hopp 7b074b
Karsten Hopp 7b074b
-- 
Karsten Hopp 7b074b
Drink wet cement and get really stoned.
Karsten Hopp 7b074b
Karsten Hopp 7b074b
 /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net   \\\
Karsten Hopp 7b074b
///        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
Karsten Hopp 7b074b
\\\  an exciting new programming language -- http://www.Zimbu.org        ///
Karsten Hopp 7b074b
 \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///