To: vim_dev@googlegroups.com
Subject: Patch 7.3.202
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.202
Problem:    Cannot influence the indent inside a namespace.
Solution:   Add the "N" 'cino' parameter. (Konstantin Lepa)
Files:      runtime/doc/indent.txt, src/misc1.c, src/testdir/test3.in,
            src/testdir/test3.ok


*** ../mercurial/vim73/runtime/doc/indent.txt	2011-04-28 19:01:26.000000000 +0200
--- runtime/doc/indent.txt	2011-05-25 14:35:37.000000000 +0200
***************
*** 128,140 ****
  used CTRL-T or CTRL-D.
  
  						*cinoptions-values*
! The 'cinoptions' option sets how Vim performs indentation.  In the list below,
  "N" represents a number of your choice (the number can be negative).  When
  there is an 's' after the number, Vim multiplies the number by 'shiftwidth':
  "1s" is 'shiftwidth', "2s" is two times 'shiftwidth', etc.  You can use a
! decimal point, too: "-0.5s" is minus half a 'shiftwidth'.  The examples below
! assume a 'shiftwidth' of 4.
! 
  	>N    Amount added for "normal" indent.  Used after a line that should
  	      increase the indent (lines starting with "if", an opening brace,
  	      etc.).  (default 'shiftwidth').
--- 128,147 ----
  used CTRL-T or CTRL-D.
  
  						*cinoptions-values*
! The 'cinoptions' option sets how Vim performs indentation.  The value after
! the option character can be one of these (N is any number):
! 	N	indent N spaces
! 	-N	indent N spaces to the left
! 	Ns	N times 'shiftwidth spaces
! 	-Ns	N times 'shiftwidth spaces to the left
! 
! In the list below,
  "N" represents a number of your choice (the number can be negative).  When
  there is an 's' after the number, Vim multiplies the number by 'shiftwidth':
  "1s" is 'shiftwidth', "2s" is two times 'shiftwidth', etc.  You can use a
! decimal point, too: "-0.5s" is minus half a 'shiftwidth'.
! The examples below assume a 'shiftwidth' of 4.
! 							*cino->*
  	>N    Amount added for "normal" indent.  Used after a line that should
  	      increase the indent (lines starting with "if", an opening brace,
  	      etc.).  (default 'shiftwidth').
***************
*** 145,150 ****
--- 152,158 ----
  		      foo;		foo;			  foo;
  		  }		      }			  }
  <
+ 							*cino-e*
  	eN    Add N to the prevailing indent inside a set of braces if the
  	      opening brace at the End of the line (more precise: is not the
  	      first character in a line).  This is useful if you want a
***************
*** 160,165 ****
--- 168,174 ----
  		      bar;		  bar;		      bar;
  		  }		      }			  }
  <
+ 							*cino-n*
  	nN    Add N to the prevailing indent for a statement after an "if",
  	      "while", etc., if it is NOT inside a set of braces.  This is
  	      useful if you want a different indent when there is no '{'
***************
*** 174,179 ****
--- 183,189 ----
  		      bar;		  bar;		      bar;
  		  }		      }			  }
  <
+ 							*cino-f*
  	fN    Place the first opening brace of a function or other block in
  	      column N.  This applies only for an opening brace that is not
  	      inside other braces and is at the start of the line.  What comes
***************
*** 184,189 ****
--- 194,200 ----
  		  {			{		      {
  		      int foo;		    int foo;		  int foo;
  <
+ 							*cino-{*
  	{N    Place opening braces N characters from the prevailing indent.
  	      This applies only for opening braces that are inside other
  	      braces.  (default 0).
***************
*** 193,198 ****
--- 204,210 ----
  		  {			{		      {
  		      foo;		  foo;		      foo;
  <
+ 							*cino-}*
  	}N    Place closing braces N characters from the matching opening
  	      brace.  (default 0).
  
***************
*** 202,207 ****
--- 214,220 ----
  		      foo;		  foo;		      foo;
  		  }		      }			    }
  <
+ 							*cino-^*
  	^N    Add N to the prevailing indent inside a set of braces if the
  	      opening brace is in column 0.  This can specify a different
  	      indent for whole of a function (some may like to set it to a
***************
*** 216,221 ****
--- 229,235 ----
  		      }			}		  }
  		  }		      }			  }
  <
