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