Blob Blame History Raw
To: vim_dev@googlegroups.com
Subject: Patch 7.3.597
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.597
Problem:    'clipboard' "autoselect" only applies to the * register. (Sergey
	    Vakulenko)
Solution:   Make 'autoselect' work for the + register. (Christian Brabant)
	    Add the "autoselectplus" option in 'clipboard' and the "P" flag in
	    'guioptions'.
Files:	    runtime/doc/options.txt, src/normal.c, src/ops.c, src/screen.c,
	    src/ui.c, src/globals.h, src/proto/ui.pro, src/option.h, src/gui.c


*** ../vim-7.3.596/runtime/doc/options.txt	2012-02-20 22:18:23.000000000 +0100
--- runtime/doc/options.txt	2012-07-10 15:40:35.000000000 +0200
***************
*** 1437,1442 ****
--- 1452,1458 ----
  	This option is a list of comma separated names.
  	These names are recognized:
  
+ 						*clipboard-unnamed*
  	unnamed		When included, Vim will use the clipboard register '*'
  			for all yank, delete, change and put operations which
  			would normally go to the unnamed register.  When a
***************
*** 1446,1460 ****
  			explicitly accessed using the "* notation.  Also see
  			|gui-clipboard|.
  
  	unnamedplus	A variant of "unnamed" flag which uses the clipboard
  			register '+' (|quoteplus|) instead of register '*' for
  			all operations except yank.  Yank shall copy the text
  			into register '+' and also into '*' when "unnamed" is
  			included.
! 			Only available with the |+x11| feature.
  			Availability can be checked with: >
  				if has('unnamedplus')
  <
  	autoselect	Works like the 'a' flag in 'guioptions': If present,
  			then whenever Visual mode is started, or the Visual
  			area extended, Vim tries to become the owner of the
--- 1462,1478 ----
  			explicitly accessed using the "* notation.  Also see
  			|gui-clipboard|.
  
+ 						*clipboard-unnamedplus*
  	unnamedplus	A variant of "unnamed" flag which uses the clipboard
  			register '+' (|quoteplus|) instead of register '*' for
  			all operations except yank.  Yank shall copy the text
  			into register '+' and also into '*' when "unnamed" is
  			included.
! 			Only available with the |+X11| feature.
  			Availability can be checked with: >
  				if has('unnamedplus')
  <
+ 						*clipboard-autoselect*
  	autoselect	Works like the 'a' flag in 'guioptions': If present,
  			then whenever Visual mode is started, or the Visual
  			area extended, Vim tries to become the owner of the
***************
*** 1466,1474 ****
--- 1484,1499 ----
  			"autoselect" flag is used.
  			Also applies to the modeless selection.
  
+ 						*clipboard-autoselectplus*
+ 	autoselectplus  Like "autoselect" but using the + register instead of
+ 			the * register.  Compare to the 'P' flag in
+ 			'guioptions'.
+ 
+ 						*clipboard-autoselectml*
  	autoselectml	Like "autoselect", but for the modeless selection
  			only.  Compare to the 'A' flag in 'guioptions'.
  
+ 						*clipboard-html*
  	html		When the clipboard contains HTML, use this when
  			pasting.  When putting text on the clipboard, mark it
  			as HTML.  This works to copy rendered HTML from
***************
*** 1479,1484 ****
--- 1504,1510 ----
  			Only supported for GTK version 2 and later.
  			Only available with the |+multi_byte| feature.
  
+ 						*clipboard-exclude*
  	exclude:{pattern}
  			Defines a pattern that is matched against the name of
  			the terminal 'term'.  If there is a match, no
***************
*** 3547,3552 ****
--- 3600,3608 ----
  		windowing system's global selection unless explicitly told to
  		by a yank or delete operation for the "* register.
  		The same applies to the modeless selection.
+ 								*'go-P'*
+ 	  'P'	Like autoselect but using the "+ register instead of the "*
+ 	  	register.
  								*'go-A'*
  	  'A'	Autoselect for the modeless selection.  Like 'a', but only
  		applies to the modeless selection.
*** ../vim-7.3.596/src/normal.c	2012-06-29 13:56:01.000000000 +0200
--- src/normal.c	2012-07-10 15:44:24.000000000 +0200
***************
*** 1451,1457 ****
       * This could call do_pending_operator() recursively, but that's OK
       * because gui_yank will be TRUE for the nested call.
       */
!     if (clip_star.available
  	    && oap->op_type != OP_NOP
  	    && !gui_yank
  # ifdef FEAT_VISUAL
--- 1451,1457 ----
       * This could call do_pending_operator() recursively, but that's OK
       * because gui_yank will be TRUE for the nested call.
       */
!     if ((clip_star.available || clip_plus.available)
  	    && oap->op_type != OP_NOP
  	    && !gui_yank
  # ifdef FEAT_VISUAL
*** ../vim-7.3.596/src/ops.c	2012-06-29 13:34:15.000000000 +0200
--- src/ops.c	2012-07-10 16:20:29.000000000 +0200
***************
*** 962,969 ****
       * selection too. */
      if (name == '*' && clip_star.available)
      {
! 	if (clip_isautosel())
! 	    clip_update_selection();
  	may_get_selection(name);
      }
  #endif
--- 962,975 ----
       * selection too. */
      if (name == '*' && clip_star.available)
      {
! 	if (clip_isautosel_star())
! 	    clip_update_selection(&clip_star);
! 	may_get_selection(name);
!     }
!     if (name == '+' && clip_plus.available)
!     {
! 	if (clip_isautosel_plus())
! 	    clip_update_selection(&clip_plus);
  	may_get_selection(name);
      }
  #endif
***************
*** 3190,3196 ****
  
  	clip_own_selection(&clip_plus);
  	clip_gen_set_selection(&clip_plus);
! 	if (!clip_isautosel() && !did_star && curr == &(y_regs[PLUS_REGISTER]))
  	{
  	    copy_yank_reg(&(y_regs[STAR_REGISTER]));
  	    clip_own_selection(&clip_star);
--- 3196,3203 ----
  
  	clip_own_selection(&clip_plus);
  	clip_gen_set_selection(&clip_plus);
! 	if (!clip_isautosel_star() && !did_star
! 					  && curr == &(y_regs[PLUS_REGISTER]))
  	{
  	    copy_yank_reg(&(y_regs[STAR_REGISTER]));
  	    clip_own_selection(&clip_star);
*** ../vim-7.3.596/src/screen.c	2012-06-13 18:06:32.000000000 +0200
--- src/screen.c	2012-07-10 16:39:01.000000000 +0200
***************
*** 519,526 ****
  # endif
  # ifdef FEAT_CLIPBOARD
  		/* When Visual area changed, may have to update selection. */
! 		if (clip_star.available && clip_isautosel())
! 		    clip_update_selection();
  # endif
  #ifdef FEAT_GUI
  		/* Remove the cursor before starting to do anything, because
--- 519,528 ----
  # endif
  # ifdef FEAT_CLIPBOARD
  		/* When Visual area changed, may have to update selection. */
! 		if (clip_star.available && clip_isautosel_star())
! 		    clip_update_selection(&clip_star);
! 		if (clip_plus.available && clip_isautosel_plus())
! 		    clip_update_selection(&clip_plus);
  # endif
  #ifdef FEAT_GUI
  		/* Remove the cursor before starting to do anything, because
***************
*** 814,821 ****
  
  #ifdef FEAT_CLIPBOARD
      /* When Visual area changed, may have to update selection. */
!     if (clip_star.available && clip_isautosel())
! 	clip_update_selection();
  #endif
  
      win_update(wp);
--- 816,825 ----
  
  #ifdef FEAT_CLIPBOARD
      /* When Visual area changed, may have to update selection. */
!     if (clip_star.available && clip_isautosel_star())
! 	clip_update_selection(&clip_star);
!     if (clip_plus.available && clip_isautosel_plus())
! 	clip_update_selection(&clip_plus);
  #endif
  
      win_update(wp);
***************
*** 3000,3006 ****
  	    area_highlighting = TRUE;
  	    attr = hl_attr(HLF_V);
  #if defined(FEAT_CLIPBOARD) && defined(FEAT_X11)
! 	    if (clip_star.available && !clip_star.owned && clip_isautosel())
  		attr = hl_attr(HLF_VNC);
  #endif
  	}
--- 3004,3013 ----
  	    area_highlighting = TRUE;
  	    attr = hl_attr(HLF_V);
  #if defined(FEAT_CLIPBOARD) && defined(FEAT_X11)
! 	    if ((clip_star.available && !clip_star.owned
! 						     && clip_isautosel_star())
! 		    || (clip_plus.available && !clip_plus.owned
! 						    && clip_isautosel_plus()))
  		attr = hl_attr(HLF_VNC);
  #endif
  	}
***************
*** 9060,9066 ****
  	    || (wp != NULL && wp->w_width != Columns)
  # endif
         )
! 	clip_clear_selection();
      else
  	clip_scroll_selection(-line_count);
  #endif
--- 9067,9073 ----
  	    || (wp != NULL && wp->w_width != Columns)
  # endif
         )
! 	clip_clear_selection(&clip_star);
      else
  	clip_scroll_selection(-line_count);
  #endif
***************
*** 9281,9287 ****
  	    || (wp != NULL && wp->w_width != Columns)
  # endif
         )
! 	clip_clear_selection();
      else
  	clip_scroll_selection(line_count);
  #endif
--- 9288,9294 ----
  	    || (wp != NULL && wp->w_width != Columns)
  # endif
         )
! 	clip_clear_selection(&clip_star);
      else
  	clip_scroll_selection(line_count);
  #endif
*** ../vim-7.3.596/src/ui.c	2012-02-12 01:35:06.000000000 +0100
--- src/ui.c	2012-07-10 16:43:17.000000000 +0200
***************
*** 381,386 ****
--- 381,388 ----
  
  #if defined(FEAT_CLIPBOARD) || defined(PROTO)
  
+ static void clip_copy_selection __ARGS((VimClipboard *clip));
+ 
  /*
   * Selection stuff using Visual mode, for cutting and pasting text to other
   * windows.
***************
*** 423,431 ****
   * this is called whenever VIsual mode is ended.
   */
      void
! clip_update_selection()
  {
!     pos_T    start, end;
  
      /* If visual mode is only due to a redo command ("."), then ignore it */
      if (!redo_VIsual_busy && VIsual_active && (State & NORMAL))
--- 425,434 ----
   * this is called whenever VIsual mode is ended.
   */
      void
! clip_update_selection(clip)
!     VimClipboard    *clip;
  {
!     pos_T	    start, end;
  
      /* If visual mode is only due to a redo command ("."), then ignore it */
      if (!redo_VIsual_busy && VIsual_active && (State & NORMAL))
***************
*** 444,460 ****
  	    start = curwin->w_cursor;
  	    end = VIsual;
  	}
! 	if (!equalpos(clip_star.start, start)
! 		|| !equalpos(clip_star.end, end)
! 		|| clip_star.vmode != VIsual_mode)
  	{
! 	    clip_clear_selection();
! 	    clip_star.start = start;
! 	    clip_star.end = end;
! 	    clip_star.vmode = VIsual_mode;
! 	    clip_free_selection(&clip_star);
! 	    clip_own_selection(&clip_star);
! 	    clip_gen_set_selection(&clip_star);
  	}
      }
  }
--- 447,463 ----
  	    start = curwin->w_cursor;
  	    end = VIsual;
  	}
! 	if (!equalpos(clip->start, start)
! 		|| !equalpos(clip->end, end)
! 		|| clip->vmode != VIsual_mode)
  	{
! 	    clip_clear_selection(clip);
! 	    clip->start = start;
! 	    clip->end = end;
! 	    clip->vmode = VIsual_mode;
! 	    clip_free_selection(clip);
! 	    clip_own_selection(clip);
! 	    clip_gen_set_selection(clip);
  	}
      }
  }
***************
*** 475,481 ****
  	int was_owned = cbd->owned;
  
  	cbd->owned = (clip_gen_own_selection(cbd) == OK);
! 	if (!was_owned && cbd == &clip_star)
  	{
  	    /* May have to show a different kind of highlighting for the
  	     * selected area.  There is no specific redraw command for this,
--- 478,484 ----
  	int was_owned = cbd->owned;
  
  	cbd->owned = (clip_gen_own_selection(cbd) == OK);
! 	if (!was_owned && (cbd == &clip_star || cbd == &clip_plus))
  	{
  	    /* May have to show a different kind of highlighting for the
  	     * selected area.  There is no specific redraw command for this,
***************
*** 483,489 ****
  	    if (cbd->owned
  		    && (get_real_state() == VISUAL
  					    || get_real_state() == SELECTMODE)
! 		    && clip_isautosel()
  		    && hl_attr(HLF_V) != hl_attr(HLF_VNC))
  		redraw_curbuf_later(INVERTED_ALL);
  	}
--- 486,493 ----
  	    if (cbd->owned
  		    && (get_real_state() == VISUAL
  					    || get_real_state() == SELECTMODE)
! 		    && (cbd == &clip_star ? clip_isautosel_star()
! 						      : clip_isautosel_plus())
  		    && hl_attr(HLF_V) != hl_attr(HLF_VNC))
  		redraw_curbuf_later(INVERTED_ALL);
  	}
***************
*** 502,513 ****
  #ifdef FEAT_X11
      int	    was_owned = cbd->owned;
  #endif
!     int     visual_selection = (cbd == &clip_star);
  
      clip_free_selection(cbd);
      cbd->owned = FALSE;
      if (visual_selection)
! 	clip_clear_selection();
      clip_gen_lose_selection(cbd);
  #ifdef FEAT_X11
      if (visual_selection)
--- 506,520 ----
  #ifdef FEAT_X11
      int	    was_owned = cbd->owned;
  #endif
!     int     visual_selection = FALSE;
! 
!     if (cbd == &clip_star || cbd == &clip_plus)
! 	visual_selection = TRUE;
  
      clip_free_selection(cbd);
      cbd->owned = FALSE;
      if (visual_selection)
! 	clip_clear_selection(cbd);
      clip_gen_lose_selection(cbd);
  #ifdef FEAT_X11
      if (visual_selection)
***************
*** 518,524 ****
  	if (was_owned
  		&& (get_real_state() == VISUAL
  					    || get_real_state() == SELECTMODE)
! 		&& clip_isautosel()
  		&& hl_attr(HLF_V) != hl_attr(HLF_VNC))
  	{
  	    update_curbuf(INVERTED_ALL);
--- 525,532 ----
  	if (was_owned
  		&& (get_real_state() == VISUAL
  					    || get_real_state() == SELECTMODE)
! 		&& (cbd == &clip_star ?
! 				clip_isautosel_star() : clip_isautosel_plus())
  		&& hl_attr(HLF_V) != hl_attr(HLF_VNC))
  	{
  	    update_curbuf(INVERTED_ALL);
***************
*** 534,551 ****
  #endif
  }
  
!     void
! clip_copy_selection()
! {
!     if (VIsual_active && (State & NORMAL) && clip_star.available)
!     {
! 	if (clip_isautosel())
! 	    clip_update_selection();
! 	clip_free_selection(&clip_star);
! 	clip_own_selection(&clip_star);
! 	if (clip_star.owned)
! 	    clip_get_selection(&clip_star);
! 	clip_gen_set_selection(&clip_star);
      }
  }
  
--- 542,559 ----
  #endif
  }
  
!     static void
! clip_copy_selection(clip)
!     VimClipboard	*clip;
! {
!     if (VIsual_active && (State & NORMAL) && clip->available)
!     {
! 	clip_update_selection(clip);
! 	clip_free_selection(clip);
! 	clip_own_selection(clip);
! 	if (clip->owned)
! 	    clip_get_selection(clip);
! 	clip_gen_set_selection(clip);
      }
  }
  
***************
*** 555,575 ****
      void
  clip_auto_select()
  {
!     if (clip_isautosel())
! 	clip_copy_selection();
  }
  
  /*
!  * Return TRUE if automatic selection of Visual area is desired.
   */
      int
! clip_isautosel()
  {
      return (
  #ifdef FEAT_GUI
  	    gui.in_use ? (vim_strchr(p_go, GO_ASEL) != NULL) :
  #endif
! 	    clip_autoselect);
  }
  
  
--- 563,600 ----
      void
  clip_auto_select()
  {
!     if (clip_isautosel_star())
! 	clip_copy_selection(&clip_star);
!     if (clip_isautosel_plus())
! 	clip_copy_selection(&clip_plus);
  }
  
  /*
!  * Return TRUE if automatic selection of Visual area is desired for the *
!  * register.
   */
      int
! clip_isautosel_star()
  {
      return (
  #ifdef FEAT_GUI
  	    gui.in_use ? (vim_strchr(p_go, GO_ASEL) != NULL) :
  #endif
! 	    clip_autoselect_star);
! }
! 
! /*
!  * Return TRUE if automatic selection of Visual area is desired for the +
!  * register.
!  */
!     int
! clip_isautosel_plus()
! {
!     return (
! #ifdef FEAT_GUI
! 	    gui.in_use ? (vim_strchr(p_go, GO_ASELPLUS) != NULL) :
! #endif
! 	    clip_autoselect_plus);
  }
  
  
***************
*** 657,663 ****
      VimClipboard	*cb = &clip_star;
  
      if (cb->state == SELECT_DONE)
! 	clip_clear_selection();
  
      row = check_row(row);
      col = check_col(col);
--- 682,688 ----
      VimClipboard	*cb = &clip_star;
  
      if (cb->state == SELECT_DONE)
! 	clip_clear_selection(cb);
  
      row = check_row(row);
      col = check_col(col);
***************
*** 749,755 ****
  	printf("Selection ended: (%u,%u) to (%u,%u)\n", cb->start.lnum,
  		cb->start.col, cb->end.lnum, cb->end.col);
  #endif
! 	if (clip_isautosel()
  		|| (
  #ifdef FEAT_GUI
  		    gui.in_use ? (vim_strchr(p_go, GO_ASELML) != NULL) :
--- 774,780 ----
  	printf("Selection ended: (%u,%u) to (%u,%u)\n", cb->start.lnum,
  		cb->start.col, cb->end.lnum, cb->end.col);
  #endif
! 	if (clip_isautosel_star()
  		|| (
  #ifdef FEAT_GUI
  		    gui.in_use ? (vim_strchr(p_go, GO_ASELML) != NULL) :
***************
*** 932,947 ****
   * Called from outside to clear selected region from the display
   */
      void
! clip_clear_selection()
  {
-     VimClipboard    *cb = &clip_star;
  
!     if (cb->state == SELECT_CLEARED)
  	return;
  
!     clip_invert_area((int)cb->start.lnum, cb->start.col, (int)cb->end.lnum,
! 						     cb->end.col, CLIP_CLEAR);
!     cb->state = SELECT_CLEARED;
  }
  
  /*
--- 957,972 ----
   * Called from outside to clear selected region from the display
   */
      void
! clip_clear_selection(cbd)
!     VimClipboard    *cbd;
  {
  
!     if (cbd->state == SELECT_CLEARED)
  	return;
  
!     clip_invert_area((int)cbd->start.lnum, cbd->start.col, (int)cbd->end.lnum,
! 						     cbd->end.col, CLIP_CLEAR);
!     cbd->state = SELECT_CLEARED;
  }
  
  /*
***************
*** 954,960 ****
      if (clip_star.state == SELECT_DONE
  	    && row2 >= clip_star.start.lnum
  	    && row1 <= clip_star.end.lnum)
! 	clip_clear_selection();
  }
  
  /*
--- 979,985 ----
      if (clip_star.state == SELECT_DONE
  	    && row2 >= clip_star.start.lnum
  	    && row1 <= clip_star.end.lnum)
! 	clip_clear_selection(&clip_star);
  }
  
  /*
*** ../vim-7.3.596/src/globals.h	2012-06-29 12:35:40.000000000 +0200
--- src/globals.h	2012-07-10 16:35:13.000000000 +0200
***************
*** 517,523 ****
  # define CLIP_UNNAMED_PLUS 2
  EXTERN int	clip_unnamed INIT(= 0); /* above two values or'ed */
  
! EXTERN int	clip_autoselect INIT(= FALSE);
  EXTERN int	clip_autoselectml INIT(= FALSE);
  EXTERN int	clip_html INIT(= FALSE);
  EXTERN regprog_T *clip_exclude_prog INIT(= NULL);
--- 517,524 ----
  # define CLIP_UNNAMED_PLUS 2
  EXTERN int	clip_unnamed INIT(= 0); /* above two values or'ed */
  
! EXTERN int	clip_autoselect_star INIT(= FALSE);
! EXTERN int	clip_autoselect_plus INIT(= FALSE);
  EXTERN int	clip_autoselectml INIT(= FALSE);
  EXTERN int	clip_html INIT(= FALSE);
  EXTERN regprog_T *clip_exclude_prog INIT(= NULL);
*** ../vim-7.3.596/src/proto/ui.pro	2010-08-15 21:57:28.000000000 +0200
--- src/proto/ui.pro	2012-07-10 16:37:35.000000000 +0200
***************
*** 11,27 ****
  void ui_new_shellsize __ARGS((void));
  void ui_breakcheck __ARGS((void));
  void clip_init __ARGS((int can_use));
! void clip_update_selection __ARGS((void));
  void clip_own_selection __ARGS((VimClipboard *cbd));
  void clip_lose_selection __ARGS((VimClipboard *cbd));
- void clip_copy_selection __ARGS((void));
  void clip_auto_select __ARGS((void));
! int clip_isautosel __ARGS((void));
  void clip_modeless __ARGS((int button, int is_click, int is_drag));
  void clip_start_selection __ARGS((int col, int row, int repeated_click));
  void clip_process_selection __ARGS((int button, int col, int row, int_u repeated_click));
  void clip_may_redraw_selection __ARGS((int row, int col, int len));
! void clip_clear_selection __ARGS((void));
  void clip_may_clear_selection __ARGS((int row1, int row2));
  void clip_scroll_selection __ARGS((int rows));
  void clip_copy_modeless_selection __ARGS((int both));
--- 11,27 ----
  void ui_new_shellsize __ARGS((void));
  void ui_breakcheck __ARGS((void));
  void clip_init __ARGS((int can_use));
! void clip_update_selection __ARGS((VimClipboard *clip));
  void clip_own_selection __ARGS((VimClipboard *cbd));
  void clip_lose_selection __ARGS((VimClipboard *cbd));
  void clip_auto_select __ARGS((void));
! int clip_isautosel_star __ARGS((void));
! int clip_isautosel_plus __ARGS((void));
  void clip_modeless __ARGS((int button, int is_click, int is_drag));
  void clip_start_selection __ARGS((int col, int row, int repeated_click));
  void clip_process_selection __ARGS((int button, int col, int row, int_u repeated_click));
  void clip_may_redraw_selection __ARGS((int row, int col, int len));
! void clip_clear_selection __ARGS((VimClipboard *cbd));
  void clip_may_clear_selection __ARGS((int row1, int row2));
  void clip_scroll_selection __ARGS((int rows));
  void clip_copy_modeless_selection __ARGS((int both));
*** ../vim-7.3.596/src/option.h	2012-06-06 16:12:54.000000000 +0200
--- src/option.h	2012-07-10 15:54:32.000000000 +0200
***************
*** 229,234 ****
--- 229,235 ----
  #define GO_MENUS	'm'		/* use menu bar */
  #define GO_NOSYSMENU	'M'		/* don't source system menu */
  #define GO_POINTER	'p'		/* pointer enter/leave callbacks */
+ #define GO_ASELPLUS	'P'		/* autoselectPlus */
  #define GO_RIGHT	'r'		/* use right scrollbar */
  #define GO_VRIGHT	'R'		/* right scrollbar with vert split */
  #define GO_TEAROFF	't'		/* add tear-off menu items */
*** ../vim-7.3.596/src/gui.c	2012-05-27 00:37:45.000000000 +0200
--- src/gui.c	2012-07-10 16:43:34.000000000 +0200
***************
*** 3154,3160 ****
      }
  
      if (clip_star.state != SELECT_CLEARED && !did_clip)
! 	clip_clear_selection();
  #endif
  
      /* Don't put events in the input queue now. */
--- 3154,3160 ----
      }
  
      if (clip_star.state != SELECT_CLEARED && !did_clip)
! 	clip_clear_selection(&clip_star);
  #endif
  
      /* Don't put events in the input queue now. */
*** ../vim-7.3.596/src/version.c	2012-07-10 15:18:18.000000000 +0200
--- src/version.c	2012-07-10 16:32:16.000000000 +0200
***************
*** 716,717 ****
--- 716,719 ----
  {   /* Add new patch number below this line */
+ /**/
+     597,
  /**/

-- 
hundred-and-one symptoms of being an internet addict:
106. When told to "go to your room" you inform your parents that you
     can't...because you were kicked out and banned.

 /// 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    ///