+ 							*cino-L*
  	LN    Controls placement of jump labels. If N is negative, the label
  	      will be placed at column 1. If N is non-negative, the indent of
  	      the label will be the prevailing indent minus N.  (default -1).
***************
*** 229,234 ****
--- 243,249 ----
  		      }                   }                   }
  		  }                   }                   }
  <
+ 							*cino-:*
  	:N    Place case labels N characters from the indent of the switch().
  	      (default 'shiftwidth').
  
***************
*** 240,245 ****
--- 255,261 ----
  		      default:	      default:
  		  }		      }
  <
+ 							*cino-=*
  	=N    Place statements occurring after a case label N characters from
  	      the indent of the label.  (default 'shiftwidth').
  
***************
*** 247,252 ****
--- 263,269 ----
  		   case 11:		case 11:  a = a + 1;
  		       a = a + 1;		  b = b + 1;
  <
+ 							*cino-l*
  	lN    If N != 0 Vim will align with a case label instead of the
  	      statement after it in the same line.
  
***************
*** 272,277 ****
--- 290,296 ----
  			  break;	  break;
  		  }		      }
  <
+ 							*cino-g*
  	gN    Place C++ scope declarations N characters from the indent of the
  	      block they are in.  (default 'shiftwidth').  A scope declaration
  	      can be "public:", "protected:" or "private:".
***************
*** 283,288 ****
--- 302,308 ----
  		      private:	      private:
  		  }		      }
  <
+ 							*cino-h*
  	hN    Place statements occurring after a C++ scope declaration N
  	      characters from the indent of the label.  (default
  	      'shiftwidth').
***************
*** 291,296 ****
--- 311,331 ----
  		   public:		public:   a = a + 1;
  		       a = a + 1;		  b = b + 1;
  <
+ 							*cino-N*
+ 	NN    Indent inside C++ namespace N characters extra compared to a
+ 	      normal block.  (default 0).
+ 
+ 		cino=			   cino=N-s >
+ 		  namespace {                namespace {
+ 		      void function();       void function();
+ 		  }                          }
+ 
+ 		  namespace my               namespace my
+ 		  {                          {
+ 		      void function();       void function();
+ 		  }                          }
+ <
+ 							*cino-p*
  	pN    Parameter declarations for K&R-style function declarations will
  	      be indented N characters from the margin.  (default
  	      'shiftwidth').
***************
*** 300,305 ****
--- 335,341 ----
  		      int a;	      int a;			  int a;
  		      char b;	      char b;			  char b;
  <
+ 							*cino-t*
  	tN    Indent a function return type declaration N characters from the
  	      margin.  (default 'shiftwidth').
  
***************
*** 307,312 ****
--- 343,349 ----
  		      int	      int			 int
  		  func()	      func()		  func()
  <
+ 							*cino-i*
  	iN    Indent C++ base class declarations and constructor
  	      initializations, if they start in a new line (otherwise they
  	      are aligned at the right side of the ':').
***************
*** 330,335 ****
--- 368,374 ----
  		  a = b + 9 *		    a = b + 9 *
  		      c;			      c;
  <
+ 							*cino-c*
  	cN    Indent comment lines after the comment opener, when there is no
  	      other text with which to align, N characters from the comment
  	      opener.  (default 3).  See also |format-comments|.
***************
*** 339,344 ****
--- 378,384 ----
  		     text.			 text.
  		   */			     */
  <
+ 							*cino-C*
  	CN    When N is non-zero, indent comment lines by the amount specified
  	      with the c flag above even if there is other text behind the
  	      comment opener.  (default 0).
***************
*** 349,360 ****
--- 389,402 ----
  		  ********/		    ********/
  <	      (Example uses ":set comments& comments-=s1:/* comments^=s0:/*")
  
+ 							*cino-/*
  	/N    Indent comment lines N characters extra.  (default 0).
  		cino=			  cino=/4 >
  		  a = b;		    a = b;
  		  /* comment */			/* comment */
  		  c = d;		    c = d;
  <
