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