blob: b0560b473d83f57864e298083ec6807ff90870b5 [file] [log] [blame]
Bram Moolenaar071d4272004-06-13 20:20:40 +00001" Vim indent file
Bram Moolenaar0dc065e2005-07-04 22:49:24 +00002" Language: CSS
3" Maintainer: Nikolai Weibull <nikolai+work.vim@bitwi.se>
4" Latest Revision: 2005-06-30
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=GetCSSIndent()
Bram Moolenaar42eeac32005-06-29 22:40:58 +000012setlocal indentkeys=0{,0},!^F,o,O
Bram Moolenaar071d4272004-06-13 20:20:40 +000013
Bram Moolenaar071d4272004-06-13 20:20:40 +000014if exists("*GetCSSIndent")
15 finish
16endif
17
Bram Moolenaar0dc065e2005-07-04 22:49:24 +000018function s:prevnonblanknoncomment(lnum)
19 let lnum = a:lnum
20 while lnum > 1
21 let lnum = prevnonblank(lnum)
Bram Moolenaar42eeac32005-06-29 22:40:58 +000022 let line = getline(lnum)
Bram Moolenaar42eeac32005-06-29 22:40:58 +000023 if line =~ '\*/'
Bram Moolenaar0dc065e2005-07-04 22:49:24 +000024 while lnum > 1 && line !~ '/\*'
Bram Moolenaar42eeac32005-06-29 22:40:58 +000025 let lnum -= 1
Bram Moolenaar42eeac32005-06-29 22:40:58 +000026 endwhile
Bram Moolenaar0dc065e2005-07-04 22:49:24 +000027 if line =~ '^\s*/\*'
28 let lnum -= 1
29 else
30 break
31 endif
32 else
33 break
Bram Moolenaar42eeac32005-06-29 22:40:58 +000034 endif
Bram Moolenaar42eeac32005-06-29 22:40:58 +000035 endwhile
36 return lnum
Bram Moolenaar071d4272004-06-13 20:20:40 +000037endfunction
38
Bram Moolenaar0dc065e2005-07-04 22:49:24 +000039function s:count_braces(lnum, count_open)
40 let n_open = 0
41 let n_close = 0
42 let line = getline(a:lnum)
43 let pattern = '[{}]'
44 let i = match(line, pattern)
45 while i != -1
46 if synIDattr(synID(a:lnum, i + 1, 0), 'name') !~ 'css\%(Comment\|StringQ\{1,2}\)'
47 if line[i] == '{'
48 let n_open += 1
49 elseif line[i] == '}'
50 if n_open > 0
51 let n_open -= 1
52 else
53 let n_close += 1
54 endif
55 endif
56 endif
57 let i = match(line, pattern, i + 1)
58 endwhile
59 return a:count_open ? n_open : n_close
60endfunction
61
Bram Moolenaar071d4272004-06-13 20:20:40 +000062function GetCSSIndent()
Bram Moolenaar0dc065e2005-07-04 22:49:24 +000063 let line = getline(v:lnum)
64 if line =~ '^\s*\*'
65 return cindent(v:lnum)
66 elseif line =~ '^\s*}'
67 return indent(v:lnum) - &sw
68 endif
69
70 let pnum = s:prevnonblanknoncomment(v:lnum - 1)
71 if pnum == 0
Bram Moolenaar071d4272004-06-13 20:20:40 +000072 return 0
73 endif
74
Bram Moolenaar0dc065e2005-07-04 22:49:24 +000075 let ind = indent(pnum) + s:count_braces(pnum, 1) * &sw
Bram Moolenaar071d4272004-06-13 20:20:40 +000076
Bram Moolenaar0dc065e2005-07-04 22:49:24 +000077 let pline = getline(pnum)
78 if pline =~ '}\s*$'
79 let ind -= (s:count_braces(pnum, 0) - (pline =~ '^\s*}' ? 1 : 0)) * &sw
Bram Moolenaar071d4272004-06-13 20:20:40 +000080 endif
81
82 return ind
83endfunction