blob: 793f05820f750894220b565ac9881bdb13ee3339 [file] [log] [blame]
Bram Moolenaar071d4272004-06-13 20:20:40 +00001" Vim indent file
Bram Moolenaar6e649222021-10-04 21:32:54 +01002" Language: CSS
3" Maintainer: Doug Kearns <dougkearns@gmail.com>
4" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
5" Last Change: 24 Sep 2021
6
7" Use of shiftwidth() added by Oleg Zubchenko.
Bram Moolenaar071d4272004-06-13 20:20:40 +00008
Bram Moolenaar071d4272004-06-13 20:20:40 +00009if exists("b:did_indent")
10 finish
11endif
Bram Moolenaar071d4272004-06-13 20:20:40 +000012let b:did_indent = 1
13
14setlocal indentexpr=GetCSSIndent()
Bram Moolenaar42eeac32005-06-29 22:40:58 +000015setlocal indentkeys=0{,0},!^F,o,O
Bram Moolenaarf1dc4962007-05-10 16:50:23 +000016setlocal nosmartindent
Bram Moolenaar071d4272004-06-13 20:20:40 +000017
Bram Moolenaar6e649222021-10-04 21:32:54 +010018let b:undo_indent = "setl inde< indk< si<"
Bram Moolenaarc8734422012-06-01 22:38:45 +020019
Bram Moolenaar071d4272004-06-13 20:20:40 +000020if exists("*GetCSSIndent")
21 finish
22endif
Bram Moolenaar8e52a592012-05-18 21:49:28 +020023let s:keepcpo= &cpo
24set cpo&vim
Bram Moolenaar071d4272004-06-13 20:20:40 +000025
Bram Moolenaar0dc065e2005-07-04 22:49:24 +000026function s:prevnonblanknoncomment(lnum)
27 let lnum = a:lnum
28 while lnum > 1
29 let lnum = prevnonblank(lnum)
Bram Moolenaar42eeac32005-06-29 22:40:58 +000030 let line = getline(lnum)
Bram Moolenaar42eeac32005-06-29 22:40:58 +000031 if line =~ '\*/'
Bram Moolenaar0dc065e2005-07-04 22:49:24 +000032 while lnum > 1 && line !~ '/\*'
Bram Moolenaarf1dc4962007-05-10 16:50:23 +000033 let lnum -= 1
Bram Moolenaar42eeac32005-06-29 22:40:58 +000034 endwhile
Bram Moolenaar0dc065e2005-07-04 22:49:24 +000035 if line =~ '^\s*/\*'
Bram Moolenaarf1dc4962007-05-10 16:50:23 +000036 let lnum -= 1
Bram Moolenaar0dc065e2005-07-04 22:49:24 +000037 else
Bram Moolenaarf1dc4962007-05-10 16:50:23 +000038 break
Bram Moolenaar0dc065e2005-07-04 22:49:24 +000039 endif
40 else
41 break
Bram Moolenaar42eeac32005-06-29 22:40:58 +000042 endif
Bram Moolenaar42eeac32005-06-29 22:40:58 +000043 endwhile
44 return lnum
Bram Moolenaar071d4272004-06-13 20:20:40 +000045endfunction
46
Bram Moolenaar0dc065e2005-07-04 22:49:24 +000047function s:count_braces(lnum, count_open)
48 let n_open = 0
49 let n_close = 0
50 let line = getline(a:lnum)
51 let pattern = '[{}]'
52 let i = match(line, pattern)
53 while i != -1
54 if synIDattr(synID(a:lnum, i + 1, 0), 'name') !~ 'css\%(Comment\|StringQ\{1,2}\)'
55 if line[i] == '{'
Bram Moolenaarf1dc4962007-05-10 16:50:23 +000056 let n_open += 1
Bram Moolenaar0dc065e2005-07-04 22:49:24 +000057 elseif line[i] == '}'
Bram Moolenaarf1dc4962007-05-10 16:50:23 +000058 if n_open > 0
59 let n_open -= 1
60 else
61 let n_close += 1
62 endif
Bram Moolenaar0dc065e2005-07-04 22:49:24 +000063 endif
64 endif
65 let i = match(line, pattern, i + 1)
66 endwhile
67 return a:count_open ? n_open : n_close
68endfunction
69
Bram Moolenaar071d4272004-06-13 20:20:40 +000070function GetCSSIndent()
Bram Moolenaar0dc065e2005-07-04 22:49:24 +000071 let line = getline(v:lnum)
72 if line =~ '^\s*\*'
73 return cindent(v:lnum)
Bram Moolenaar0dc065e2005-07-04 22:49:24 +000074 endif
75
76 let pnum = s:prevnonblanknoncomment(v:lnum - 1)
77 if pnum == 0
Bram Moolenaar071d4272004-06-13 20:20:40 +000078 return 0
79 endif
80
Bram Moolenaar214641f2017-03-05 17:04:09 +010081 return indent(pnum) + s:count_braces(pnum, 1) * shiftwidth()
82 \ - s:count_braces(v:lnum, 0) * shiftwidth()
Bram Moolenaar071d4272004-06-13 20:20:40 +000083endfunction
Bram Moolenaar8e52a592012-05-18 21:49:28 +020084
85let &cpo = s:keepcpo
86unlet s:keepcpo