forked from aniani/vim
		
	
		
			
				
	
	
		
			129 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			VimL
		
	
	
	
	
	
			
		
		
	
	
			129 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			VimL
		
	
	
	
	
	
" 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
 |