/* vim: set cin ts=4 sw=4 : */ Test for 'cindent' STARTTEST :so small.vim :set nocompatible viminfo+=nviminfo modeline :edit " read modeline /start of AUTO =/end of AUTO ENDTEST /* start of AUTO matically checked vim: set ts=4 : */ { if (test) cmd1; cmd2; } { if (test) cmd1; else cmd2; } { if (test) { cmd1; cmd2; } } { if (test) { cmd1; else } } { while (this) if (test) cmd1; cmd2; } { while (this) if (test) cmd1; else cmd2; } { if (test) { cmd; } if (test) cmd; } { if (test) { cmd; } if (test) cmd; } { cmd1; for (blah) while (this) if (test) cmd2; cmd3; } { cmd1; for (blah) while (this) if (test) cmd2; cmd3; if (test) { cmd1; cmd2; cmd3; } } /* Test for 'cindent' do/while mixed with if/else: */ { do if (asdf) asdfasd; while (cond); do if (asdf) while (asdf) asdf; while (asdf); } /* Test for 'cindent' with two ) on a continuation line */ { if (asdfasdf;asldkfj asdlkfj as;ldkfj sal;d aal;sdkjf ( ;asldfkja;sldfk al;sdjfka ;slkdf ) sa;ldkjfsa dlk;) line up here; } /* C++ tests: */ // foo() these three lines should remain in column 0 // { // } /* Test for continuation and unterminated lines: */ { i = 99 + 14325 + 21345 + 21345 + 21345 + ( 21345 + 21345) + 2345 + 1234; c = 1; } /* testje for indent with empty line here */ { if (testing && not a joke || line up here) hay; if (testing && (not a joke || testing )line up here) hay; if (testing && (not a joke || testing line up here)) hay; } { switch (c) { case xx: do if (asdf) do asdfasdf; while (asdf); else asdfasdf; while (cond); case yy: case xx: case zz: testing; } } { if (cond) { foo; } else { bar; } } { if (alskdfj ;alsdkfjal;skdjf (;sadlkfsa ;dlkf j;alksdfj ;alskdjf alsdkfj (asldk;fj awith cino=(0 ;lf this one goes to below the paren with == ;laksjfd ;lsakdjf ;alskdf asd) asdfasdf;))) asdfasdf; } int func(a, b) int a; int c; { if (c1 && (c2 || c3)) foo; if (c1 && (c2 || c3) ) } { while (asd) { if (asdf) if (test) if (that) { if (asdf) do cdasd; while (as df); } else if (asdf) asdf; else asdf; asdf; } } { s = "/*"; b = ';' s = "/*"; b = ';'; a = b; } { switch (a) { case a: switch (t) { case 1: cmd; break; case 2: cmd; break; } cmd; break; case b: { int i; cmd; } break; case c: { int i; cmd; } case d: if (cond && test) { /* this line doesn't work right */ int i; cmd; } break; } } { if (!(vim_strchr(p_cpo, CPO_BUFOPTGLOB) != NULL && entering) && (bp_to->b_p_initialized || (!entering && vim_strchr(p_cpo, CPO_BUFOPT) != NULL))) return; label : asdf = asdf ? asdf : asdf; asdf = asdf ? asdf: asdf; } /* Special Comments : This function has the added complexity (compared */ /* : to addtolist) of having to check for a detail */ /* : texture and add that to the list first. */ char *(array[100]) = { "testje", "foo", "bar", } enum soppie { yes = 0, no, maybe }; typedef enum soppie { yes = 0, no, maybe }; static enum { yes = 0, no, maybe } soppie; public static enum { yes = 0, no, maybe } soppie; static private enum { yes = 0, no, maybe } soppie; { int a, b; } { struct Type { int i; char *str; } var[] = { 0, "zero", 1, "one", 2, "two", 3, "three" }; float matrix[3][3] = { { 0, 1, 2 }, { 3, 4, 5 }, { 6, 7, 8 } }; } { /* blah ( blah */ /* where does this go? */ /* blah ( blah */ cmd; func(arg1, /* comment */ arg2); a; { b; { c; /* Hey, NOW it indents?! */ } } { func(arg1, arg2, arg3); /* Hey, what am I doing here? Is this coz of the ","? */ } } main () { if (cond) { a = b; } if (cond) { a = c; } if (cond) a = d; return; } { case 2: if (asdf && asdfasdf) aasdf; a = 9; case 3: if (asdf) aasdf; a = 9; case 4: x = 1; y = 2; label: if (asdf) here; label: if (asdf && asdfasdf) { } label: if (asdf && asdfasdf) { there; } label: if (asdf && asdfasdf) there; } { /* hello with ":set comments= cino=c5" */ /* hello with ":set comments= cino=" */ } { if (a < b) { a = a + 1; } else a = a + 2; if (a) do { testing; } while (asdfasdf); a = b + 1; asdfasdf } { for ( int i = 0; i < 10; i++ ) { } i = 0; } class bob { int foo() {return 1;} int bar; } main() { while(1) if (foo) { bar; } else { asdf; } misplacedline; } { if (clipboard.state == SELECT_DONE && ((row == clipboard.start.lnum && col >= clipboard.start.col) || row > clipboard.start.lnum)) } { if (1) {i += 4;} where_am_i; return 0; } { { } // sdf(asdf if (asdf) asd; } { label1: label2: } { int fooRet = foo(pBar1, false /*fKB*/, true /*fPTB*/, 3 /*nT*/, false /*fDF*/); f() { for ( i = 0; i < m; /* c */ i++ ) { a = b; } } } { f1(/*comment*/); f2(); } { do { if (foo) { } else ; } while (foo); foo(); // was wrong } int x; // no extra indent because of the ; void func() { } char *tab[] = {"aaa", "};", /* }; */ NULL} int indented; {} char *a[] = {"aaa", "bbb", "ccc", NULL}; // here char *tab[] = {"aaa", "xx", /* xx */}; /* asdf */ int not_indented; { do { switch (bla) { case 1: if (foo) bar; } } while (boo); wrong; } int foo, bar; int foo; #if defined(foo) \ && defined(bar) char * xx = "asdf\ foo\ bor"; int x; char *foo = "asdf\ asdf\ asdf", *bar; void f() { #if defined(foo) \ && defined(bar) char *foo = "asdf\ asdf\ asdf", *bar; { int i; char *foo = "asdf\ asdf\ asdf", *bar; } #endif } #endif int y; // comment // comment // comment { Constructor(int a, int b ) : BaseClass(a) { } } void foo() { char one, two; struct bla piet, jan; enum foo kees, jannie; static unsigned sdf, krap; unsigned int piet, jan; int kees, jan; } { t(int f, int d); // ) d(); } Constructor::Constructor(int a, int b ) : BaseClass(a, b, c), mMember(b), { } Constructor::Constructor(int a, int b ) : BaseClass(a) { } Constructor::Constructor(int a, int b ) /*x*/ : /*x*/ BaseClass(a), member(b) { } A::A(int a, int b) : aa(a), bb(b), cc(c) { } class CAbc : public BaseClass1, protected BaseClass2 { int Test() { return FALSE; } int Test1() { return TRUE; } CAbc(int a, int b ) : BaseClass(a) { switch(xxx) { case abc: asdf(); break; case 999: baer(); break; } } public: // <-- this was incoreectly indented before!! void testfall(); protected: void testfall(); }; class CAbc : public BaseClass1, protected BaseClass2 { }; static struct { int a; int b; } variable[COUNT] = { { 123, 456 }, { 123, 456 } }; static struct { int a; int b; } variable[COUNT] = { { 123, 456 }, { 123, 456 } }; void asdf() /* ind_maxparen may cause trouble here */ { if ((0 && 1 && 1 && 1 && 1 && 1 && 1 && 1 && 1 && 1 && 1 && 1 && 1 && 1 && 1 && 1 && 1 && 1 && 1 && 1 && 1 && 1 && 1 && 1 && 1 && 1)) break; } foo() { a = cond ? foo() : asdf + asdf; a = cond ? foo() : asdf + asdf; } int main(void) { if (a) if (b) 2; else 3; next_line_of_code(); } barry() { Foo::Foo (int one, int two) : something(4) {} } barry() { Foo::Foo (int one, int two) : something(4) {} } Constructor::Constructor(int a, int b ) : BaseClass(a, b, c), mMember(b) { } int main () { if (lala) do ++(*lolo); while (lili && lele); lulu; } int main () { switch (c) { case 'c': if (cond) { } } } main() { (void) MyFancyFuasdfadsfnction( argument); } main() { char foo[] = "/*"; /* as 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; } void getstring() { /* Raw strings */ const char* s = R"( test { # comment field: 123 } )"; } void getstring() { const char* s = R"foo( test { # comment field: 123 } )foo"; } { int a[4] = { [0] = 0, [1] = 1, [2] = 2, [3] = 3, }; } { a = b[2] + 3; } { if (1) /* aaaaa * bbbbb */ a = 1; } void func() { switch (foo) { case (bar): if (baz()) quux(); break; case (shmoo): if (!bar) { } case (foo1): switch (bar) { case baz: baz_f(); break; } break; default: baz(); baz(); break; } } /* end of AUTO */ STARTTEST :set tw=0 wm=60 columns=80 noai fo=croq /serious/e a about life, the universe, and the rest ENDTEST { /* this is * a real serious important big * comment */ /* insert " about life, the universe, and the rest" after "serious" */ } STARTTEST :set nocin /comments joabout life/happens jothere/below oline/this Ohello ENDTEST { /* * Testing for comments, without 'cin' set */ /* * what happens here? */ /* the end of the comment, try inserting a line below */ /* how about this one */ } STARTTEST :set cin /vec2 == ENDTEST { var = this + that + vec[0] * vec[0] + vec[1] * vec[1] + vec2[2] * vec[2]; } STARTTEST :set cin :set cino=}4 /testing1 k2==/testing2 k2== ENDTEST { asdf asdflkajds f; if (tes & ting) { asdf asdf asdf ; asdfa sdf asdf; } testing1; if (tes & ting) { asdf asdf asdf ; asdfa sdf asdf; } testing2; } STARTTEST :set cin :set cino=(0,)20 /main =][ ENDTEST main ( int first_par, /* * Comment for * first par */ int second_par /* * Comment for * second par */ ) { func( first_par, /* * Comment for * first par */ second_par /* * Comment for * second par */ ); } STARTTEST :set cin :set cino=es,n0s /main =][ ENDTEST main(void) { /* Make sure that cino=X0s is not parsed like cino=Xs. */ if (cond) foo(); else { bar(); } } STARTTEST :set cin :set cino= ]]=][ ENDTEST { do { if () { if () asdf; else asdf; } } while (); cmd; /* this should go under the } */ } STARTTEST ]]=][ ENDTEST void f() { if ( k() ) { l(); } else { /* Start (two words) end */ m(); } n(); } STARTTEST :set cino={s,e-s ]]=][ ENDTEST void f() { if ( k() ) { l(); } else { /* Start (two words) end */ m(); } n(); /* should be under the if () */ } STARTTEST :set cino={s,fs ]]=/ foo ENDTEST void bar(void) { static array[2][2] = { { 1, 2 }, { 3, 4 }, } while (a) { foo(&a); } { int a; { a = a + 1; } } b = a; } void func(void) { a = 1; { b = 2; } c = 3; d = 4; } /* foo */ STARTTEST :set cino= /while ohere ENDTEST a() { do { a = a + a; } while ( a ); /* add text under this line */ if ( a ) a; } STARTTEST :set cino= com= /comment olabel2: b(); label3 /* post */: /* pre */ label4: f(/*com*/); if (/*com*/) cmd(); ENDTEST a() { label1: /* hmm */ // comment } STARTTEST :set comments& comments^=s:/*,m:**,ex:*/ /simple =5j ENDTEST /* * A simple comment */ /* ** A different comment */ STARTTEST :set cino=c0 :set comments& comments-=s1:/* comments^=s0:/* 2kdd]]=][ ENDTEST void f() { /********* A comment. *********/ } STARTTEST :set cino=c0,C1 :set comments& comments-=s1:/* comments^=s0:/* 2kdd]]=][ ENDTEST void f() { /********* A comment. *********/ } STARTTEST :set cino= ]]=][ ENDTEST void f() { c = c1 && ( c2 || c3 ) && c4; } STARTTEST :set cino=(s 2kdd]]=][ ENDTEST void f() { c = c1 && ( c2 || c3 ) && c4; } STARTTEST :set cino=(s,U1 2kdd]]=][ ENDTEST void f() { c = c1 && ( c2 || c3 ) && c4; } STARTTEST :set cino=(0 2kdd]]=][ ENDTEST void f() { if ( c1 && ( c2 || c3)) foo; } STARTTEST :set cino=(0,w1 2kdd]]=][ ENDTEST void f() { if ( c1 && ( c2 || c3)) foo; } STARTTEST :set cino=(s 2kdd]]=][ ENDTEST void f() { c = c1 && ( c2 || c3 ) && c4; if ( c1 && c2 ) foo; } STARTTEST :set cino=(s,m1 2kdd]]=][ ENDTEST void f() { c = c1 && ( c2 || c3 ) && c4; if ( c1 && c2 ) foo; } STARTTEST :set cino=b1 2kdd]]=][ ENDTEST void f() { switch (x) { case 1: a = b; break; default: a = 0; break; } } STARTTEST :set cino=(0,W5 2kdd]]=][ ENDTEST void f() { invokeme( argu, ment); invokeme( argu, ment ); invokeme(argu, ment ); } STARTTEST :set cino=/6 2kdd]]=][ ENDTEST void f() { statement; // comment 1 // comment 2 } STARTTEST :set cino= 2kdd]]/comment 1/+1 == ENDTEST void f() { statement; // comment 1 // comment 2 } STARTTEST :set cino=g0 2kdd]]=][ ENDTEST class CAbc { int Test() { return FALSE; } public: // comment void testfall(); protected: void testfall(); }; STARTTEST :set cino=(0,gs,hs 2kdd]]=][ ENDTEST class Foo : public Bar { public: virtual void method1(void) = 0; virtual void method2(int arg1, int arg2, int arg3) = 0; }; STARTTEST :set cino=+20 2kdd]]=][ ENDTEST void foo() { if (a) { } else asdf; } STARTTEST :set cino=(0,W2s 2kdd]]=][ ENDTEST { averylongfunctionnamelongfunctionnameaverylongfunctionname()->asd( asdasdf, func(asdf, asdfadsf), asdfasdf ); /* those are ugly, but consequent */ func()->asd(asdasdf, averylongfunctionname( abc, dec)->averylongfunctionname( asdfadsf, asdfasdf, asdfasdf, ), func(asdfadf, asdfasdf ), asdasdf ); averylongfunctionnameaverylongfunctionnameavery()->asd(fasdf( abc, dec)->asdfasdfasdf( asdfadsf, asdfasdf, asdfasdf, ), func(asdfadf, asdfasdf), asdasdf ); } STARTTEST :set cino=M1 2kdd]]=][ ENDTEST int main () { if (cond1 && cond2 ) foo; } STARTTEST :set cino=(0,ts 2kdd2j=][ ENDTEST void func(int a #if defined(FOO) , int b , int c #endif ) { } STARTTEST :set cino=(0 2kdd2j=][ ENDTEST void func(int a #if defined(FOO) , int b , int c #endif ) { } STARTTEST :set cino& 2kdd2j=7][ ENDTEST void func(void) { if(x==y) if(y==z) foo=1; else { bar=1; baz=2; } printf("Foo!\n"); } void func1(void) { char* tab[] = {"foo", "bar", "baz", "quux", "this line used", "to be indented incorrectly"}; foo(); } void func2(void) { int tab[] = {1, 2, 3, 4, 5, 6}; printf("This line used to be indented incorrectly.\n"); } int foo[] #ifdef BAR = { 1, 2, 3, 4, 5, 6 } #endif ; int baz; void func3(void) { int tab[] = { 1, 2, 3, 4, 5, 6}; printf("Don't you dare indent this line incorrectly!\n"); } void func4(a, b, c) int a; int b; int c; { } void func5( int a, int b) { } void func6( int a) { } STARTTEST :set cino& :set cino+=l1 2kdd2j=][ ENDTEST void func(void) { int tab[] = { 1, 2, 3, 4, 5, 6}; printf("Indent this line correctly!\n"); switch (foo) { case bar: printf("bar"); break; case baz: { printf("baz"); break; } case quux: printf("But don't break the indentation of this instruction\n"); break; } } STARTTEST :set cino& 2kdd2j=][ ENDTEST void func(void) { cout << "a" << "b" << ") :" << "c"; } STARTTEST :set com=s1:/*,m:*,ex:*/ ]]3jofoo(); ENDTEST void func(void) { /* * This is a comment. */ } STARTTEST :set cino& 2kdd2j=][ ENDTEST void func(void) { for (int i = 0; i < 10; ++i) if (i & 1) { foo(1); } else foo(0); baz(); } STARTTEST :set cino=k2s,(0 2kdd3j=][ ENDTEST void func(void) { if (condition1 && condition2) action(); function(argument1 && argument2); if (c1 && (c2 || c3)) foo; if (c1 && (c2 || c3)) { } if ( c1 && ( c2 || c3)) foo; func( c1 && ( c2 || c3)) foo; } STARTTEST :set cino=k2s,(s 2kdd3j=][ ENDTEST void func(void) { if (condition1 && condition2) action(); function(argument1 && argument2); if (c1 && (c2 || c3)) foo; if (c1 && (c2 || c3)) { } if ( c1 && ( c2 || c3)) foo; func( c1 && ( c2 || c3)) foo; } STARTTEST :set cino=k2s,(s,U1 2kdd3j=][ ENDTEST void func(void) { if (condition1 && condition2) action(); function(argument1 && argument2); if (c1 && (c2 || c3)) foo; if (c1 && (c2 || c3)) { } if (c123456789 && (c22345 || c3)) printf("foo\n"); c = c1 && ( c2 || c3 ) && c4; } STARTTEST :set cino=k2s,(0,W4 2kdd3j=][ ENDTEST void func(void) { if (condition1 && condition2) action(); function(argument1 && argument2); if (c1 && (c2 || c3)) foo; if (c1 && (c2 || c3)) { } if (c123456789 && (c22345 || c3)) printf("foo\n"); if ( c1 && ( c2 || c3)) foo; a_long_line( argument, argument); a_short_line(argument, argument); } STARTTEST :set cino=k2s,u2 2kdd3j=][ ENDTEST void func(void) { if (condition1 && condition2) action(); function(argument1 && argument2); if (c1 && (c2 || c3)) foo; if (c1 && (c2 || c3)) { } if (c123456789 && (c22345 || c3)) printf("foo\n"); } STARTTEST :set cino=k2s,(0,w1 2kdd3j=][ ENDTEST void func(void) { if (condition1 && condition2) action(); function(argument1 && argument2); if (c1 && (c2 || c3)) foo; if (c1 && (c2 || c3)) { } if (c123456789 && (c22345 || c3)) printf("foo\n"); if ( c1 && ( c2 || c3)) foo; func( c1 && ( c2 || c3)) foo; } STARTTEST :set cino=k2,(s 2kdd3j=][ ENDTEST void func(void) { if (condition1 && condition2) action(); function(argument1 && argument2); if (c1 && (c2 || c3)) foo; if (c1 && (c2 || c3)) { } } STARTTEST :set cino=N-s /^NAMESPACESTART =/^NAMESPACEEND ENDTEST NAMESPACESTART /* valid namespaces with normal indent */ namespace { { 111111111111; } } namespace /* test */ { 11111111111111111; } namespace // test { 111111111111111111; } namespace { 111111111111111111; } namespace test { 111111111111111111; } namespace test::cpp17 { 111111111111111111; } namespace ::incorrectcpp17 { 111111111111111111; } namespace test::incorrectcpp17:: { 111111111111111111; } namespace test:incorrectcpp17 { 111111111111111111; } namespace test:::incorrectcpp17 { 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 :set cino=j1,J1 /^JSSTART =/^JSEND ENDTEST JSSTART var bar = { foo: { that: this, some: ok, }, "bar":{ a : 2, b: "123abc", x: 4, "y": 5 } } JSEND STARTTEST :set cino=j1,J1 /^JSSTART =/^JSEND ENDTEST JSSTART var foo = [ 1, 2, 3 ]; JSEND STARTTEST :set cino=j1,J1 /^JSSTART =/^JSEND ENDTEST JSSTART function bar() { var foo = [ 1, 2, 3 ]; } JSEND STARTTEST :set cino=j1,J1 /^JSSTART =/^JSEND ENDTEST JSSTART (function($){ if (cond && cond) { stmt; } window.something.left = (width - 50 + offset) + "px"; var class_name='myclass'; function private_method() { } var public_method={ method: function(options,args){ private_method(); } } function init(options) { $(this).data(class_name+'_public',$.extend({},{ foo: 'bar', bar: 2, foobar: [ 1, 2, 3 ], callback: function(){ return true; } }, options||{})); } $.fn[class_name]=function() { var _arguments=arguments; return this.each(function(){ var options=$(this).data(class_name+'_public'); if (!options) { init.apply(this,_arguments); } else { var method=public_method[_arguments[0]]; if (typeof(method)!='function') { console.log(class_name+' has no method "'+_arguments[0]+'"'); return false; } _arguments[0]=options; method.apply(this,_arguments); } }); } })(jQuery); JSEND STARTTEST :set cino=j1,J1 /^JSSTART =/^JSEND ENDTEST JSSTART function init(options) { $(this).data(class_name+'_public',$.extend({},{ foo: 'bar', bar: 2, foobar: [ 1, 2, 3 ], callback: function(){ return true; } }, options||{})); } JSEND STARTTEST :set cino=j1,J1 /^JSSTART =/^JSEND ENDTEST JSSTART (function($){ function init(options) { $(this).data(class_name+'_public',$.extend({},{ foo: 'bar', bar: 2, foobar: [ 1, 2, 3 ], callback: function(){ return true; } }, options||{})); } })(jQuery); JSEND STARTTEST :set cino=j1,J1,+2 /^JSSTART =/^JSEND ENDTEST JSSTART // Results of JavaScript indent // 1 (function(){ var a = [ 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i' ]; }()) // 2 (function(){ var a = [ 0 + 5 * 9 * 'a', 'b', 0 + 5 * 9 * 'c', 'd', 'e', 'f', 'g', 'h', 'i' ]; }()) // 3 (function(){ var a = [ 0 + // comment 1 5 * /* comment 2 */ 9 * 'a', 'b', 0 + 5 * 9 * 'c', 'd', 'e', 'f', 'g', 'h', 'i' ]; }()) // 4 { var a = [ 0, 1 ]; var b; var c; } // 5 { var a = [ [ 0 ], 2, 3 ]; } // 6 { var a = [ [ 0, 1 ], 2, 3 ]; } // 7 { var a = [ // [ 0, // 1 // ], 2, 3 ]; } // 8 var x = [ (function(){ var a, b, c, d, e, f, g, h, i; }) ]; // 9 var a = [ 0 + 5 * 9 * 'a', 'b', 0 + 5 * 9 * 'c', 'd', 'e', 'f', 'g', 'h', 'i' ]; // 10 var a, b, c, d, e, f, g, h, i; JSEND STARTTEST :set cin cino& /start of define =/end of define ENDTEST /* start of define */ { } #define AAA \ BBB\ CCC #define CNT \ 1 + \ 2 + \ 4 /* end of define */ STARTTEST :g/^STARTTEST/.,/^ENDTEST/d :1;/start of AUTO/,$wq! test.out ENDTEST