blob: e9d61e43667567369f619ba98be6611a98096e85 [file] [log] [blame]
Bram Moolenaar071d4272004-06-13 20:20:40 +00001" Vim indent file
Bram Moolenaar0dc065e2005-07-04 22:49:24 +00002" Language: Tcl
Bram Moolenaar57657d82006-04-21 22:12:41 +00003" Maintainer: Nikolai Weibull <now@bitwi.se>
Bram Moolenaar2c7a7632007-05-10 18:19:11 +00004" Latest Revision: 2006-12-20
Bram Moolenaar071d4272004-06-13 20:20:40 +00005
Bram Moolenaar071d4272004-06-13 20:20:40 +00006if exists("b:did_indent")
7 finish
8endif
Bram Moolenaar071d4272004-06-13 20:20:40 +00009let b:did_indent = 1
10
11setlocal indentexpr=GetTclIndent()
Bram Moolenaar42eeac32005-06-29 22:40:58 +000012setlocal indentkeys=0{,0},!^F,o,O,0]
Bram Moolenaar2c7a7632007-05-10 18:19:11 +000013setlocal nosmartindent
Bram Moolenaar071d4272004-06-13 20:20:40 +000014
Bram Moolenaar071d4272004-06-13 20:20:40 +000015if exists("*GetTclIndent")
16 finish
17endif
18
Bram Moolenaar42eeac32005-06-29 22:40:58 +000019function s:prevnonblanknoncomment(lnum)
Bram Moolenaar071d4272004-06-13 20:20:40 +000020 let lnum = prevnonblank(a:lnum)
21 while lnum > 0
22 let line = getline(lnum)
23 if line !~ '^\s*\(#\|$\)'
24 break
25 endif
26 let lnum = prevnonblank(lnum - 1)
27 endwhile
28 return lnum
29endfunction
30
Bram Moolenaar42eeac32005-06-29 22:40:58 +000031function s:count_braces(lnum, count_open)
32 let n_open = 0
33 let n_close = 0
34 let line = getline(a:lnum)
Bram Moolenaar0dc065e2005-07-04 22:49:24 +000035 let pattern = '[{}]'
Bram Moolenaar42eeac32005-06-29 22:40:58 +000036 let i = match(line, pattern)
37 while i != -1
Bram Moolenaar0dc065e2005-07-04 22:49:24 +000038 if synIDattr(synID(a:lnum, i + 1, 0), 'name') !~ 'tcl\%(Comment\|String\)'
Bram Moolenaar42eeac32005-06-29 22:40:58 +000039 if line[i] == '{'
Bram Moolenaar2c7a7632007-05-10 18:19:11 +000040 let n_open += 1
Bram Moolenaar42eeac32005-06-29 22:40:58 +000041 elseif line[i] == '}'
Bram Moolenaar2c7a7632007-05-10 18:19:11 +000042 if n_open > 0
43 let n_open -= 1
44 else
45 let n_close += 1
46 endif
Bram Moolenaar42eeac32005-06-29 22:40:58 +000047 endif
48 endif
49 let i = match(line, pattern, i + 1)
50 endwhile
51 return a:count_open ? n_open : n_close
52endfunction
Bram Moolenaar071d4272004-06-13 20:20:40 +000053
Bram Moolenaar42eeac32005-06-29 22:40:58 +000054function GetTclIndent()
Bram Moolenaar0dc065e2005-07-04 22:49:24 +000055 let line = getline(v:lnum)
56 if line =~ '^\s*\*'
57 return cindent(v:lnum)
58 elseif line =~ '^\s*}'
Bram Moolenaar036986f2017-03-16 17:41:02 +010059 return indent(v:lnum) - shiftwidth()
Bram Moolenaar0dc065e2005-07-04 22:49:24 +000060 endif
61
Bram Moolenaar42eeac32005-06-29 22:40:58 +000062 let pnum = s:prevnonblanknoncomment(v:lnum - 1)
63 if pnum == 0
Bram Moolenaar071d4272004-06-13 20:20:40 +000064 return 0
65 endif
66
Bram Moolenaar036986f2017-03-16 17:41:02 +010067 let ind = indent(pnum) + s:count_braces(pnum, 1) * shiftwidth()
Bram Moolenaar0dc065e2005-07-04 22:49:24 +000068
69 let pline = getline(pnum)
70 if pline =~ '}\s*$'
Bram Moolenaar036986f2017-03-16 17:41:02 +010071 let ind -= (s:count_braces(pnum, 0) - (pline =~ '^\s*}' ? 1 : 0)) * shiftwidth()
Bram Moolenaar42eeac32005-06-29 22:40:58 +000072 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +000073
Bram Moolenaar0dc065e2005-07-04 22:49:24 +000074 return ind
Bram Moolenaar071d4272004-06-13 20:20:40 +000075endfunction