summaryrefslogtreecommitdiffstats
path: root/indent/stylus.vim
blob: 070c1065627252dade5c3678495c1227579f928f (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
if !has_key(g:polyglot_is_disabled, 'stylus')
  finish
endif

" Vim indent file
" Language: Stylus
" Maintainer: Marc Harter
" Last Change: 2010 May 21
" Based On: sass.vim from Tim Pope
"
if exists("b:did_indent")
  finish
endif
unlet! b:did_indent
let b:did_indent = 1

setlocal indentexpr=GetStylusIndent()
setlocal indentkeys=o,O,*<Return>,},],0),!^F
setlocal formatoptions+=r

if exists("*GetStylusIndent")  " only define once
  finish
endif

function s:prevnonblanknoncomment(lnum)
  let lnum = a:lnum
  while lnum > 1
    let lnum = prevnonblank(lnum)
    let line = getline(lnum)
    if line =~ '\*/'
      while lnum > 1 && line !~ '/\*'
        let lnum -= 1
      endwhile
      if line =~ '^\s*/\*'
        let lnum -= 1
      else
        break
      endif
    else
      break
    endif
  endwhile
  return lnum
endfunction

function s:count_braces(lnum, count_open)
  let n_open = 0
  let n_close = 0
  let line = getline(a:lnum)
  let pattern = '[{}]'
  let i = match(line, pattern)
  while i != -1
    if synIDattr(synID(a:lnum, i + 1, 0), 'name') !~ 'css\%(Comment\|StringQ\{1,2}\)'
      if line[i] == '{'
        let n_open += 1
      elseif line[i] == '}'
        if n_open > 0
          let n_open -= 1
        else
          let n_close += 1
        endif
      endif
    endif
    let i = match(line, pattern, i + 1)
  endwhile
  return a:count_open ? n_open : n_close
endfunction

" function CheckCSSIndent()
"   let line = getline(v:lnum)
"   if line =~ '^\s*\*'
"     return cindent(v:lnum)
"   endif
" 
"   let pnum = s:prevnonblanknoncomment(v:lnum - 1)
"   if pnum == 0
"     return 0
"   endif
" 
"   return indent(pnum) + s:count_braces(pnum, 1) * &sw
"         \ - s:count_braces(v:lnum, 0) * &sw
" endfunction

function! GetStylusIndent()
  let line = getline(v:lnum)
  if line =~ '^\s*\*'
    return cindent(v:lnum)
  endif

  let pnum = s:prevnonblanknoncomment(v:lnum - 1)
  if pnum == 0
    return 0
  endif

  let lnum     = prevnonblank(v:lnum-1)
  if lnum == 0
    return 0
  endif

  let pline = getline(pnum)

  if pline =~ '[}{]'
    return indent(pnum) + s:count_braces(pnum, 1) * &sw - s:count_braces(v:lnum, 0) * &sw
  endif

  let line     = substitute(getline(lnum),'[\s()]\+$','','')  " get last line strip ending whitespace
  let cline    = substitute(substitute(getline(v:lnum),'\s\+$','',''),'^\s\+','','')  " get current line, trimmed
  let lastcol  = strlen(line)  " get last col in prev line
  let line     = substitute(line,'^\s\+','','')  " then remove preceeding whitespace
  let indent   = indent(lnum)  " get indent on prev line
  let cindent  = indent(v:lnum)  " get indent on current line
  let increase = indent + &sw  " increase indent by the shift width
  if indent   == indent(lnum)
    let indent = cindent <= indent ? indent : increase
  endif

  let group = synIDattr(synID(lnum,lastcol,1),'name')

  " for debugging only
  echo group

  " if group !~? 'css.*' && line =~? ')\s*$' " match user functions
  "   return increase
  if group =~? '\v^%(cssTagName|cssClassName|cssIdentifier|cssSelectorOp|cssSelectorOp2|cssBraces|cssAttributeSelector|cssPseudo|stylusId|stylusClass)$'
    return increase
  elseif (group == 'stylusUserFunction') && (indent(lnum) == '0') " mixin definition
    return increase
  else
    return indent
  endif
endfunction

" vim:set sw=2;