blob: 4d15b8d2dc84aa1e9f5a74ab13ca23763c19c1f4 [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 Moolenaar214641f2017-03-05 17:04:09 +01005" Use of shiftwidth() added by Oleg Zubchenko.
Bram Moolenaar071d4272004-06-13 20:20:40 +00006
Bram Moolenaar071d4272004-06-13 20:20:40 +00007if exists("b:did_indent")
8 finish
9endif
Bram Moolenaar071d4272004-06-13 20:20:40 +000010let b:did_indent = 1
11
12setlocal indentexpr=GetCSSIndent()
Bram Moolenaar42eeac32005-06-29 22:40:58 +000013setlocal indentkeys=0{,0},!^F,o,O
Bram Moolenaarf1dc4962007-05-10 16:50:23 +000014setlocal nosmartindent
Bram Moolenaar071d4272004-06-13 20:20:40 +000015
Bram Moolenaarc8734422012-06-01 22:38:45 +020016let b:undo_indent = "setl smartindent< indentkeys< indentexpr<"
17
Bram Moolenaar071d4272004-06-13 20:20:40 +000018if exists("*GetCSSIndent")
19 finish
20endif
Bram Moolenaar8e52a592012-05-18 21:49:28 +020021let s:keepcpo= &cpo
22set cpo&vim
Bram Moolenaar071d4272004-06-13 20:20:40 +000023
Bram Moolenaar0dc065e2005-07-04 22:49:24 +000024function s:prevnonblanknoncomment(lnum)
25 let lnum = a:lnum
26 while lnum > 1
27 let lnum = prevnonblank(lnum)
Bram Moolenaar42eeac32005-06-29 22:40:58 +000028 let line = getline(lnum)
Bram Moolenaar42eeac32005-06-29 22:40:58 +000029 if line =~ '\*/'
Bram Moolenaar0dc065e2005-07-04 22:49:24 +000030 while lnum > 1 && line !~ '/\*'
Bram Moolenaarf1dc4962007-05-10 16:50:23 +000031 let lnum -= 1
Bram Moolenaar42eeac32005-06-29 22:40:58 +000032 endwhile
Bram Moolenaar0dc065e2005-07-04 22:49:24 +000033 if line =~ '^\s*/\*'
Bram Moolenaarf1dc4962007-05-10 16:50:23 +000034 let lnum -= 1
Bram Moolenaar0dc065e2005-07-04 22:49:24 +000035 else
Bram Moolenaarf1dc4962007-05-10 16:50:23 +000036 break
Bram Moolenaar0dc065e2005-07-04 22:49:24 +000037 endif
38 else
39 break
Bram Moolenaar42eeac32005-06-29 22:40:58 +000040 endif
Bram Moolenaar42eeac32005-06-29 22:40:58 +000041 endwhile
42 return lnum
Bram Moolenaar071d4272004-06-13 20:20:40 +000043endfunction
44
Bram Moolenaar0dc065e2005-07-04 22:49:24 +000045function s:count_braces(lnum, count_open)
46 let n_open = 0
47 let n_close = 0
48 let line = getline(a:lnum)
49 let pattern = '[{}]'
50 let i = match(line, pattern)
51 while i != -1
52 if synIDattr(synID(a:lnum, i + 1, 0), 'name') !~ 'css\%(Comment\|StringQ\{1,2}\)'
53 if line[i] == '{'
Bram Moolenaarf1dc4962007-05-10 16:50:23 +000054 let n_open += 1
Bram Moolenaar0dc065e2005-07-04 22:49:24 +000055 elseif line[i] == '}'
Bram Moolenaarf1dc4962007-05-10 16:50:23 +000056 if n_open > 0
57 let n_open -= 1
58 else
59 let n_close += 1
60 endif
Bram Moolenaar0dc065e2005-07-04 22:49:24 +000061 endif
62 endif
63 let i = match(line, pattern, i + 1)
64 endwhile
65 return a:count_open ? n_open : n_close
66endfunction
67
Bram Moolenaar071d4272004-06-13 20:20:40 +000068function GetCSSIndent()
Bram Moolenaar0dc065e2005-07-04 22:49:24 +000069 let line = getline(v:lnum)
70 if line =~ '^\s*\*'
71 return cindent(v:lnum)
Bram Moolenaar0dc065e2005-07-04 22:49:24 +000072 endif
73
74 let pnum = s:prevnonblanknoncomment(v:lnum - 1)
75 if pnum == 0
Bram Moolenaar071d4272004-06-13 20:20:40 +000076 return 0
77 endif
78
Bram Moolenaar214641f2017-03-05 17:04:09 +010079 return indent(pnum) + s:count_braces(pnum, 1) * shiftwidth()
80 \ - s:count_braces(v:lnum, 0) * shiftwidth()
Bram Moolenaar071d4272004-06-13 20:20:40 +000081endfunction
Bram Moolenaar8e52a592012-05-18 21:49:28 +020082
83let &cpo = s:keepcpo
84unlet s:keepcpo