+ 							*cino-(*
  	(N    When in unclosed parentheses, indent N characters from the line
  	      with the unclosed parentheses.  Add a 'shiftwidth' for every
  	      unclosed parentheses.  When N is 0 or the unclosed parentheses
***************
*** 370,375 ****
--- 412,418 ----
  			  (c2 || c3))		(c2 || c3))
  		     {			       {
  <
+ 							*cino-u*
  	uN    Same as (N, but for one level deeper.  (default 'shiftwidth').
  
  		cino=			  cino=u2 >
***************
*** 377,382 ****
--- 420,426 ----
  			  && (c22345		    && (c22345
  			      || c3))		      || c3))
  <
+ 							*cino-U*
  	UN    When N is non-zero, do not ignore the indenting specified by
  	      ( or u in case that the unclosed parentheses is the first
  	      non-white character in its line.  (default 0).
***************
*** 388,393 ****
--- 432,438 ----
  		       c3			    c3
  		      ) && c4;			) && c4;
  <
+ 							*cino-2*
  	wN    When in unclosed parentheses and N is non-zero and either
  	      using "(0" or "u0", respectively, or using "U0" and the unclosed
  	      parentheses is the first non-white character in its line, line
***************
*** 400,405 ****
--- 445,451 ----
  				|| c3))		    || c3))
  		      foo;			foo;
  <
+ 							*cino-W*
  	WN    When in unclosed parentheses and N is non-zero and either
  	      using "(0" or "u0", respectively and the unclosed parentheses is
  	      the last non-white character in its line and it is not the
***************
*** 414,419 ****
--- 460,466 ----
  		  a_short_line(argument,    a_short_line(argument,
  			       argument);		 argument);
  <
+ 							*cino-m*
  	mN    When N is non-zero, line up a line starting with a closing
  	      parentheses with the first character of the line with the
  	      matching opening parentheses.  (default 0).
***************
*** 428,433 ****
--- 475,481 ----
  		     )			    )
  		      foo;			foo;
  <
+ 							*cino-M*
  	MN    When N is non-zero, line up a line starting with a closing
  	      parentheses with the first character of the previous line.
  	      (default 0).
***************
*** 437,443 ****
  			 cond2			   cond2
  		     )				   )
  <
! 					*java-cinoptions* *java-indenting*
  	jN    Indent java anonymous classes correctly.  The value 'N' is
  	      currently unused but must be non-zero (e.g. 'j1').  'j1' will
  	      indent for example the following code snippet correctly: >
--- 485,491 ----
  			 cond2			   cond2
  		     )				   )
  <
! 				*java-cinoptions* *java-indenting* *cino-j*
  	jN    Indent java anonymous classes correctly.  The value 'N' is
  	      currently unused but must be non-zero (e.g. 'j1').  'j1' will
  	      indent for example the following code snippet correctly: >
***************
*** 448,454 ****
  		    }
  		});
  <
! 				*javascript-cinoptions* *javascript-indenting*
  	JN    Indent JavaScript object declarations correctly by not confusing
  	      them with labels.  The value 'N' is currently unused but must be 
  	      non-zero (e.g. 'J1'). >
--- 496,502 ----
  		    }
  		});
  <
! 			*javascript-cinoptions* *javascript-indenting* *cino-J*
  	JN    Indent JavaScript object declarations correctly by not confusing
  	      them with labels.  The value 'N' is currently unused but must be 
  	      non-zero (e.g. 'J1'). >
***************
*** 483,489 ****
  
  
  The defaults, spelled out in full, are:
! 	cinoptions=>s,e0,n0,f0,{0,}0,^0,L-1,:s,=s,l0,b0,gs,hs,ps,ts,is,+s,
  			c3,C0,/0,(2s,us,U0,w0,W0,m0,j0,J0,)20,*70,#0
  
  Vim puts a line in column 1 if:
--- 534,540 ----
  
  
  The defaults, spelled out in full, are:
