blob: d13c1ad48ca1e3ea934f45fabf5908ffa769d9cc [file] [log] [blame]
Bram Moolenaar071d4272004-06-13 20:20:40 +00001" Vim indent file
Bram Moolenaar0dc065e2005-07-04 22:49:24 +00002" Language: CSS
Bram Moolenaar57657d82006-04-21 22:12:41 +00003" Maintainer: Nikolai Weibull <now@bitwi.se>
Bram Moolenaarf1dc4962007-05-10 16:50:23 +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=GetCSSIndent()
Bram Moolenaar42eeac32005-06-29 22:40:58 +000012setlocal indentkeys=0{,0},!^F,o,O
Bram Moolenaarf1dc4962007-05-10 16:50:23 +000013setlocal nosmartindent
Bram Moolenaar071d4272004-06-13 20:20:40 +000014
Bram Moolenaar071d4272004-06-13 20:20:40 +000015if exists("*GetCSSIndent")
16 finish
17endif
18
Bram Moolenaar0dc065e2005-07-04 22:49:24 +000019function s:prevnonblanknoncomment(lnum)
20 let lnum = a:lnum
21 while lnum > 1
22 let lnum = prevnonblank(lnum)
Bram Moolenaar42eeac32005-06-29 22:40:58 +000023 let line = getline(lnum)
Bram Moolenaar42eeac32005-06-29 22:40:58 +000024 if line =~ '\*/'
Bram Moolenaar0dc065e2005-07-04 22:49:24 +000025 while lnum > 1 && line !~ '/\*'
Bram Moolenaarf1dc4962007-05-10 16:50:23 +000026 let lnum -= 1
Bram Moolenaar42eeac32005-06-29 22:40:58 +000027 endwhile
Bram Moolenaar0dc065e2005-07-04 22:49:24 +000028 if line =~ '^\s*/\*'
Bram Moolenaarf1dc4962007-05-10 16:50:23 +000029 let lnum -= 1
Bram Moolenaar0dc065e2005-07-04 22:49:24 +000030 else
Bram Moolenaarf1dc4962007-05-10 16:50:23 +000031 break
Bram Moolenaar0dc065e2005-07-04 22:49:24 +000032 endif
33 else
34 break
Bram Moolenaar42eeac32005-06-29 22:40:58 +000035 endif
Bram Moolenaar42eeac32005-06-29 22:40:58 +000036 endwhile
37 return lnum
Bram Moolenaar071d4272004-06-13 20:20:40 +000038endfunction
39
Bram Moolenaar0dc065e2005-07-04 22:49:24 +000040function s:count_braces(lnum, count_open)
41 let n_open = 0
42 let n_close = 0
43 let line = getline(a:lnum)
44 let pattern = '[{}]'
45 let i = match(line, pattern)
46 while i != -1
47 if synIDattr(synID(a:lnum, i + 1, 0), 'name') !~ 'css\%(Comment\|StringQ\{1,2}\)'
48 if line[i] == '{'
Bram Moolenaarf1dc4962007-05-10 16:50:23 +000049 let n_open += 1
Bram Moolenaar0dc065e2005-07-04 22:49:24 +000050 elseif line[i] == '}'
Bram Moolenaarf1dc4962007-05-10 16:50:23 +000051 if n_open > 0
52 let n_open -= 1
53 else
54 let n_close += 1
55 endif
Bram Moolenaar0dc065e2005-07-04 22:49:24 +000056 endif
57 endif
58 let i = match(line, pattern, i + 1)
59 endwhile
60 return a:count_open ? n_open : n_close
61endfunction
62
Bram Moolenaar071d4272004-06-13 20:20:40 +000063function GetCSSIndent()
Bram Moolenaar0dc065e2005-07-04 22:49:24 +000064 let line = getline(v:lnum)
65 if line =~ '^\s*\*'
66 return cindent(v:lnum)
67 elseif line =~ '^\s*}'
68 return indent(v:lnum) - &sw
69 endif
70
71 let pnum = s:prevnonblanknoncomment(v:lnum - 1)
72 if pnum == 0
Bram Moolenaar071d4272004-06-13 20:20:40 +000073 return 0
74 endif
75
Bram Moolenaar0dc065e2005-07-04 22:49:24 +000076 let ind = indent(pnum) + s:count_braces(pnum, 1) * &sw
Bram Moolenaar071d4272004-06-13 20:20:40 +000077
Bram Moolenaar0dc065e2005-07-04 22:49:24 +000078 let pline = getline(pnum)
79 if pline =~ '}\s*$'
80 let ind -= (s:count_braces(pnum, 0) - (pline =~ '^\s*}' ? 1 : 0)) * &sw
Bram Moolenaar071d4272004-06-13 20:20:40 +000081 endif
82
83 return ind
84endfunction