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