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 '\\\@!'?
7
8" Only load this indent file when no other was loaded.
9if exists("b:did_indent")
10  finish
11endif
12
13runtime! indent/sh.vim          " will set b:did_indent
14
15setlocal indentexpr=GetConfigIndent()
16setlocal indentkeys=!^F,o,O,=then,=do,=else,=elif,=esac,=fi,=fin,=fil,=done
17setlocal nosmartindent
18
19" Only define the function once.
20if exists("*GetConfigIndent")
21  finish
22endif
23
24" get the offset (indent) of the end of the match of 'regexp' in 'line'
25function 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
38endfunction
39
40function GetConfigIndent()
41  " Find a non-blank line above the current line.
42  let lnum = prevnonblank(v:lnum - 1)
43
44  " Hit the start of the file, use zero indent.
45  if lnum == 0
46    return 0
47  endif
48
49  " where to put this
50  let ind = GetShIndent()
51  let line = getline(lnum)
52
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
58
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
64
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
72
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
80
81  return ind
82endfunction
83