diff options
author | Bram Moolenaar <Bram@vim.org> | 2010-03-02 16:19:40 +0100 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2010-03-02 16:19:40 +0100 |
commit | 5e3dae8b6ba205faf78af4b6eaeb5947c309ca59 (patch) | |
tree | dc22b80fe00fec131b97235c3b701f0ebe5b2d06 /runtime/ftplugin | |
parent | 42b4ddab9585411e53c16cddc93e727a5db7f567 (diff) | |
download | vim-git-5e3dae8b6ba205faf78af4b6eaeb5947c309ca59.tar.gz |
Updated runtime an documentation files.
Diffstat (limited to 'runtime/ftplugin')
-rw-r--r-- | runtime/ftplugin/cucumber.vim | 131 |
1 files changed, 131 insertions, 0 deletions
diff --git a/runtime/ftplugin/cucumber.vim b/runtime/ftplugin/cucumber.vim new file mode 100644 index 000000000..8ef8c2399 --- /dev/null +++ b/runtime/ftplugin/cucumber.vim @@ -0,0 +1,131 @@ +" Vim filetype plugin +" Language: Cucumber +" Maintainer: Tim Pope <vimNOSPAM@tpope.org> + +" Only do this when not done yet for this buffer +if (exists("b:did_ftplugin")) + finish +endif +let b:did_ftplugin = 1 + +setlocal formatoptions-=t formatoptions+=croql +setlocal comments=:# commentstring=#\ %s +setlocal omnifunc=CucumberComplete + +let b:undo_ftplugin = "setl fo< com< cms< ofu<" + +let b:cucumber_root = expand('%:p:h:s?.*[\/]\%(features\|stories\)\zs[\/].*??') + +if !exists("g:no_plugin_maps") && !exists("g:no_cucumber_maps") + nmap <silent><buffer> <C-]> :<C-U>exe <SID>jump('edit',v:count)<CR> + nmap <silent><buffer> <C-W>] :<C-U>exe <SID>jump('split',v:count)<CR> + nmap <silent><buffer> <C-W><C-]> :<C-U>exe <SID>jump('split',v:count)<CR> + nmap <silent><buffer> <C-W>} :<C-U>exe <SID>jump('pedit',v:count)<CR> + let b:undo_ftplugin .= "| sil! iunmap! <C-]>| sil! iunmap! <C-W>]| sil! iunmap! <C-W><C-]>| sil! iunmap! <C-W>}" +endif + +function! s:jump(command,count) + let steps = s:steps('.') + if len(steps) == 0 || len(steps) < a:count + return 'echoerr "No matching step found"' + elseif len(steps) > 1 && !a:count + return 'echoerr "Multiple matching steps found"' + else + let c = a:count ? a:count-1 : 0 + return a:command.' +'.steps[c][1].' '.escape(steps[c][0],' %#') + endif +endfunction + +function! s:allsteps() + let step_pattern = '\C^\s*\K\k*\>\s*\zs\S.\{-\}\ze\s*\%(do\|{\)\s*\%(|[^|]*|\s*\)\=\%($\|#\)' + let steps = [] + for file in split(glob(b:cucumber_root.'/**/*.rb'),"\n") + let lines = readfile(file) + let num = 0 + for line in lines + let num += 1 + if line =~ step_pattern + let type = matchstr(line,'\w\+') + let steps += [[file,num,type,matchstr(line,step_pattern)]] + endif + endfor + endfor + return steps +endfunction + +function! s:steps(lnum) + let c = indent(a:lnum) + 1 + while synIDattr(synID(a:lnum,c,1),'name') !~# '^$\|Region$' + let c = c + 1 + endwhile + let step = matchstr(getline(a:lnum)[c-1 : -1],'^\s*\zs.\{-\}\ze\s*$') + return filter(s:allsteps(),'s:stepmatch(v:val[3],step)') +endfunction + +function! s:stepmatch(receiver,target) + if a:receiver =~ '^[''"].*[''"]$' + let pattern = '^'.escape(substitute(a:receiver[1:-2],'$\w\+','(.*)','g'),'/').'$' + elseif a:receiver =~ '^/.*/$' + let pattern = a:receiver[1:-2] + elseif a:receiver =~ '^%r..*.$' + let pattern = escape(a:receiver[3:-2],'/') + else + return 0 + endif + try + let vimpattern = substitute(substitute(pattern,'\\\@<!(?:','%(','g'),'\\\@<!\*?','{-}','g') + if a:target =~# '\v'.vimpattern + return 1 + endif + catch + endtry + if has("ruby") + ruby VIM.command("return #{if (begin; Kernel.eval('/'+VIM.evaluate('pattern')+'/'); rescue SyntaxError; end) === VIM.evaluate('a:target') then 1 else 0 end}") + else + return 0 + endif +endfunction + +function! s:bsub(target,pattern,replacement) + return substitute(a:target,'\C\\\@<!'.a:pattern,a:replacement,'g') +endfunction + +function! CucumberComplete(findstart,base) abort + let indent = indent('.') + let group = synIDattr(synID(line('.'),indent+1,1),'name') + let type = matchstr(group,'\Ccucumber\zs\%(Given\|When\|Then\)') + let e = matchend(getline('.'),'^\s*\S\+\s') + if type == '' || col('.') < col('$') || e < 0 + return -1 + endif + if a:findstart + return e + endif + let steps = [] + for step in s:allsteps() + if step[2] ==# type + if step[3] =~ '^[''"]' + let steps += [step[3][1:-2]] + elseif step[3] =~ '^/\^.*\$/$' + let pattern = step[3][2:-3] + let pattern = substitute(pattern,'\C^(?:|I )','I ','') + let pattern = s:bsub(pattern,'\\[Sw]','w') + let pattern = s:bsub(pattern,'\\d','1') + let pattern = s:bsub(pattern,'\\[sWD]',' ') + let pattern = s:bsub(pattern,'\[\^\\\="\]','_') + let pattern = s:bsub(pattern,'[[:alnum:]. _-][?*]?\=','') + let pattern = s:bsub(pattern,'\[\([^^]\).\{-\}\]','\1') + let pattern = s:bsub(pattern,'+?\=','') + let pattern = s:bsub(pattern,'(\([[:alnum:]. -]\{-\}\))','\1') + let pattern = s:bsub(pattern,'\\\([[:punct:]]\)','\1') + if pattern !~ '[\\()*?]' + let steps += [pattern] + endif + endif + endif + endfor + call filter(steps,'strpart(v:val,0,strlen(a:base)) ==# a:base') + return sort(steps) +endfunction + +" vim:set sts=2 sw=2: |