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