summaryrefslogtreecommitdiffstats
path: root/indent/scss.vim
diff options
context:
space:
mode:
Diffstat (limited to 'indent/scss.vim')
-rw-r--r--indent/scss.vim93
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:
+