blob: 965c7786ed2d48b10b7f7edb4d70d84841015053 [file] [log] [blame]
Bram Moolenaar5e3dae82010-03-02 16:19:40 +01001" Vim indent file
2" Language: Cucumber
3" Maintainer: Tim Pope <vimNOSPAM@tpope.org>
Bram Moolenaar543b7ef2013-06-01 14:50:56 +02004" Last Change: 2013 May 30
Bram Moolenaar5e3dae82010-03-02 16:19:40 +01005
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
Bram Moolenaar543b7ef2013-06-01 14:50:56 +020015let b:undo_indent = 'setl ai< inde< indk<'
16
Bram Moolenaar5e3dae82010-03-02 16:19:40 +010017" 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)
Bram Moolenaar543b7ef2013-06-01 14:50:56 +020029 let nline = getline(nextnonblank(v:lnum+1))
Bram Moolenaar5e3dae82010-03-02 16:19:40 +010030 let syn = s:syn(prevnonblank(v:lnum-1))
31 let csyn = s:syn(v:lnum)
Bram Moolenaar543b7ef2013-06-01 14:50:56 +020032 let nsyn = s:syn(nextnonblank(v:lnum+1))
Bram Moolenaar5e3dae82010-03-02 16:19:40 +010033 if csyn ==# 'cucumberFeature' || cline =~# '^\s*Feature:'
Bram Moolenaar543b7ef2013-06-01 14:50:56 +020034 " feature heading
Bram Moolenaar5e3dae82010-03-02 16:19:40 +010035 return 0
36 elseif csyn ==# 'cucumberExamples' || cline =~# '^\s*\%(Examples\|Scenarios\):'
Bram Moolenaar543b7ef2013-06-01 14:50:56 +020037 " examples heading
Bram Moolenaar5e3dae82010-03-02 16:19:40 +010038 return 2 * &sw
39 elseif csyn =~# '^cucumber\%(Background\|Scenario\|ScenarioOutline\)$' || cline =~# '^\s*\%(Background\|Scenario\|Scenario Outline\):'
Bram Moolenaar543b7ef2013-06-01 14:50:56 +020040 " background, scenario or outline heading
Bram Moolenaar5e3dae82010-03-02 16:19:40 +010041 return &sw
42 elseif syn ==# 'cucumberFeature' || line =~# '^\s*Feature:'
Bram Moolenaar543b7ef2013-06-01 14:50:56 +020043 " line after feature heading
Bram Moolenaar5e3dae82010-03-02 16:19:40 +010044 return &sw
45 elseif syn ==# 'cucumberExamples' || line =~# '^\s*\%(Examples\|Scenarios\):'
Bram Moolenaar543b7ef2013-06-01 14:50:56 +020046 " line after examples heading
Bram Moolenaar5e3dae82010-03-02 16:19:40 +010047 return 3 * &sw
48 elseif syn =~# '^cucumber\%(Background\|Scenario\|ScenarioOutline\)$' || line =~# '^\s*\%(Background\|Scenario\|Scenario Outline\):'
Bram Moolenaar543b7ef2013-06-01 14:50:56 +020049 " line after background, scenario or outline heading
Bram Moolenaar5e3dae82010-03-02 16:19:40 +010050 return 2 * &sw
Bram Moolenaar543b7ef2013-06-01 14:50:56 +020051 elseif cline =~# '^\s*[@#]' && (nsyn == 'cucumberFeature' || nline =~# '^\s*Feature:' || indent(prevnonblank(v:lnum-1)) <= 0)
52 " tag or comment before a feature heading
Bram Moolenaar5e3dae82010-03-02 16:19:40 +010053 return 0
Bram Moolenaar543b7ef2013-06-01 14:50:56 +020054 elseif cline =~# '^\s*@'
55 " other tags
Bram Moolenaar5e3dae82010-03-02 16:19:40 +010056 return &sw
Bram Moolenaar543b7ef2013-06-01 14:50:56 +020057 elseif cline =~# '^\s*[#|]' && line =~# '^\s*|'
58 " mid-table
59 " preserve indent
Bram Moolenaar5e3dae82010-03-02 16:19:40 +010060 return indent(prevnonblank(v:lnum-1))
Bram Moolenaar543b7ef2013-06-01 14:50:56 +020061 elseif cline =~# '^\s*|' && line =~# '^\s*[^|]'
62 " first line of a table, relative indent
Bram Moolenaar5e3dae82010-03-02 16:19:40 +010063 return indent(prevnonblank(v:lnum-1)) + &sw
Bram Moolenaar543b7ef2013-06-01 14:50:56 +020064 elseif cline =~# '^\s*[^|]' && line =~# '^\s*|'
65 " line after a table, relative unindent
Bram Moolenaar5e3dae82010-03-02 16:19:40 +010066 return indent(prevnonblank(v:lnum-1)) - &sw
Bram Moolenaar543b7ef2013-06-01 14:50:56 +020067 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
Bram Moolenaar5e3dae82010-03-02 16:19:40 +010070 endif
71 return indent(prevnonblank(v:lnum-1))
72endfunction
73
74" vim:set sts=2 sw=2: