diff --git a/runtime/doc/indent.txt b/runtime/doc/indent.txt index 410fe38eaaf73b6dae47b7bff589cbb3037eb232..a1d4cb21b35bc935295872540fbc8824c088bc93 100644 --- a/runtime/doc/indent.txt +++ b/runtime/doc/indent.txt @@ -215,6 +215,19 @@ assume a 'shiftwidth' of 4. a = b; a = b; a = b; } } } } } } +< + 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). + + cino= cino=L2 cino=Ls > + func() func() func() + { { { + { { { + stmt; stmt; stmt; + LABEL: LABEL: LABEL: + } } } + } } } < :N Place case labels N characters from the indent of the switch(). (default 'shiftwidth'). @@ -464,13 +477,14 @@ assume a 'shiftwidth' of 4. The defaults, spelled out in full, are: - cinoptions=>s,e0,n0,f0,{0,}0,^0,:s,=s,l0,b0,gs,hs,ps,ts,is,+s,c3,C0, - /0,(2s,us,U0,w0,W0,m0,j0,)20,*70,#0 + 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: - It starts with '#' (preprocessor directives), if 'cinkeys' contains '#'. - It starts with a label (a keyword followed by ':', other than "case" and - "default"). + "default") and 'cinoptions' does not contain an 'L' entry with a positive + value. - Any combination of indentations causes the line to have less than 0 indentation. diff --git a/runtime/doc/todo.txt b/runtime/doc/todo.txt index ba8ac913671a1b5d913304d23ad8cf0b0c5a870c..4082b0a570663c922fe3b65202484339735f1f82 100644 --- a/runtime/doc/todo.txt +++ b/runtime/doc/todo.txt @@ -1095,9 +1095,6 @@ Before release 7.3: Vim 7.3: Patches to possibly include: -- Patch for adding "J" flag to 'cinoptions': placement of jump label. (Manuel - Konig, 2010 Feb 19) Update by Lech Lorens, Feb 22. - Need another name, "J" is now used for Javascript. - Patch for Python 3 support. (Roland Puntaier, 2009 Sep 22) Includes changes for omnicompletion. Needs some more testing. diff --git a/src/misc1.c b/src/misc1.c index 4b0ff6df34d0ff04acaa3af3c3a0cdddb65ab90f..e34f033bd263013321e600a329401fa2dcff3972 100644 --- a/src/misc1.c +++ b/src/misc1.c @@ -6061,6 +6061,12 @@ get_c_indent() */ int ind_open_left_imag = 0; + /* + * Spaces jump labels should be shifted to the left if N is non-negative, + * otherwise the jump label will be put to column 1. + */ + int ind_jump_label = -1; + /* * spaces from the switch() indent a "case xx" label should be located */ @@ -6232,6 +6238,7 @@ get_c_indent() int iscase; int lookfor_break; int cont_amount = 0; /* amount for continuation line */ + int original_line_islabel; for (options = curbuf->b_p_cino; *options; ) { @@ -6277,6 +6284,7 @@ get_c_indent() case '{': ind_open_extra = n; break; case '}': ind_close_extra = n; break; case '^': ind_open_left_imag = n; break; + case 'L': ind_jump_label = n; break; case ':': ind_case = n; break; case '=': ind_case_code = n; break; case 'b': ind_case_break = n; break; @@ -6339,6 +6347,8 @@ get_c_indent() curwin->w_cursor.col = 0; + original_line_islabel = cin_islabel(ind_maxcomment); /* XXX */ + /* * #defines and so on always go at the left when included in 'cinkeys'. */ @@ -6348,9 +6358,11 @@ get_c_indent() } /* - * Is it a non-case label? Then that goes at the left margin too unless JS flag is set. + * Is it a non-case label? Then that goes at the left margin too unless: + * - JS flag is set. + * - 'L' item has a positive value. */ - else if (!ind_js && cin_islabel(ind_maxcomment)) /* XXX */ + else if (original_line_islabel && !ind_js && ind_jump_label < 0) { amount = 0; } @@ -7743,6 +7755,10 @@ term_again: /* add extra indent for a comment */ if (cin_iscomment(theline)) amount += ind_comment; + + /* subtract extra left-shift for jump labels */ + if (ind_jump_label > 0 && original_line_islabel) + amount -= ind_jump_label; } /*