diff options
| author | Adam Stankiewicz <sheerun@sher.pl> | 2017-09-27 20:43:42 +0200 | 
|---|---|---|
| committer | Adam Stankiewicz <sheerun@sher.pl> | 2017-09-27 20:43:42 +0200 | 
| commit | 5b77877888162f4e415fe9a7b8c5e9fb5dfb6ee1 (patch) | |
| tree | 965ae5128797f3d42d78d02692e62d24a4596e19 /indent/pov.vim | |
| parent | 8148255ef1c416f414c3a78405eff08fe149d16e (diff) | |
| download | vim-polyglot-5b77877888162f4e415fe9a7b8c5e9fb5dfb6ee1.tar.gz vim-polyglot-5b77877888162f4e415fe9a7b8c5e9fb5dfb6ee1.zip | |
Add syntax files from upstream vim repository
Diffstat (limited to '')
| -rw-r--r-- | indent/pov.vim | 88 | 
1 files changed, 88 insertions, 0 deletions
| diff --git a/indent/pov.vim b/indent/pov.vim new file mode 100644 index 00000000..90f2cafb --- /dev/null +++ b/indent/pov.vim @@ -0,0 +1,88 @@ +if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'vim') == -1 +   +" Vim indent file +" Language: PoV-Ray Scene Description Language +" Maintainer: David Necas (Yeti) <yeti@physics.muni.cz> +" Last Change: 2017 Jun 13 +" URI: http://trific.ath.cx/Ftp/vim/indent/pov.vim + +" Only load this indent file when no other was loaded. +if exists("b:did_indent") +  finish +endif +let b:did_indent = 1 + +" Some preliminary settings. +setlocal nolisp " Make sure lisp indenting doesn't supersede us. + +setlocal indentexpr=GetPoVRayIndent() +setlocal indentkeys+==else,=end,0] + +" Only define the function once. +if exists("*GetPoVRayIndent") +  finish +endif + +" Counts matches of a regexp <rexp> in line number <line>. +" Doesn't count matches inside strings and comments (as defined by current +" syntax). +function! s:MatchCount(line, rexp) +  let str = getline(a:line) +  let i = 0 +  let n = 0 +  while i >= 0 +    let i = matchend(str, a:rexp, i) +    if i >= 0 && synIDattr(synID(a:line, i, 0), "name") !~? "string\|comment" +      let n = n + 1 +    endif +  endwhile +  return n +endfunction + +" The main function.  Returns indent amount. +function GetPoVRayIndent() +  " If we are inside a comment (may be nested in obscure ways), give up +  if synIDattr(synID(v:lnum, indent(v:lnum)+1, 0), "name") =~? "string\|comment" +    return -1 +  endif + +  " Search backwards for the frist non-empty, non-comment line. +  let plnum = prevnonblank(v:lnum - 1) +  let plind = indent(plnum) +  while plnum > 0 && synIDattr(synID(plnum, plind+1, 0), "name") =~? "comment" +    let plnum = prevnonblank(plnum - 1) +    let plind = indent(plnum) +  endwhile + +  " Start indenting from zero +  if plnum == 0 +    return 0 +  endif + +  " Analyse previous nonempty line. +  let chg = 0 +  let chg = chg + s:MatchCount(plnum, '[[{(]') +  let chg = chg + s:MatchCount(plnum, '#\s*\%(if\|ifdef\|ifndef\|switch\|while\|macro\|else\)\>') +  let chg = chg - s:MatchCount(plnum, '#\s*end\>') +  let chg = chg - s:MatchCount(plnum, '[]})]') +  " Dirty hack for people writing #if and #else on the same line. +  let chg = chg - s:MatchCount(plnum, '#\s*\%(if\|ifdef\|ifndef\|switch\)\>.*#\s*else\>') +  " When chg > 0, then we opened groups and we should indent more, but when +  " chg < 0, we closed groups and this already affected the previous line, +  " so we should not dedent.  And when everything else fails, scream. +  let chg = chg > 0 ? chg : 0 + +  " Analyse current line +  " FIXME: If we have to dedent, we should try to find the indentation of the +  " opening line. +  let cur = s:MatchCount(v:lnum, '^\s*\%(#\s*\%(end\|else\)\>\|[]})]\)') +  if cur > 0 +    let final = plind + (chg - cur) * shiftwidth() +  else +    let final = plind + chg * shiftwidth() +  endif + +  return final < 0 ? 0 : final +endfunction + +endif | 
