Merge branch 'vim-runtime'
[vim_mainline.git] / runtime / indent / config.vim
blob7eb16575729e7f34257715630d06226338dd67e3
1 " Vim indent file
2 " Language:         Autoconf configure.{ac,in} file
3 " Maintainer:       Nikolai Weibull <now@bitwi.se>
4 " Latest Revision:  2006-12-20
5 " TODO:             how about nested [()]'s in one line
6 "                   what's wrong with '\\\@!'?
8 " Only load this indent file when no other was loaded.
9 if exists("b:did_indent")
10   finish
11 endif
13 runtime! indent/sh.vim          " will set b:did_indent
15 setlocal indentexpr=GetConfigIndent()
16 setlocal indentkeys=!^F,o,O,=then,=do,=else,=elif,=esac,=fi,=fin,=fil,=done
17 setlocal nosmartindent
19 " Only define the function once.
20 if exists("*GetConfigIndent")
21   finish
22 endif
24 " get the offset (indent) of the end of the match of 'regexp' in 'line'
25 function s:GetOffsetOf(line, regexp)
26   let end = matchend(a:line, a:regexp)
27   let width = 0
28   let i = 0
29   while i < end
30     if a:line[i] != "\t"
31       let width = width + 1
32     else
33       let width = width + &ts - (width % &ts)
34     endif
35     let i = i + 1
36   endwhile
37   return width
38 endfunction
40 function GetConfigIndent()
41   " Find a non-blank line above the current line.
42   let lnum = prevnonblank(v:lnum - 1)
44   " Hit the start of the file, use zero indent.
45   if lnum == 0
46     return 0
47   endif
49   " where to put this
50   let ind = GetShIndent()
51   let line = getline(lnum)
53   " if previous line has unmatched, unescaped opening parentheses,
54   " indent to its position. TODO: not failsafe if multiple ('s
55   if line =~ '\\\@<!([^)]*$'
56     let ind = s:GetOffsetOf(line, '\\\@!(')
57   endif
59   " if previous line has unmatched opening bracket,
60   " indent to its position. TODO: same as above
61   if line =~ '\[[^]]*$'
62     let ind = s:GetOffsetOf(line, '\[')
63   endif
65   " if previous line had an unmatched closing parantheses,
66   " indent to the matching opening parantheses
67   if line =~ '[^(]\+\\\@<!)$'
68     call search(')', 'bW')
69     let lnum = searchpair('\\\@<!(', '', ')', 'bWn')
70     let ind = indent(lnum)
71   endif
73   " if previous line had an unmatched closing bracket,
74   " indent to the matching opening bracket
75   if line =~ '[^[]\+]$'
76     call search(']', 'bW')
77     let lnum = searchpair('\[', '', ']', 'bWn')
78     let ind = indent(lnum)
79   endif
81   return ind
82 endfunction