stylus.vim (3123B)
1 " Vim indent file 2 " Language: Stylus 3 " Maintainer: Marc Harter 4 " Last Change: 2010 May 21 5 " Based On: sass.vim from Tim Pope 6 " 7 if exists("b:did_indent") 8 finish 9 endif 10 let b:did_indent = 1 11 12 setlocal indentexpr=GetStylusIndent() 13 setlocal indentkeys=o,O,*<Return>,},],0),!^F 14 let b:undo_indent = "setl indentexpr< indentkeys<" 15 16 if exists("*GetStylusIndent") " only define once 17 finish 18 endif 19 20 function s:prevnonblanknoncomment(lnum) 21 let lnum = a:lnum 22 while lnum > 1 23 let lnum = prevnonblank(lnum) 24 let line = getline(lnum) 25 if line =~ '\*/' 26 while lnum > 1 && line !~ '/\*' 27 let lnum -= 1 28 endwhile 29 if line =~ '^\s*/\*' 30 let lnum -= 1 31 else 32 break 33 endif 34 else 35 break 36 endif 37 endwhile 38 return lnum 39 endfunction 40 41 function s:count_braces(lnum, count_open) 42 let n_open = 0 43 let n_close = 0 44 let line = getline(a:lnum) 45 let pattern = '[{}]' 46 let i = match(line, pattern) 47 while i != -1 48 if synIDattr(synID(a:lnum, i + 1, 0), 'name') !~ 'css\%(Comment\|StringQ\{1,2}\)' 49 if line[i] == '{' 50 let n_open += 1 51 elseif line[i] == '}' 52 if n_open > 0 53 let n_open -= 1 54 else 55 let n_close += 1 56 endif 57 endif 58 endif 59 let i = match(line, pattern, i + 1) 60 endwhile 61 return a:count_open ? n_open : n_close 62 endfunction 63 64 " function CheckCSSIndent() 65 " let line = getline(v:lnum) 66 " if line =~ '^\s*\*' 67 " return cindent(v:lnum) 68 " endif 69 " 70 " let pnum = s:prevnonblanknoncomment(v:lnum - 1) 71 " if pnum == 0 72 " return 0 73 " endif 74 75 function! GetStylusIndent() 76 let line = getline(v:lnum) 77 if line =~ '^\s*\*' 78 return cindent(v:lnum) 79 endif 80 81 let pnum = s:prevnonblanknoncomment(v:lnum - 1) 82 if pnum == 0 83 return 0 84 endif 85 86 let lnum = prevnonblank(v:lnum-1) 87 if lnum == 0 88 return 0 89 endif 90 91 let pline = getline(pnum) 92 93 if pline =~ '[}{]' 94 return indent(pnum) + s:count_braces(pnum, 1) * &sw - s:count_braces(v:lnum, 0) * &sw 95 endif 96 97 let line = substitute(getline(lnum),'[\s()]\+$','','') " get last line strip ending whitespace 98 let cline = substitute(substitute(getline(v:lnum),'\s\+$','',''),'^\s\+','','') " get current line, trimmed 99 let lastcol = strlen(line) " get last col in prev line 100 let line = substitute(line,'^\s\+','','') " then remove preceeding whitespace 101 let indent = indent(lnum) " get indent on prev line 102 let cindent = indent(v:lnum) " get indent on current line 103 let increase = indent + &sw " increase indent by the shift width 104 if indent == indent(lnum) 105 let indent = cindent <= indent ? indent : increase 106 endif 107 108 let group = synIDattr(synID(lnum,lastcol,1),'name') 109 110 " if group !~? 'css.*' && line =~? ')\s*$' " match user functions 111 " return increase 112 if group =~? '\v^%(cssTagName|cssClassName|cssIdentifier|cssSelectorOp|cssSelectorOp2|cssBraces|cssAttributeSelector|cssPseudo|stylusId|stylusClass)$' 113 return increase 114 elseif (group == 'stylusUserFunction') && (indent(lnum) == '0') " mixin definition 115 return increase 116 else 117 return indent 118 endif 119 endfunction 120 121 " vim:set sw=2;