diff options
Diffstat (limited to 'indent/zimbu.vim')
| -rw-r--r-- | indent/zimbu.vim | 132 | 
1 files changed, 132 insertions, 0 deletions
| diff --git a/indent/zimbu.vim b/indent/zimbu.vim new file mode 100644 index 00000000..85883ca7 --- /dev/null +++ b/indent/zimbu.vim @@ -0,0 +1,132 @@ +if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'vim') == -1 +   +" Vim indent file +" Language:	Zimbu +" Maintainer:	Bram Moolenaar <Bram@vim.org> +" Last Change:	2016 Jan 25 + +" Only load this indent file when no other was loaded. +if exists("b:did_indent") +   finish +endif +let b:did_indent = 1 + +setlocal ai nolisp nocin +setlocal indentexpr=GetZimbuIndent(v:lnum) +setlocal indentkeys=0{,0},!^F,o,O,0=ELSE,0=ELSEIF,0=CASE,0=DEFAULT,0=FINALLY + +" We impose recommended defaults: no Tabs, 'shiftwidth' = 2 +setlocal sw=2 et + +let b:undo_indent = "setl et< sw< ai< indentkeys< indentexpr=" + +" Only define the function once. +if exists("*GetZimbuIndent") +  finish +endif + +let s:cpo_save = &cpo +set cpo&vim + +" Come here when loading the script the first time. + +let s:maxoff = 50	" maximum number of lines to look backwards for () + +func GetZimbuIndent(lnum) +  let prevLnum = prevnonblank(a:lnum - 1) +  if prevLnum == 0 +    " This is the first non-empty line, use zero indent. +    return 0 +  endif + +  " Taken from Python indenting: +  " If the previous line is inside parenthesis, use the indent of the starting +  " line. +  " Trick: use the non-existing "dummy" variable to break out of the loop when +  " going too far back. +  call cursor(prevLnum, 1) +  let parlnum = searchpair('(\|{\|\[', '', ')\|}\|\]', 'nbW', +	  \ "line('.') < " . (prevLnum - s:maxoff) . " ? dummy :" +	  \ . " synIDattr(synID(line('.'), col('.'), 1), 'name')" +	  \ . " =~ '\\(Comment\\|String\\|Char\\)$'") +  if parlnum > 0 +    let plindent = indent(parlnum) +    let plnumstart = parlnum +  else +    let plindent = indent(prevLnum) +    let plnumstart = prevLnum +  endif + + +  " When inside parenthesis: If at the first line below the parenthesis add +  " two 'shiftwidth', otherwise same as previous line. +  " i = (a +  "       + b +  "       + c) +  call cursor(a:lnum, 1) +  let p = searchpair('(\|{\|\[', '', ')\|}\|\]', 'bW', +	  \ "line('.') < " . (a:lnum - s:maxoff) . " ? dummy :" +	  \ . " synIDattr(synID(line('.'), col('.'), 1), 'name')" +	  \ . " =~ '\\(Comment\\|String\\|Char\\)$'") +  if p > 0 +    if p == prevLnum +      " When the start is inside parenthesis, only indent one 'shiftwidth'. +      let pp = searchpair('(\|{\|\[', '', ')\|}\|\]', 'bW', +	  \ "line('.') < " . (a:lnum - s:maxoff) . " ? dummy :" +	  \ . " synIDattr(synID(line('.'), col('.'), 1), 'name')" +	  \ . " =~ '\\(Comment\\|String\\|Char\\)$'") +      if pp > 0 +	return indent(prevLnum) + shiftwidth() +      endif +      return indent(prevLnum) + shiftwidth() * 2 +    endif +    if plnumstart == p +      return indent(prevLnum) +    endif +    return plindent +  endif + +  let prevline = getline(prevLnum) +  let thisline = getline(a:lnum) + +  " If this line is not a comment and the previous one is then move the +  " previous line further back. +  if thisline !~ '^\s*#' +    while prevline =~ '^\s*#' +      let prevLnum = prevnonblank(prevLnum - 1) +      if prevLnum == 0 +	" Only comment lines before this, no indent +	return 0 +      endif +      let prevline = getline(prevLnum) +      let plindent = indent(prevLnum) +    endwhile +  endif + +  if prevline =~ '^\s*\(IF\|\|ELSEIF\|ELSE\|GENERATE_IF\|\|GENERATE_ELSEIF\|GENERATE_ELSE\|WHILE\|REPEAT\|TRY\|CATCH\|FINALLY\|FOR\|DO\|SWITCH\|CASE\|DEFAULT\|FUNC\|VIRTUAL\|ABSTRACT\|DEFINE\|REPLACE\|FINAL\|PROC\|MAIN\|NEW\|ENUM\|CLASS\|INTERFACE\|BITS\|MODULE\|SHARED\)\>' +    let plindent += shiftwidth() +  endif +  if thisline =~ '^\s*\(}\|ELSEIF\>\|ELSE\>\|CATCH\|FINALLY\|GENERATE_ELSEIF\>\|GENERATE_ELSE\>\|UNTIL\>\)' +    let plindent -= shiftwidth() +  endif +  if thisline =~ '^\s*\(CASE\>\|DEFAULT\>\)' && prevline !~ '^\s*SWITCH\>' +    let plindent -= shiftwidth() +  endif + +  " line up continued comment that started after some code +  "   String something   # comment comment +  "                      # comment +  if a:lnum == prevLnum + 1 && thisline =~ '^\s*#' && prevline !~ '^\s*#' +    let n = match(prevline, '#') +    if n > 1 +      let plindent = n +    endif +  endif + +  return plindent +endfunc + +let &cpo = s:cpo_save +unlet s:cpo_save + +endif | 
