blob: f0a272eff9d232bac02c915c1cd6a54c7f3c3fcf [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 Moolenaarc8734422012-06-01 22:38:45 +02004" Latest Revision: 2012-05-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 Moolenaarf1dc4962007-05-10 16:50:23 +000013setlocal nosmartindent
Bram Moolenaar071d4272004-06-13 20:20:40 +000014
Bram Moolenaarc8734422012-06-01 22:38:45 +020015let b:undo_indent = "setl smartindent< indentkeys< indentexpr<"
16
Bram Moolenaar071d4272004-06-13 20:20:40 +000017if exists("*GetCSSIndent")
18 finish
19endif
Bram Moolenaar8e52a592012-05-18 21:49:28 +020020let s:keepcpo= &cpo
21set cpo&vim
Bram Moolenaar071d4272004-06-13 20:20:40 +000022
Bram Moolenaar0dc065e2005-07-04 22:49:24 +000023function s:prevnonblanknoncomment(lnum)
24 let lnum = a:lnum
25 while lnum > 1
26 let lnum = prevnonblank(lnum)
Bram Moolenaar42eeac32005-06-29 22:40:58 +000027 let line = getline(lnum)
Bram Moolenaar42eeac32005-06-29 22:40:58 +000028 if line =~ '\*/'
Bram Moolenaar0dc065e2005-07-04 22:49:24 +000029 while lnum > 1 && line !~ '/\*'
Bram Moolenaarf1dc4962007-05-10 16:50:23 +000030 let lnum -= 1
Bram Moolenaar42eeac32005-06-29 22:40:58 +000031 endwhile
Bram Moolenaar0dc065e2005-07-04 22:49:24 +000032 if line =~ '^\s*/\*'
Bram Moolenaarf1dc4962007-05-10 16:50:23 +000033 let lnum -= 1
Bram Moolenaar0dc065e2005-07-04 22:49:24 +000034 else
Bram Moolenaarf1dc4962007-05-10 16:50:23 +000035 break
Bram Moolenaar0dc065e2005-07-04 22:49:24 +000036 endif
37 else
38 break
Bram Moolenaar42eeac32005-06-29 22:40:58 +000039 endif
Bram Moolenaar42eeac32005-06-29 22:40:58 +000040 endwhile
41 return lnum
Bram Moolenaar071d4272004-06-13 20:20:40 +000042endfunction
43
Bram Moolenaar0dc065e2005-07-04 22:49:24 +000044function s:count_braces(lnum, count_open)
45 let n_open = 0
46 let n_close = 0
47 let line = getline(a:lnum)
48 let pattern = '[{}]'
49 let i = match(line, pattern)
50 while i != -1
51 if synIDattr(synID(a:lnum, i + 1, 0), 'name') !~ 'css\%(Comment\|StringQ\{1,2}\)'
52 if line[i] == '{'
Bram Moolenaarf1dc4962007-05-10 16:50:23 +000053 let n_open += 1
Bram Moolenaar0dc065e2005-07-04 22:49:24 +000054 elseif line[i] == '}'
Bram Moolenaarf1dc4962007-05-10 16:50:23 +000055 if n_open > 0
56 let n_open -= 1
57 else
58 let n_close += 1
59 endif
Bram Moolenaar0dc065e2005-07-04 22:49:24 +000060 endif
61 endif
62 let i = match(line, pattern, i + 1)
63 endwhile
64 return a:count_open ? n_open : n_close
65endfunction
66
Bram Moolenaar071d4272004-06-13 20:20:40 +000067function GetCSSIndent()
Bram Moolenaar0dc065e2005-07-04 22:49:24 +000068 let line = getline(v:lnum)
69 if line =~ '^\s*\*'
70 return cindent(v:lnum)
Bram Moolenaar0dc065e2005-07-04 22:49:24 +000071 endif
72
73 let pnum = s:prevnonblanknoncomment(v:lnum - 1)
74 if pnum == 0
Bram Moolenaar071d4272004-06-13 20:20:40 +000075 return 0
76 endif
77
Bram Moolenaard58e9292011-02-09 17:07:58 +010078 return indent(pnum) + s:count_braces(pnum, 1) * &sw
79 \ - s:count_braces(v:lnum, 0) * &sw
Bram Moolenaar071d4272004-06-13 20:20:40 +000080endfunction
Bram Moolenaar8e52a592012-05-18 21:49:28 +020081
82let &cpo = s:keepcpo
83unlet s:keepcpo