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.
***************
*** 256,261 ****
--- 273,279 ----
break; break;
} }
<
+ *cino-b*
bN If N != 0 Vim will align a final "break" with the case label,
so that case..break looks like a sort of block. (default: 0).
When using 1, consider adding "0=break" to 'cinkeys'.
***************
*** 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 ':').
***************
*** 320,325 ****
--- 357,363 ----
BaseClass(3) BaseClass(3)
{} {}
<
+ *cino-+*
+N Indent a continuation line (a line that spills onto the next)
inside a function N additional characters. (default
'shiftwidth').
***************
*** 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'). >
***************
*** 466,481 ****
--- 514,532 ----
}
}
<
+ *cino-)*
)N Vim searches for unclosed parentheses at most N lines away.
This limits the time needed to search for parentheses. (default
20 lines).
+ *cino-star*
*N Vim searches for unclosed comments at most N lines away. This
limits the time needed to search for the start of a comment.
If your /* */ comments stop indenting afer N lines this is the
value you will want to change.
(default 70 lines).
+ *cino-#*
#N When N is non-zero recognize shell/Perl comments, starting with
'#'. Default N is zero: don't recognizes '#' comments. Note
that lines starting with # will still be seen as preprocessor
***************
*** 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 ///