diff options
| author | Jérémy Zurcher <jeremy@asynk.ch> | 2013-03-28 22:24:33 +0100 | 
|---|---|---|
| committer | Jérémy Zurcher <jeremy@asynk.ch> | 2013-03-28 22:24:33 +0100 | 
| commit | 422b0f447db959233eed6669d81b94aeac214a9e (patch) | |
| tree | 86b10bc2fda17b53c3f1db45470352d03245dd57 /indent/scala.vim | |
| parent | 5012343b48dad8a68de6d0610cb77f9b12667b2c (diff) | |
| download | vim-422b0f447db959233eed6669d81b94aeac214a9e.zip vim-422b0f447db959233eed6669d81b94aeac214a9e.tar.gz | |
add indent/scala.vim
Diffstat (limited to 'indent/scala.vim')
| -rw-r--r-- | indent/scala.vim | 85 | 
1 files changed, 85 insertions, 0 deletions
| diff --git a/indent/scala.vim b/indent/scala.vim new file mode 100644 index 0000000..c3e7c91 --- /dev/null +++ b/indent/scala.vim @@ -0,0 +1,85 @@ +" Vim indent file +" Language   : Scala (http://scala-lang.org/) +" Maintainer : Stefan Matthias Aust +" Last Change: 2006 Apr 13 + +if exists("b:did_indent") +  finish +endif +let b:did_indent = 1 + +setlocal indentexpr=GetScalaIndent() + +setlocal indentkeys=0{,0},0),!^F,<>>,<CR> + +setlocal autoindent shiftwidth=2 tabstop=2 softtabstop=2 expandtab + +if exists("*GetScalaIndent") +  finish +endif + +function! CountParens(line) +  let line = substitute(a:line, '"\(.\|\\"\)*"', '', 'g') +  let open = substitute(line, '[^(]', '', 'g') +  let close = substitute(line, '[^)]', '', 'g') +  return strlen(open) - strlen(close) +endfunction + +function! GetScalaIndent() +  " Find a non-blank line above the current line. +  let lnum = prevnonblank(v:lnum - 1) + +  " Hit the start of the file, use zero indent. +  if lnum == 0 +    return 0 +  endif + +  let ind = indent(lnum) +  let prevline = getline(lnum) + +  "Indent html literals +  if prevline !~ '/>\s*$' && prevline =~ '^\s*<[a-zA-Z][^>]*>\s*$' +    return ind + &shiftwidth +  endif + +  " Add a 'shiftwidth' after lines that start a block +  " If if, for or while end with ), this is a one-line block +  " If val, var, def end with =, this is a one-line block +  if prevline =~ '^\s*\<\(\(else\s\+\)\?if\|for\|while\)\>.*[)]\s*$' +        \ || prevline =~ '^\s*\<\(\(va[lr]\|def\)\>.*[=]\s*$' +        \ || prevline =~ '^\s*\<else\>\s*$' +        \ || prevline =~ '{\s*$' +    let ind = ind + &shiftwidth +  endif + +  " If parenthesis are unbalanced, indent or dedent +  let c = CountParens(prevline) +  echo c +  if c > 0 +    let ind = ind + &shiftwidth +  elseif c < 0 +    let ind = ind - &shiftwidth +  endif +   +  " Dedent after if, for, while and val, var, def without block +  let pprevline = getline(prevnonblank(lnum - 1)) +  if pprevline =~ '^\s*\<\(\(else\s\+\)\?if\|for\|while\)\>.*[)]\s*$' +        \ || pprevline =~ '^\s*\<\(\va[lr]\|def\)\>.*[=]\s*$' +        \ || pprevline =~ '^\s*\<else\>\s*$' +    let ind = ind - &shiftwidth +  endif + +  " Align 'for' clauses nicely +  if prevline =~ '^\s*\<for\> (.*;\s*$' +    let ind = ind - &shiftwidth + 5 +  endif + +  " Subtract a 'shiftwidth' on '}' or html +  let thisline = getline(v:lnum) +  if thisline =~ '^\s*[})]'  +        \ || thisline =~ '^\s*</[a-zA-Z][^>]*>' +    let ind = ind - &shiftwidth +  endif + +  return ind +endfunction | 
