diff runtime/indent/java.vim @ 7:3fc0f57ecb91 v7.0001

updated for version 7.0001
author vimboss
date Sun, 13 Jun 2004 20:20:40 +0000
parents
children 404aac550f35
line wrap: on
line diff
new file mode 100644
--- /dev/null
+++ b/runtime/indent/java.vim
@@ -0,0 +1,128 @@
+" Vim indent file
+" Language:	Java
+" Maintainer:	Toby Allsopp <toby.allsopp@peace.com>
+" Last Change:	2003 Oct 21
+
+" Only load this indent file when no other was loaded.
+if exists("b:did_indent")
+  finish
+endif
+let b:did_indent = 1
+
+" Indent Java anonymous classes correctly.
+setlocal cinoptions& cinoptions+=j1
+
+" The "extends" and "implements" lines start off with the wrong indent.
+setlocal indentkeys& indentkeys+=0=extends indentkeys+=0=implements
+
+" Set the function to do the work.
+setlocal indentexpr=GetJavaIndent()
+
+" Only define the function once.
+if exists("*GetJavaIndent")
+  finish
+endif
+
+function! SkipJavaBlanksAndComments(startline)
+  let lnum = a:startline
+  while lnum > 1
+    let lnum = prevnonblank(lnum)
+    if getline(lnum) =~ '\*/\s*$'
+      while getline(lnum) !~ '/\*' && lnum > 1
+        let lnum = lnum - 1
+      endwhile
+      if getline(lnum) =~ '^\s*/\*'
+        let lnum = lnum - 1
+      else
+        break
+      endif
+    elseif getline(lnum) =~ '^\s*//'
+      let lnum = lnum - 1
+    else
+      break
+    endif
+  endwhile
+  return lnum
+endfunction
+
+function GetJavaIndent()
+
+  " Java is just like C; use the built-in C indenting and then correct a few
+  " specific cases.
+  let theIndent = cindent(v:lnum)
+
+  " If we're in the middle of a comment then just trust cindent
+  if getline(v:lnum) =~ '^\s*\*'
+    return theIndent
+  endif
+
+  " find start of previous line, in case it was a continuation line
+  let lnum = SkipJavaBlanksAndComments(v:lnum - 1)
+  let prev = lnum
+  while prev > 1
+    let next_prev = SkipJavaBlanksAndComments(prev - 1)
+    if getline(next_prev) !~ ',\s*$'
+      break
+    endif
+    let prev = next_prev
+  endwhile
+
+  " Try to align "throws" lines for methods and "extends" and "implements" for
+  " classes.
+  if getline(v:lnum) =~ '^\s*\(extends\|implements\)\>'
+        \ && getline(lnum) !~ '^\s*\(extends\|implements\)\>'
+    let theIndent = theIndent + &sw
+  endif
+
+  " correct for continuation lines of "throws", "implements" and "extends"
+  let cont_kw = matchstr(getline(prev),
+        \ '^\s*\zs\(throws\|implements\|extends\)\>\ze.*,\s*$')
+  if strlen(cont_kw) > 0
+    let amount = strlen(cont_kw) + 1
+    if getline(lnum) !~ ',\s*$'
+      let theIndent = theIndent - (amount + &sw)
+      if theIndent < 0
+        let theIndent = 0
+      endif
+    elseif prev == lnum
+      let theIndent = theIndent + amount
+      if cont_kw ==# 'throws'
+        let theIndent = theIndent + &sw
+      endif
+    endif
+  elseif getline(prev) =~ '^\s*\(throws\|implements\|extends\)\>'
+        \ && (getline(prev) =~ '{\s*$'
+        \  || getline(v:lnum) =~ '^\s*{\s*$')
+    let theIndent = theIndent - &sw
+  endif
+
+  " When the line starts with a }, try aligning it with the matching {,
+  " skipping over "throws", "extends" and "implements" clauses.
+  if getline(v:lnum) =~ '^\s*}\s*\(//.*\|/\*.*\)\=$'
+    call cursor(v:lnum, 1)
+    silent normal %
+    let lnum = line('.')
+    if lnum < v:lnum
+      while lnum > 1
+        let next_lnum = SkipJavaBlanksAndComments(lnum - 1)
+        if getline(lnum) !~ '^\s*\(throws\|extends\|implements\)\>'
+              \ && getline(next_lnum) !~ ',\s*$'
+          break
+        endif
+        let lnum = prevnonblank(next_lnum)
+      endwhile
+      return indent(lnum)
+    endif
+  endif
+
+  " Below a line starting with "}" never indent more.  Needed for a method
+  " below a method with an indented "throws" clause.
+  let lnum = SkipJavaBlanksAndComments(v:lnum - 1)
+  if getline(lnum) =~ '^\s*}\s*\(//.*\|/\*.*\)\=$' && indent(lnum) < theIndent
+    let theIndent = indent(lnum)
+  endif
+
+  return theIndent
+endfunction
+
+" vi: sw=2 et