Install vim74
[msysgit.git] / share / vim / vim74 / indent / zimbu.vim
blob9565b10843a7381e6f14151fdf2e8a371bcaff3c
1 " Vim indent file
2 " Language:     Zimbu
3 " Maintainer:   Bram Moolenaar <Bram@vim.org>
4 " Last Change:  2012 Sep 08
6 " Only load this indent file when no other was loaded.
7 if exists("b:did_indent")
8    finish
9 endif
10 let b:did_indent = 1
12 setlocal ai nolisp nocin
13 setlocal indentexpr=GetZimbuIndent(v:lnum)
14 setlocal indentkeys=0{,0},!^F,o,O,0=ELSE,0=ELSEIF,0=CASE,0=DEFAULT,0=FINALLY
16 " We impose recommended defaults: no Tabs, 'shiftwidth' = 2
17 setlocal sw=2 et
19 let b:undo_indent = "setl et< sw< ai< indentkeys< indentexpr="
21 " Only define the function once.
22 if exists("*GetZimbuIndent")
23   finish
24 endif
26 let s:cpo_save = &cpo
27 set cpo&vim
29 " Come here when loading the script the first time.
31 let s:maxoff = 50       " maximum number of lines to look backwards for ()
33 func GetZimbuIndent(lnum)
34   let prevLnum = prevnonblank(a:lnum - 1)
35   if prevLnum == 0
36     " This is the first non-empty line, use zero indent.
37     return 0
38   endif
40   " Taken from Python indenting:
41   " If the previous line is inside parenthesis, use the indent of the starting
42   " line.
43   " Trick: use the non-existing "dummy" variable to break out of the loop when
44   " going too far back.
45   call cursor(prevLnum, 1)
46   let parlnum = searchpair('(\|{\|\[', '', ')\|}\|\]', 'nbW',
47           \ "line('.') < " . (prevLnum - s:maxoff) . " ? dummy :"
48           \ . " synIDattr(synID(line('.'), col('.'), 1), 'name')"
49           \ . " =~ '\\(Comment\\|String\\|Char\\)$'")
50   if parlnum > 0
51     let plindent = indent(parlnum)
52     let plnumstart = parlnum
53   else
54     let plindent = indent(prevLnum)
55     let plnumstart = prevLnum
56   endif
59   " When inside parenthesis: If at the first line below the parenthesis add
60   " two 'shiftwidth', otherwise same as previous line.
61   " i = (a
62   "       + b
63   "       + c)
64   call cursor(a:lnum, 1)
65   let p = searchpair('(\|{\|\[', '', ')\|}\|\]', 'bW',
66           \ "line('.') < " . (a:lnum - s:maxoff) . " ? dummy :"
67           \ . " synIDattr(synID(line('.'), col('.'), 1), 'name')"
68           \ . " =~ '\\(Comment\\|String\\|Char\\)$'")
69   if p > 0
70     if p == prevLnum
71       " When the start is inside parenthesis, only indent one 'shiftwidth'.
72       let pp = searchpair('(\|{\|\[', '', ')\|}\|\]', 'bW',
73           \ "line('.') < " . (a:lnum - s:maxoff) . " ? dummy :"
74           \ . " synIDattr(synID(line('.'), col('.'), 1), 'name')"
75           \ . " =~ '\\(Comment\\|String\\|Char\\)$'")
76       if pp > 0
77         return indent(prevLnum) + &sw
78       endif
79       return indent(prevLnum) + &sw * 2
80     endif
81     if plnumstart == p
82       return indent(prevLnum)
83     endif
84     return plindent
85   endif
87   let prevline = getline(prevLnum)
88   let thisline = getline(a:lnum)
90   " If this line is not a comment and the previous one is then move the
91   " previous line further back.
92   if thisline !~ '^\s*#'
93     while prevline =~ '^\s*#'
94       let prevLnum = prevnonblank(prevLnum - 1)
95       if prevLnum == 0
96         " Only comment lines before this, no indent
97         return 0
98       endif
99       let prevline = getline(prevLnum)
100       let plindent = indent(prevLnum)
101     endwhile
102   endif
104   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\)\>'
105     let plindent += &sw
106   endif
107   if thisline =~ '^\s*\(}\|ELSEIF\>\|ELSE\>\|CATCH\|FINALLY\|GENERATE_ELSEIF\>\|GENERATE_ELSE\>\|UNTIL\>\)'
108     let plindent -= &sw
109   endif
110   if thisline =~ '^\s*\(CASE\>\|DEFAULT\>\)' && prevline !~ '^\s*SWITCH\>'
111     let plindent -= &sw
112   endif
114   " line up continued comment that started after some code
115   "   String something   # comment comment
116   "                      # comment
117   if a:lnum == prevLnum + 1 && thisline =~ '^\s*#' && prevline !~ '^\s*#'
118     let n = match(prevline, '#')
119     if n > 1
120       let plindent = n
121     endif
122   endif
124   return plindent
125 endfunc
127 let &cpo = s:cpo_save
128 unlet s:cpo_save