" Vim filetype plugin " Language: Eiffel " Maintainer: Doug Kearns " Last Change: 2010 Aug 29 if (exists("b:did_ftplugin")) finish endif let b:did_ftplugin = 1 let s:cpo_save = &cpo set cpo&vim setlocal comments=:-- setlocal commentstring=--\ %s setlocal formatoptions-=t formatoptions+=croql if (has("gui_win32") || has("gui_gtk")) && !exists("b:browsefilter") let b:browsefilter = "Eiffel Source Files (*.e)\t*.e\n" . \ "Eiffel Control Files (*.ecf, *.ace, *.xace)\t*.ecf;*.ace;*.xace\n" . \ "All Files (*.*)\t*.*\n" endif if exists("loaded_matchit") && !exists("b:match_words") let b:match_ignorecase = 0 " Silly \%^ trick to match note at head of pair and in middle prevents " 'g%' wrapping from 'note' to 'end' let b:match_words = '\%^:' . \ '\<\%(^note\|indexing\|class\|^obsolete\|inherit\|insert\|^create\|convert\|feature\|^invariant\)\>:' . \ '^end\>,' . \ '\<\%(do\|deferred\|external\|once\%(\s\+"\)\@!\|check\|debug\|if\|inspect\|from\|across\)\>:' . \ '\%(\%(^\s\+\)\@<=\%(then\|until\|loop\)\|\%(then\|until\|loop\)\s\+[^ -]\|' . \ '\<\%(ensure\%(\s\+then\)\=\|rescue\|_then\|elseif\|else\|when\|\s\@<=invariant\|_until\|_loop\|variant\|_as\|alias\)\>\):' . \ '\s\@<=end\>' let b:match_skip = 's:\' noremap [% noremap ]% vnoremap a% endif let b:undo_ftplugin = "setl fo< com< cms<" . \ "| unlet! b:browsefilter b:match_ignorecase b:match_words b:match_skip" if !exists("g:no_plugin_maps") && !exists("g:no_eiffel_maps") function! s:DoMotion(pattern, count, flags) abort normal! m' for i in range(a:count) call search(a:pattern, a:flags) endfor endfunction let sections = '^\%(note\|indexing\|' . \ '\%(\%(deferred\|expanded\|external\|frozen\)\s\+\)*class\|' . \ 'obsolete\|inherit\|insert\|create\|convert\|feature\|' . \ 'invariant\|end\)\>' nnoremap ]] :call DoMotion(sections, v:count1, 'W') xnoremap ]] :exe "normal! gv"call DoMotion(sections, v:count1, 'W') nnoremap [[ :call DoMotion(sections, v:count1, 'Wb') xnoremap [[ :exe "normal! gv"call DoMotion(sections, v:count1, 'Wb') function! s:DoFeatureMotion(count, flags) let view = winsaveview() call cursor(1, 1) let [features_start, _] = searchpos('^feature\>') call search('^\s\+\a') " find the first feature let spaces = indent(line('.')) let [features_end, _] = searchpos('^\%(invariant\|note\|end\)\>') call winrestview(view) call s:DoMotion('\%>' . features_start . 'l\%<' . features_end . 'l^\s*\%' . (spaces + 1) . 'v\zs\a', a:count, a:flags) endfunction nnoremap ]m :call DoFeatureMotion(v:count1, 'W') xnoremap ]m :exe "normal! gv"call DoFeatureMotion(v:count1, 'W') nnoremap [m :call DoFeatureMotion(v:count1, 'Wb') xnoremap [m :exe "normal! gv"call DoFeatureMotion(v:count1, 'Wb') let comment_block_start = '^\%(\s\+--.*\n\)\@ ]- :call DoMotion(comment_block_start, 1, 'W') xnoremap ]- :exe "normal! gv"call DoMotion(comment_block_start, 1, 'W') nnoremap [- :call DoMotion(comment_block_end, 1, 'Wb') xnoremap [- :exe "normal! gv"call DoMotion(comment_block_end, 1, 'Wb') let b:undo_ftplugin = b:undo_ftplugin . \ "| silent! execute 'unmap [[' | silent! execute 'unmap ]]'" . \ "| silent! execute 'unmap [m' | silent! execute 'unmap ]m'" . \ "| silent! execute 'unmap [-' | silent! execute 'unmap ]-'" endif let &cpo = s:cpo_save unlet s:cpo_save " vim: nowrap sw=2 sts=2 ts=8