codekingpro/portable-devtools
114k
1" Vim indent file2" Language: Cucumber3" Maintainer: Tim Pope <vimNOSPAM@tpope.org>4" Last Change: 2023 Dec 285" 2025 Apr 16 by Vim Project (set 'cpoptions' for line continuation, #17121)6 7if exists("b:did_indent")8 finish9endif10let b:did_indent = 111let s:cpo_save = &cpo12set cpo&vim13 14setlocal autoindent15setlocal indentexpr=GetCucumberIndent()16setlocal indentkeys=o,O,*<Return>,<:>,0<Bar>,0#,=,!^F17 18let b:undo_indent = 'setl ai< inde< indk<'19 20" Only define the function once.21if exists("*GetCucumberIndent")22 finish23endif24 25let s:headings = {26 \ 'Feature': 'feature',27 \ 'Rule': 'rule',28 \ 'Background': 'bg_or_scenario',29 \ 'Scenario': 'bg_or_scenario',30 \ 'ScenarioOutline': 'bg_or_scenario',31 \ 'Examples': 'examples',32 \ 'Scenarios': 'examples'}33 34function! s:Line(lnum) abort35 if getline(a:lnum) =~# ':'36 let group = matchstr(synIDattr(synID(a:lnum,1+indent(a:lnum), 1), 'name'), '^cucumber\zs.*')37 if !has_key(s:headings, group)38 let group = substitute(matchstr(getline(a:lnum), '^\s*\zs\%([^:]\+\)\ze:\S\@!'), '\s\+', '', 'g')39 endif40 else41 let group = ''42 endif43 let char = matchstr(getline(a:lnum), '^\s*\zs[[:punct:]]')44 return {45 \ 'lnum': a:lnum,46 \ 'indent': indent(a:lnum),47 \ 'heading': get(s:headings, group, ''),48 \ 'tag': char ==# '@',49 \ 'table': char ==# '|',50 \ 'comment': char ==# '#',51 \ }52endfunction53 54function! GetCucumberIndent(...) abort55 let lnum = a:0 ? a:1 : v:lnum56 let sw = shiftwidth()57 let prev = s:Line(prevnonblank(lnum-1))58 let curr = s:Line(lnum)59 let next = s:Line(nextnonblank(lnum+1))60 if curr.heading ==# 'feature'61 " feature heading62 return 063 elseif curr.heading ==# 'examples'64 " examples heading65 return 2 * sw66 elseif curr.heading ==# 'bg_or_scenario'67 " background, scenario or outline heading68 return sw69 elseif prev.heading ==# 'feature'70 " line after feature heading71 return sw72 elseif prev.heading ==# 'examples'73 " line after examples heading74 return 3 * sw75 elseif prev.heading ==# 'bg_or_scenario'76 " line after background, scenario or outline heading77 return 2 * sw78 elseif (curr.tag || curr.comment) && (next.heading ==# 'feature' || prev.indent <= 0)79 " tag or comment before a feature heading80 return 081 elseif curr.tag82 " other tags83 return sw84 elseif (curr.table || curr.comment) && prev.table85 " mid-table86 " preserve indent87 return prev.indent88 elseif curr.table && !prev.table89 " first line of a table, relative indent90 return prev.indent + sw91 elseif !curr.table && prev.table92 " line after a table, relative unindent93 return prev.indent - sw94 elseif curr.comment && getline(v:lnum-1) =~# '^\s*$' && next.heading ==# 'bg_or_scenario'95 " comments on scenarios96 return sw97 endif98 return prev.indent < 0 ? 0 : prev.indent99endfunction100 101let &cpo = s:cpo_save102unlet s:cpo_save103 104" vim:set sts=2 sw=2:105 