94 lines
2.3 KiB
VimL
94 lines
2.3 KiB
VimL
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:
|
|
|