1071d4279SBram Moolenaar" Vim indent file 2071d4279SBram Moolenaar" Language: Java 3*3fdfa4a9SBram Moolenaar" Maintainer: Toby Allsopp <[email protected]> (resigned) 4*3fdfa4a9SBram Moolenaar" Last Change: 2004 Oct 05 5071d4279SBram Moolenaar 6071d4279SBram Moolenaar" Only load this indent file when no other was loaded. 7071d4279SBram Moolenaarif exists("b:did_indent") 8071d4279SBram Moolenaar finish 9071d4279SBram Moolenaarendif 10071d4279SBram Moolenaarlet b:did_indent = 1 11071d4279SBram Moolenaar 12071d4279SBram Moolenaar" Indent Java anonymous classes correctly. 13071d4279SBram Moolenaarsetlocal cinoptions& cinoptions+=j1 14071d4279SBram Moolenaar 15071d4279SBram Moolenaar" The "extends" and "implements" lines start off with the wrong indent. 16071d4279SBram Moolenaarsetlocal indentkeys& indentkeys+=0=extends indentkeys+=0=implements 17071d4279SBram Moolenaar 18071d4279SBram Moolenaar" Set the function to do the work. 19071d4279SBram Moolenaarsetlocal indentexpr=GetJavaIndent() 20071d4279SBram Moolenaar 21071d4279SBram Moolenaar" Only define the function once. 22071d4279SBram Moolenaarif exists("*GetJavaIndent") 23071d4279SBram Moolenaar finish 24071d4279SBram Moolenaarendif 25071d4279SBram Moolenaar 26071d4279SBram Moolenaarfunction! SkipJavaBlanksAndComments(startline) 27071d4279SBram Moolenaar let lnum = a:startline 28071d4279SBram Moolenaar while lnum > 1 29071d4279SBram Moolenaar let lnum = prevnonblank(lnum) 30071d4279SBram Moolenaar if getline(lnum) =~ '\*/\s*$' 31071d4279SBram Moolenaar while getline(lnum) !~ '/\*' && lnum > 1 32071d4279SBram Moolenaar let lnum = lnum - 1 33071d4279SBram Moolenaar endwhile 34071d4279SBram Moolenaar if getline(lnum) =~ '^\s*/\*' 35071d4279SBram Moolenaar let lnum = lnum - 1 36071d4279SBram Moolenaar else 37071d4279SBram Moolenaar break 38071d4279SBram Moolenaar endif 39071d4279SBram Moolenaar elseif getline(lnum) =~ '^\s*//' 40071d4279SBram Moolenaar let lnum = lnum - 1 41071d4279SBram Moolenaar else 42071d4279SBram Moolenaar break 43071d4279SBram Moolenaar endif 44071d4279SBram Moolenaar endwhile 45071d4279SBram Moolenaar return lnum 46071d4279SBram Moolenaarendfunction 47071d4279SBram Moolenaar 48071d4279SBram Moolenaarfunction GetJavaIndent() 49071d4279SBram Moolenaar 50071d4279SBram Moolenaar " Java is just like C; use the built-in C indenting and then correct a few 51071d4279SBram Moolenaar " specific cases. 52071d4279SBram Moolenaar let theIndent = cindent(v:lnum) 53071d4279SBram Moolenaar 54071d4279SBram Moolenaar " If we're in the middle of a comment then just trust cindent 55071d4279SBram Moolenaar if getline(v:lnum) =~ '^\s*\*' 56071d4279SBram Moolenaar return theIndent 57071d4279SBram Moolenaar endif 58071d4279SBram Moolenaar 59071d4279SBram Moolenaar " find start of previous line, in case it was a continuation line 60071d4279SBram Moolenaar let lnum = SkipJavaBlanksAndComments(v:lnum - 1) 61071d4279SBram Moolenaar let prev = lnum 62071d4279SBram Moolenaar while prev > 1 63071d4279SBram Moolenaar let next_prev = SkipJavaBlanksAndComments(prev - 1) 64071d4279SBram Moolenaar if getline(next_prev) !~ ',\s*$' 65071d4279SBram Moolenaar break 66071d4279SBram Moolenaar endif 67071d4279SBram Moolenaar let prev = next_prev 68071d4279SBram Moolenaar endwhile 69071d4279SBram Moolenaar 70071d4279SBram Moolenaar " Try to align "throws" lines for methods and "extends" and "implements" for 71071d4279SBram Moolenaar " classes. 72071d4279SBram Moolenaar if getline(v:lnum) =~ '^\s*\(extends\|implements\)\>' 73071d4279SBram Moolenaar \ && getline(lnum) !~ '^\s*\(extends\|implements\)\>' 74071d4279SBram Moolenaar let theIndent = theIndent + &sw 75071d4279SBram Moolenaar endif 76071d4279SBram Moolenaar 77071d4279SBram Moolenaar " correct for continuation lines of "throws", "implements" and "extends" 78071d4279SBram Moolenaar let cont_kw = matchstr(getline(prev), 79071d4279SBram Moolenaar \ '^\s*\zs\(throws\|implements\|extends\)\>\ze.*,\s*$') 80071d4279SBram Moolenaar if strlen(cont_kw) > 0 81071d4279SBram Moolenaar let amount = strlen(cont_kw) + 1 82071d4279SBram Moolenaar if getline(lnum) !~ ',\s*$' 83071d4279SBram Moolenaar let theIndent = theIndent - (amount + &sw) 84071d4279SBram Moolenaar if theIndent < 0 85071d4279SBram Moolenaar let theIndent = 0 86071d4279SBram Moolenaar endif 87071d4279SBram Moolenaar elseif prev == lnum 88071d4279SBram Moolenaar let theIndent = theIndent + amount 89071d4279SBram Moolenaar if cont_kw ==# 'throws' 90071d4279SBram Moolenaar let theIndent = theIndent + &sw 91071d4279SBram Moolenaar endif 92071d4279SBram Moolenaar endif 93071d4279SBram Moolenaar elseif getline(prev) =~ '^\s*\(throws\|implements\|extends\)\>' 94071d4279SBram Moolenaar \ && (getline(prev) =~ '{\s*$' 95071d4279SBram Moolenaar \ || getline(v:lnum) =~ '^\s*{\s*$') 96071d4279SBram Moolenaar let theIndent = theIndent - &sw 97071d4279SBram Moolenaar endif 98071d4279SBram Moolenaar 99071d4279SBram Moolenaar " When the line starts with a }, try aligning it with the matching {, 100071d4279SBram Moolenaar " skipping over "throws", "extends" and "implements" clauses. 101071d4279SBram Moolenaar if getline(v:lnum) =~ '^\s*}\s*\(//.*\|/\*.*\)\=$' 102071d4279SBram Moolenaar call cursor(v:lnum, 1) 103071d4279SBram Moolenaar silent normal % 104071d4279SBram Moolenaar let lnum = line('.') 105071d4279SBram Moolenaar if lnum < v:lnum 106071d4279SBram Moolenaar while lnum > 1 107071d4279SBram Moolenaar let next_lnum = SkipJavaBlanksAndComments(lnum - 1) 108071d4279SBram Moolenaar if getline(lnum) !~ '^\s*\(throws\|extends\|implements\)\>' 109071d4279SBram Moolenaar \ && getline(next_lnum) !~ ',\s*$' 110071d4279SBram Moolenaar break 111071d4279SBram Moolenaar endif 112071d4279SBram Moolenaar let lnum = prevnonblank(next_lnum) 113071d4279SBram Moolenaar endwhile 114071d4279SBram Moolenaar return indent(lnum) 115071d4279SBram Moolenaar endif 116071d4279SBram Moolenaar endif 117071d4279SBram Moolenaar 118071d4279SBram Moolenaar " Below a line starting with "}" never indent more. Needed for a method 119071d4279SBram Moolenaar " below a method with an indented "throws" clause. 120071d4279SBram Moolenaar let lnum = SkipJavaBlanksAndComments(v:lnum - 1) 121071d4279SBram Moolenaar if getline(lnum) =~ '^\s*}\s*\(//.*\|/\*.*\)\=$' && indent(lnum) < theIndent 122071d4279SBram Moolenaar let theIndent = indent(lnum) 123071d4279SBram Moolenaar endif 124071d4279SBram Moolenaar 125071d4279SBram Moolenaar return theIndent 126071d4279SBram Moolenaarendfunction 127071d4279SBram Moolenaar 128071d4279SBram Moolenaar" vi: sw=2 et 129