! 	cinoptions=>s,e0,n0,f0,{0,}0,^0,L-1,:s,=s,l0,b0,gs,hs,N0,ps,ts,is,+s,
  			c3,C0,/0,(2s,us,U0,w0,W0,m0,j0,J0,)20,*70,#0
  
  Vim puts a line in column 1 if:
*** ../mercurial/vim73/src/misc1.c	2011-05-25 13:33:59.000000000 +0200
--- src/misc1.c	2011-05-25 14:57:31.000000000 +0200
***************
*** 4959,4964 ****
--- 4959,4965 ----
  static int	corr_ind_maxparen __ARGS((int ind_maxparen, pos_T *startpos));
  static int	find_last_paren __ARGS((char_u *l, int start, int end));
  static int	find_match __ARGS((int lookfor, linenr_T ourscope, int ind_maxparen, int ind_maxcomment));
+ static int	cin_is_cpp_namespace __ARGS((char_u *));
  
  static int	ind_hash_comment = 0;   /* # starts a comment */
  
***************
*** 5221,5226 ****
--- 5222,5271 ----
      return (*(s = cin_skipcomment(s + i)) == ':' && s[1] != ':');
  }
  
+ /* Maximum number of lines to search back for a "namespace" line. */
+ #define FIND_NAMESPACE_LIM 20
+ 
+ /*
+  * Recognize a "namespace" scope declaration.
+  */
+     static int
+ cin_is_cpp_namespace(s)
+     char_u	*s;
+ {
+     char_u	*p;
+     int		has_name = FALSE;
+ 
+     s = cin_skipcomment(s);
+     if (STRNCMP(s, "namespace", 9) == 0 && (s[9] == NUL || !vim_iswordc(s[9])))
+     {
+ 	p = cin_skipcomment(skipwhite(s + 9));
+ 	while (*p != NUL)
+ 	{
+ 	    if (vim_iswhite(*p))
+ 	    {
+ 		has_name = TRUE; /* found end of a name */
+ 		p = cin_skipcomment(skipwhite(p));
+ 	    }
+ 	    else if (*p == '{')
+ 	    {
+ 		break;
+ 	    }
+ 	    else if (vim_iswordc(*p))
+ 	    {
+ 		if (has_name)
+ 		    return FALSE; /* word character after skipping past name */
+ 		++p;
+ 	    }
+ 	    else
+ 	    {
+ 		return FALSE;
+ 	    }
+ 	}
+ 	return TRUE;
+     }
+     return FALSE;
+ }
+ 
  /*
   * Return a pointer to the first non-empty non-comment character after a ':'.
   * Return NULL if not found.
***************
*** 6296,6301 ****
--- 6341,6351 ----
       */
      int ind_keep_case_label = 0;
  
+     /*
+      * handle C++ namespace
+      */
+     int ind_cpp_namespace = 0;
+ 
      pos_T	cur_curpos;
      int		amount;
      int		scope_amount;
***************
*** 6336,6341 ****
--- 6386,6392 ----
      int		n;
      int		iscase;
      int		lookfor_break;
+     int		lookfor_cpp_namespace = FALSE;
      int		cont_amount = 0;    /* amount for continuation line */
      int		original_line_islabel;
  
***************
*** 6409,6414 ****
--- 6460,6466 ----
  	    case 'J': ind_js = n; break;
  	    case 'l': ind_keep_case_label = n; break;
  	    case '#': ind_hash_comment = n; break;
+ 	    case 'N': ind_cpp_namespace = n; break;
  	}
  	if (*options == ',')
  	    ++options;
