| 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 |
| |
| |
| |
| |
| |
| *** 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 ---- |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| *** 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: |
| |
| |
| |
| *** 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) |
| { |
| |
| |
| |
| *** 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 |
| |
| |
| |
| *** 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 |
| + |
| + |
| |
| |
| |
| *** 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 /// |