1" Vim indent file 2" Language: Cucumber 3" Maintainer: Tim Pope <[email protected]> 4" Last Change: 2013 May 30 5 6if exists("b:did_indent") 7 finish 8endif 9let b:did_indent = 1 10 11setlocal autoindent 12setlocal indentexpr=GetCucumberIndent() 13setlocal indentkeys=o,O,*<Return>,<:>,0<Bar>,0#,=,!^F 14 15let b:undo_indent = 'setl ai< inde< indk<' 16 17" Only define the function once. 18if exists("*GetCucumberIndent") 19 finish 20endif 21 22function! s:syn(lnum) 23 return synIDattr(synID(a:lnum,1+indent(a:lnum),1),'name') 24endfunction 25 26function! GetCucumberIndent() 27 let line = getline(prevnonblank(v:lnum-1)) 28 let cline = getline(v:lnum) 29 let nline = getline(nextnonblank(v:lnum+1)) 30 let syn = s:syn(prevnonblank(v:lnum-1)) 31 let csyn = s:syn(v:lnum) 32 let nsyn = s:syn(nextnonblank(v:lnum+1)) 33 if csyn ==# 'cucumberFeature' || cline =~# '^\s*Feature:' 34 " feature heading 35 return 0 36 elseif csyn ==# 'cucumberExamples' || cline =~# '^\s*\%(Examples\|Scenarios\):' 37 " examples heading 38 return 2 * &sw 39 elseif csyn =~# '^cucumber\%(Background\|Scenario\|ScenarioOutline\)$' || cline =~# '^\s*\%(Background\|Scenario\|Scenario Outline\):' 40 " background, scenario or outline heading 41 return &sw 42 elseif syn ==# 'cucumberFeature' || line =~# '^\s*Feature:' 43 " line after feature heading 44 return &sw 45 elseif syn ==# 'cucumberExamples' || line =~# '^\s*\%(Examples\|Scenarios\):' 46 " line after examples heading 47 return 3 * &sw 48 elseif syn =~# '^cucumber\%(Background\|Scenario\|ScenarioOutline\)$' || line =~# '^\s*\%(Background\|Scenario\|Scenario Outline\):' 49 " line after background, scenario or outline heading 50 return 2 * &sw 51 elseif cline =~# '^\s*[@#]' && (nsyn == 'cucumberFeature' || nline =~# '^\s*Feature:' || indent(prevnonblank(v:lnum-1)) <= 0) 52 " tag or comment before a feature heading 53 return 0 54 elseif cline =~# '^\s*@' 55 " other tags 56 return &sw 57 elseif cline =~# '^\s*[#|]' && line =~# '^\s*|' 58 " mid-table 59 " preserve indent 60 return indent(prevnonblank(v:lnum-1)) 61 elseif cline =~# '^\s*|' && line =~# '^\s*[^|]' 62 " first line of a table, relative indent 63 return indent(prevnonblank(v:lnum-1)) + &sw 64 elseif cline =~# '^\s*[^|]' && line =~# '^\s*|' 65 " line after a table, relative unindent 66 return indent(prevnonblank(v:lnum-1)) - &sw 67 elseif cline =~# '^\s*#' && getline(v:lnum-1) =~ '^\s*$' && (nsyn =~# '^cucumber\%(Background\|Scenario\|ScenarioOutline\)$' || nline =~# '^\s*\%(Background\|Scenario\|Scenario Outline\):') 68 " comments on scenarios 69 return &sw 70 endif 71 return indent(prevnonblank(v:lnum-1)) 72endfunction 73 74" vim:set sts=2 sw=2: 75