***************
*** 6976,6986 ****
--- 7028,7051 ----
  	    if (start_brace == BRACE_IN_COL0)	    /* '{' is in column 0 */
  	    {
  		amount = ind_open_left_imag;
+ 		lookfor_cpp_namespace = TRUE;
+ 	    }
+ 	    else if (start_brace == BRACE_AT_START &&
+ 		    lookfor_cpp_namespace)	  /* '{' is at start */
+ 	    {
+ 
+ 		lookfor_cpp_namespace = TRUE;
  	    }
  	    else
  	    {
  		if (start_brace == BRACE_AT_END)    /* '{' is at end of line */
+ 		{
  		    amount += ind_open_imag;
+ 
+ 		    l = skipwhite(ml_get_curline());
+ 		    if (cin_is_cpp_namespace(l))
+ 			amount += ind_cpp_namespace;
+ 		}
  		else
  		{
  		    /* Compensate for adding ind_open_extra later. */
***************
*** 7151,7156 ****
--- 7216,7261 ----
  			else
  			    amount += ind_continuation;
  		    }
+ 		    else if (lookfor_cpp_namespace)
+ 		    {
+ 			if (curwin->w_cursor.lnum == ourscope)
+ 			    continue;
+ 
+ 			if (curwin->w_cursor.lnum == 0
+ 				|| curwin->w_cursor.lnum
+ 					      < ourscope - FIND_NAMESPACE_LIM)
+ 			    break;
+ 
+ 			l = ml_get_curline();
+ 
+ 			/*
+ 			 * If we're in a comment now, skip to the start of the
+ 			 * comment.
+ 			 */
+ 			trypos = find_start_comment(ind_maxcomment);
+ 			if (trypos != NULL)
+ 			{
+ 			    curwin->w_cursor.lnum = trypos->lnum + 1;
+ 			    curwin->w_cursor.col = 0;
+ 			    continue;
+ 			}
+ 
+ 			/*
+ 			 * Skip preprocessor directives and blank lines.
+ 			 */
+ 			if (cin_ispreproc_cont(&l, &curwin->w_cursor.lnum))
+ 			    continue;
+ 
+ 			if (cin_is_cpp_namespace(l))
+ 			{
+ 			    amount += ind_cpp_namespace;
+ 			    break;
+ 			}
+ 
+ 			if (cin_nocode(l))
+ 			    continue;
+ 
+ 		    }
  		    else if (lookfor != LOOKFOR_TERM
  					  && lookfor != LOOKFOR_CPP_BASECLASS)
  		    {
*** ../mercurial/vim73/src/testdir/test3.in	2011-05-25 13:33:59.000000000 +0200
--- src/testdir/test3.in	2011-05-25 14:47:31.000000000 +0200
***************
*** 799,804 ****
--- 799,867 ----
  	df */
  		hello
  }
+ 
+ /* valid namespaces with normal indent */
+ namespace
+ {
+ {
+   111111111111;
+ }
+ }
+ namespace /* test */
+ {
+   11111111111111111;
+ }
+ namespace // test
+ {
+   111111111111111111;
+ }
+ namespace
+ {
+   111111111111111111;
+ }
+ namespace test
+ {
+   111111111111111111;
+ }
+ namespace{
+   111111111111111111;
+ }
+ namespace test{
+   111111111111111111;
+ }
+ namespace {
+   111111111111111111;
+ }
+ namespace test {
+   111111111111111111;
+ namespace test2 {
+   22222222222222222;
+ }
+ }
+ 
+ /* invalid namespaces use block indent */
+ namespace test test2 {
+   111111111111111111111;
+ }
+ namespace11111111111 {
+   111111111111;
+ }
+ namespace() {
+   1111111111111;
+ }
+ namespace()
+ {
+   111111111111111111;
+ }
+ namespace test test2
+ {
+   1111111111111111111;
+ }
+ namespace111111111
+ {
+   111111111111111111;
+ }
+ 
  /* end of AUTO */
  
  STARTTEST
***************
*** 1428,1433 ****
--- 1491,1566 ----
  }
  
  STARTTEST
