blob: f85bb05acb5d30ea8e9a5b17afec4ec5d565e227 [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 Moolenaard58e9292011-02-09 17:07:58 +01004" Latest Revision: 2010-12-22
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
Bram Moolenaar8e52a592012-05-18 21:49:28 +020018let s:keepcpo= &cpo
19set cpo&vim
Bram Moolenaar071d4272004-06-13 20:20:40 +000020
Bram Moolenaar0dc065e2005-07-04 22:49:24 +000021function s:prevnonblanknoncomment(lnum)
22 let lnum = a:lnum
23 while lnum > 1
24 let lnum = prevnonblank(lnum)
Bram Moolenaar42eeac32005-06-29 22:40:58 +000025 let line = getline(lnum)
Bram Moolenaar42eeac32005-06-29 22:40:58 +000026 if line =~ '\*/'
Bram Moolenaar0dc065e2005-07-04 22:49:24 +000027 while lnum > 1 && line !~ '/\*'
Bram Moolenaarf1dc4962007-05-10 16:50:23 +000028 let lnum -= 1
Bram Moolenaar42eeac32005-06-29 22:40:58 +000029 endwhile
Bram Moolenaar0dc065e2005-07-04 22:49:24 +000030 if line =~ '^\s*/\*'
Bram Moolenaarf1dc4962007-05-10 16:50:23 +000031 let lnum -= 1
Bram Moolenaar0dc065e2005-07-04 22:49:24 +000032 else
Bram Moolenaarf1dc4962007-05-10 16:50:23 +000033 break
Bram Moolenaar0dc065e2005-07-04 22:49:24 +000034 endif
35 else
36 break
Bram Moolenaar42eeac32005-06-29 22:40:58 +000037 endif
Bram Moolenaar42eeac32005-06-29 22:40:58 +000038 endwhile
39 return lnum
Bram Moolenaar071d4272004-06-13 20:20:40 +000040endfunction
41
Bram Moolenaar0dc065e2005-07-04 22:49:24 +000042function s:count_braces(lnum, count_open)
43 let n_open = 0
44 let n_close = 0
45 let line = getline(a:lnum)
46 let pattern = '[{}]'
47 let i = match(line, pattern)
48 while i != -1
49 if synIDattr(synID(a:lnum, i + 1, 0), 'name') !~ 'css\%(Comment\|StringQ\{1,2}\)'
50 if line[i] == '{'
Bram Moolenaarf1dc4962007-05-10 16:50:23 +000051 let n_open += 1
Bram Moolenaar0dc065e2005-07-04 22:49:24 +000052 elseif line[i] == '}'
Bram Moolenaarf1dc4962007-05-10 16:50:23 +000053 if n_open > 0
54 let n_open -= 1
55 else
56 let n_close += 1
57 endif
Bram Moolenaar0dc065e2005-07-04 22:49:24 +000058 endif
59 endif
60 let i = match(line, pattern, i + 1)
61 endwhile
62 return a:count_open ? n_open : n_close
63endfunction
64
Bram Moolenaar071d4272004-06-13 20:20:40 +000065function GetCSSIndent()
Bram Moolenaar0dc065e2005-07-04 22:49:24 +000066 let line = getline(v:lnum)
67 if line =~ '^\s*\*'
68 return cindent(v:lnum)
Bram Moolenaar0dc065e2005-07-04 22:49:24 +000069 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 Moolenaard58e9292011-02-09 17:07:58 +010076 return indent(pnum) + s:count_braces(pnum, 1) * &sw
77 \ - s:count_braces(v:lnum, 0) * &sw
Bram Moolenaar071d4272004-06-13 20:20:40 +000078endfunction
Bram Moolenaar8e52a592012-05-18 21:49:28 +020079
80let &cpo = s:keepcpo
81unlet s:keepcpo