diff options
Diffstat (limited to 'indent')
| -rw-r--r-- | indent/scss.vim | 93 | 
1 files changed, 93 insertions, 0 deletions
diff --git a/indent/scss.vim b/indent/scss.vim new file mode 100644 index 00000000..f602f358 --- /dev/null +++ b/indent/scss.vim @@ -0,0 +1,93 @@ +if exists('g:polyglot_disabled') && index(g:polyglot_disabled, 'scss') != -1 +  finish +endif + +" Vim indent file +" Language    : SCSS (Sassy CSS) +" Maintainer  : Daniel Hofstetter (daniel.hofstetter@42dh.com) +" URL         : https://github.com/cakebaker/scss-syntax.vim +" Last Change : 2019-08-04 +" Based on    : css.vim by Nikolai Weibull, Oleg Zubchenko +" Modified by : ObserverOfTime + +if exists('b:did_indent') | finish | endif +let b:did_indent = 1 + +setlocal indentexpr=GetSCSSIndent() +setlocal indentkeys=0{,0},0(,0),!^F,o,O +setlocal nosmartindent + +let b:undo_indent = 'setl smartindent< indentkeys< indentexpr<' + +if exists('*GetSCSSIndent') | finish | endif +let s:keepcpo= &cpoptions +set cpoptions&vim + +function s:prevnonblanknoncomment(lnum) +  let l:lnum = a:lnum +  while l:lnum > 1 +    let l:lnum = prevnonblank(l:lnum) +    let l:line = getline(l:lnum) +    if l:line =~? '\*/' +      while l:lnum > 1 && l:line !~? '/\*' +        let l:lnum -= 1 +      endwhile +      if l:line =~? '^\s*/\*' +        let l:lnum -= 1 +      else +        break +      endif +    else +      break +    endif +  endwhile +  return l:lnum +endfunction + +function s:count_chars(lnum, count_open, chars) +  let l:n_open = 0 +  let l:n_close = 0 +  let l:line = getline(a:lnum) +  let l:pattern = '['. a:chars .']' +  let l:i = match(l:line, l:pattern) +  let l:noi = 'scss\%(Comment\|StringQ\{1,2}\)' +  while l:i != -1 +    if synIDattr(synID(a:lnum, l:i + 1, 0), 'name') !~? l:noi +      if l:line[l:i] ==# a:chars[0] +        let l:n_open += 1 +      elseif l:line[l:i] ==# a:chars[1] +        if l:n_open > 0 +          let l:n_open -= 1 +        else +          let l:n_close += 1 +        endif +      endif +    endif +    let l:i = match(l:line, l:pattern, l:i + 1) +  endwhile +  return a:count_open ? l:n_open : l:n_close +endfunction + +function GetSCSSIndent() +  let l:line = getline(v:lnum) +  if l:line =~? '^\s*\*' +    return cindent(v:lnum) +  endif + +  let l:pnum = s:prevnonblanknoncomment(v:lnum - 1) +  if l:pnum == 0 +    return 0 +  endif + +  return indent(l:pnum) +        \ + s:count_chars(l:pnum, 1, '{}') * shiftwidth() +        \ - s:count_chars(v:lnum, 0, '{}') * shiftwidth() +        \ + s:count_chars(l:pnum, 1, '()') * shiftwidth() +        \ - s:count_chars(v:lnum, 0, '()') * shiftwidth() +endfunction + +let &cpoptions = s:keepcpo +unlet s:keepcpo + +" vim:set et ts=2 sw=2: +  | 