+ :set cino=N-s
+ /namespaces
+ =/^NAMESPACEEND
+ ENDTEST
+ 
+ /* valid namespaces with normal indent */
+ namespace
+ {
+    {
+ 	111111111111;
+ }
+ }
+ namespace /* test */
+ {
+   11111111111111111;
+ }
+ namespace // test
+ {
+   111111111111111111;
+ }
+ namespace
+ {
+   111111111111111111;
+ }
+ namespace test
+ {
+   111111111111111111;
+ }
+ namespace{
+   111111111111111111;
+ }
+ namespace test{
+   111111111111111111;
+ }
+ namespace {
+   111111111111111111;
+ }
+ namespace test {
+   111111111111111111;
+ namespace test2 {
+   22222222222222222;
+ }
+ }
+ 
+ /* invalid namespaces use block indent */
+ namespace test test2 {
+   111111111111111111111;
+ }
+ namespace11111111111 {
+   111111111111;
+ }
+ namespace() {
+   1111111111111;
+ }
+ namespace()
+ {
+   111111111111111111;
+ }
+ namespace test test2
+ {
+   1111111111111111111;
+ }
+ namespace111111111
+ {
+   111111111111111111;
+ }
+ NAMESPACEEND
+ 
+ 
+ STARTTEST
  :g/^STARTTEST/.,/^ENDTEST/d
  :1;/start of AUTO/,$wq! test.out
  ENDTEST
*** ../mercurial/vim73/src/testdir/test3.ok	2011-05-25 13:33:59.000000000 +0200
--- src/testdir/test3.ok	2011-05-25 14:48:02.000000000 +0200
***************
*** 787,792 ****
--- 787,855 ----
  	   df */
  	hello
  }
+ 
+ /* valid namespaces with normal indent */
+ namespace
+ {
+ 	{
+ 		111111111111;
+ 	}
+ }
+ namespace /* test */
+ {
+ 	11111111111111111;
+ }
+ namespace // test
+ {
+ 	111111111111111111;
+ }
+ namespace
+ {
+ 	111111111111111111;
+ }
+ namespace test
+ {
+ 	111111111111111111;
+ }
+ namespace{
+ 	111111111111111111;
+ }
+ namespace test{
+ 	111111111111111111;
+ }
+ namespace {
+ 	111111111111111111;
+ }
+ namespace test {
+ 	111111111111111111;
+ 	namespace test2 {
+ 		22222222222222222;
+ 	}
+ }
+ 
+ /* invalid namespaces use block indent */
+ namespace test test2 {
+ 	111111111111111111111;
+ }
+ namespace11111111111 {
+ 	111111111111;
+ }
+ namespace() {
+ 	1111111111111;
+ }
+ namespace()
+ {
+ 	111111111111111111;
+ }
+ namespace test test2
+ {
+ 	1111111111111111111;
+ }
+ namespace111111111
+ {
+ 	111111111111111111;
+ }
+ 
  /* end of AUTO */
  
  
***************
*** 1273,1275 ****
--- 1336,1403 ----
  	baz();
  }
  
+ 
+ /* valid namespaces with normal indent */
+ namespace
+ {
+ {
+ 	111111111111;
+ }
+ }
+ namespace /* test */
+ {
+ 11111111111111111;
+ }
+ namespace // test
+ {
+ 111111111111111111;
+ }
+ namespace
+ {
+ 111111111111111111;
+ }
+ namespace test
+ {
+ 111111111111111111;
+ }
+ namespace{
+ 111111111111111111;
+ }
+ namespace test{
+ 111111111111111111;
+ }
+ namespace {
+ 111111111111111111;
+ }
+ namespace test {
+ 111111111111111111;
+ namespace test2 {
+ 22222222222222222;
+ }
+ }
+ 
+ /* invalid namespaces use block indent */
+ namespace test test2 {
+ 	111111111111111111111;
+ }
+ namespace11111111111 {
+ 	111111111111;
+ }
+ namespace() {
+ 	1111111111111;
+ }
+ namespace()
+ {
+ 	111111111111111111;
+ }
+ namespace test test2
+ {
+ 	1111111111111111111;
+ }
+ namespace111111111
+ {
+ 	111111111111111111;
+ }
+ NAMESPACEEND
+ 
+ 
*** ../vim-7.3.201/src/version.c	2011-05-25 13:33:59.000000000 +0200
--- src/version.c	2011-05-25 15:14:20.000000000 +0200
***************
*** 711,712 ****
--- 711,714 ----
  {   /* Add new patch number below this line */
+ /**/
+     202,
  /**/

-- 
hundred-and-one symptoms of being an internet addict:
107. When using your phone you forget that you don't have to use your
     keyboard.

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