blob: ad28a67a0d1e7be5d84d6afc0fc00596267e461a [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 Moolenaar3ec574f2017-06-13 18:12:01 +02004" Last Change: 2017 Jun 13
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 Moolenaar3ec574f2017-06-13 18:12:01 +020030 let sw = exists('*shiftwidth') ? shiftwidth() : shiftwidth()
Bram Moolenaar5e3dae82010-03-02 16:19:40 +010031 let syn = s:syn(prevnonblank(v:lnum-1))
32 let csyn = s:syn(v:lnum)
Bram Moolenaar543b7ef2013-06-01 14:50:56 +020033 let nsyn = s:syn(nextnonblank(v:lnum+1))
Bram Moolenaar5e3dae82010-03-02 16:19:40 +010034 if csyn ==# 'cucumberFeature' || cline =~# '^\s*Feature:'
Bram Moolenaar543b7ef2013-06-01 14:50:56 +020035 " feature heading
Bram Moolenaar5e3dae82010-03-02 16:19:40 +010036 return 0
37 elseif csyn ==# 'cucumberExamples' || cline =~# '^\s*\%(Examples\|Scenarios\):'
Bram Moolenaar543b7ef2013-06-01 14:50:56 +020038 " examples heading
Bram Moolenaar89bcfda2016-08-30 23:26:57 +020039 return 2 * sw
Bram Moolenaar5e3dae82010-03-02 16:19:40 +010040 elseif csyn =~# '^cucumber\%(Background\|Scenario\|ScenarioOutline\)$' || cline =~# '^\s*\%(Background\|Scenario\|Scenario Outline\):'
Bram Moolenaar543b7ef2013-06-01 14:50:56 +020041 " background, scenario or outline heading
Bram Moolenaar89bcfda2016-08-30 23:26:57 +020042 return sw
Bram Moolenaar5e3dae82010-03-02 16:19:40 +010043 elseif syn ==# 'cucumberFeature' || line =~# '^\s*Feature:'
Bram Moolenaar543b7ef2013-06-01 14:50:56 +020044 " line after feature heading
Bram Moolenaar89bcfda2016-08-30 23:26:57 +020045 return sw
Bram Moolenaar5e3dae82010-03-02 16:19:40 +010046 elseif syn ==# 'cucumberExamples' || line =~# '^\s*\%(Examples\|Scenarios\):'
Bram Moolenaar543b7ef2013-06-01 14:50:56 +020047 " line after examples heading
Bram Moolenaar89bcfda2016-08-30 23:26:57 +020048 return 3 * sw
Bram Moolenaar5e3dae82010-03-02 16:19:40 +010049 elseif syn =~# '^cucumber\%(Background\|Scenario\|ScenarioOutline\)$' || line =~# '^\s*\%(Background\|Scenario\|Scenario Outline\):'
Bram Moolenaar543b7ef2013-06-01 14:50:56 +020050 " line after background, scenario or outline heading
Bram Moolenaar89bcfda2016-08-30 23:26:57 +020051 return 2 * sw
Bram Moolenaar543b7ef2013-06-01 14:50:56 +020052 elseif cline =~# '^\s*[@#]' && (nsyn == 'cucumberFeature' || nline =~# '^\s*Feature:' || indent(prevnonblank(v:lnum-1)) <= 0)
53 " tag or comment before a feature heading
Bram Moolenaar5e3dae82010-03-02 16:19:40 +010054 return 0
Bram Moolenaar543b7ef2013-06-01 14:50:56 +020055 elseif cline =~# '^\s*@'
56 " other tags
Bram Moolenaar89bcfda2016-08-30 23:26:57 +020057 return sw
Bram Moolenaar543b7ef2013-06-01 14:50:56 +020058 elseif cline =~# '^\s*[#|]' && line =~# '^\s*|'
59 " mid-table
60 " preserve indent
Bram Moolenaar5e3dae82010-03-02 16:19:40 +010061 return indent(prevnonblank(v:lnum-1))
Bram Moolenaar543b7ef2013-06-01 14:50:56 +020062 elseif cline =~# '^\s*|' && line =~# '^\s*[^|]'
63 " first line of a table, relative indent
Bram Moolenaar89bcfda2016-08-30 23:26:57 +020064 return indent(prevnonblank(v:lnum-1)) + sw
Bram Moolenaar543b7ef2013-06-01 14:50:56 +020065 elseif cline =~# '^\s*[^|]' && line =~# '^\s*|'
66 " line after a table, relative unindent
Bram Moolenaar89bcfda2016-08-30 23:26:57 +020067 return indent(prevnonblank(v:lnum-1)) - sw
Bram Moolenaar543b7ef2013-06-01 14:50:56 +020068 elseif cline =~# '^\s*#' && getline(v:lnum-1) =~ '^\s*$' && (nsyn =~# '^cucumber\%(Background\|Scenario\|ScenarioOutline\)$' || nline =~# '^\s*\%(Background\|Scenario\|Scenario Outline\):')
69 " comments on scenarios
Bram Moolenaar89bcfda2016-08-30 23:26:57 +020070 return sw
Bram Moolenaar5e3dae82010-03-02 16:19:40 +010071 endif
72 return indent(prevnonblank(v:lnum-1))
73endfunction
74
75" vim:set sts=2 sw=2: