xref: /vim-8.2.3635/runtime/indent/css.vim (revision 6e649224)
1071d4279SBram Moolenaar" Vim indent file
2071d4279SBram Moolenaar" Language:		CSS
3*6e649224SBram Moolenaar" Maintainer:		Doug Kearns <[email protected]>
4*6e649224SBram Moolenaar" Previous Maintainer:	Nikolai Weibull <[email protected]>
5*6e649224SBram Moolenaar" Last Change:		24 Sep 2021
6*6e649224SBram Moolenaar
7214641f7SBram Moolenaar" Use of shiftwidth() added by Oleg Zubchenko.
8071d4279SBram Moolenaar
9071d4279SBram Moolenaarif exists("b:did_indent")
10071d4279SBram Moolenaar  finish
11071d4279SBram Moolenaarendif
12071d4279SBram Moolenaarlet b:did_indent = 1
13071d4279SBram Moolenaar
14071d4279SBram Moolenaarsetlocal indentexpr=GetCSSIndent()
1542eeac35SBram Moolenaarsetlocal indentkeys=0{,0},!^F,o,O
16f1dc4965SBram Moolenaarsetlocal nosmartindent
17071d4279SBram Moolenaar
18*6e649224SBram Moolenaarlet b:undo_indent = "setl inde< indk< si<"
19c873442bSBram Moolenaar
20071d4279SBram Moolenaarif exists("*GetCSSIndent")
21071d4279SBram Moolenaar  finish
22071d4279SBram Moolenaarendif
238e52a593SBram Moolenaarlet s:keepcpo= &cpo
248e52a593SBram Moolenaarset cpo&vim
25071d4279SBram Moolenaar
260dc065eeSBram Moolenaarfunction s:prevnonblanknoncomment(lnum)
270dc065eeSBram Moolenaar  let lnum = a:lnum
280dc065eeSBram Moolenaar  while lnum > 1
290dc065eeSBram Moolenaar    let lnum = prevnonblank(lnum)
30071d4279SBram Moolenaar    let line = getline(lnum)
31071d4279SBram Moolenaar    if line =~ '\*/'
320dc065eeSBram Moolenaar      while lnum > 1 && line !~ '/\*'
3342eeac35SBram Moolenaar        let lnum -= 1
34071d4279SBram Moolenaar      endwhile
350dc065eeSBram Moolenaar      if line =~ '^\s*/\*'
360dc065eeSBram Moolenaar        let lnum -= 1
370dc065eeSBram Moolenaar      else
380dc065eeSBram Moolenaar        break
39071d4279SBram Moolenaar      endif
400dc065eeSBram Moolenaar    else
410dc065eeSBram Moolenaar      break
420dc065eeSBram Moolenaar    endif
4342eeac35SBram Moolenaar  endwhile
4442eeac35SBram Moolenaar  return lnum
45071d4279SBram Moolenaarendfunction
46071d4279SBram Moolenaar
470dc065eeSBram Moolenaarfunction s:count_braces(lnum, count_open)
480dc065eeSBram Moolenaar  let n_open = 0
490dc065eeSBram Moolenaar  let n_close = 0
500dc065eeSBram Moolenaar  let line = getline(a:lnum)
510dc065eeSBram Moolenaar  let pattern = '[{}]'
520dc065eeSBram Moolenaar  let i = match(line, pattern)
530dc065eeSBram Moolenaar  while i != -1
540dc065eeSBram Moolenaar    if synIDattr(synID(a:lnum, i + 1, 0), 'name') !~ 'css\%(Comment\|StringQ\{1,2}\)'
550dc065eeSBram Moolenaar      if line[i] == '{'
560dc065eeSBram Moolenaar        let n_open += 1
570dc065eeSBram Moolenaar      elseif line[i] == '}'
580dc065eeSBram Moolenaar        if n_open > 0
590dc065eeSBram Moolenaar          let n_open -= 1
600dc065eeSBram Moolenaar        else
610dc065eeSBram Moolenaar          let n_close += 1
620dc065eeSBram Moolenaar        endif
630dc065eeSBram Moolenaar      endif
640dc065eeSBram Moolenaar    endif
650dc065eeSBram Moolenaar    let i = match(line, pattern, i + 1)
660dc065eeSBram Moolenaar  endwhile
670dc065eeSBram Moolenaar  return a:count_open ? n_open : n_close
680dc065eeSBram Moolenaarendfunction
690dc065eeSBram Moolenaar
70071d4279SBram Moolenaarfunction GetCSSIndent()
710dc065eeSBram Moolenaar  let line = getline(v:lnum)
720dc065eeSBram Moolenaar  if line =~ '^\s*\*'
730dc065eeSBram Moolenaar    return cindent(v:lnum)
740dc065eeSBram Moolenaar  endif
750dc065eeSBram Moolenaar
760dc065eeSBram Moolenaar  let pnum = s:prevnonblanknoncomment(v:lnum - 1)
770dc065eeSBram Moolenaar  if pnum == 0
78071d4279SBram Moolenaar    return 0
79071d4279SBram Moolenaar  endif
80071d4279SBram Moolenaar
81214641f7SBram Moolenaar  return indent(pnum) + s:count_braces(pnum, 1) * shiftwidth()
82214641f7SBram Moolenaar        \ - s:count_braces(v:lnum, 0) * shiftwidth()
83071d4279SBram Moolenaarendfunction
848e52a593SBram Moolenaar
858e52a593SBram Moolenaarlet &cpo = s:keepcpo
868e52a593SBram Moolenaarunlet s:keepcpo
87