vim-polyglot/indent/scss.vim

94 lines
2.3 KiB
VimL
Raw Normal View History

2019-04-23 05:32:40 -04:00
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: