summaryrefslogtreecommitdiffstats
path: root/runtime/ftplugin/eiffel.vim
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--runtime/ftplugin/eiffel.vim96
1 files changed, 96 insertions, 0 deletions
diff --git a/runtime/ftplugin/eiffel.vim b/runtime/ftplugin/eiffel.vim
new file mode 100644
index 0000000..216fdde
--- /dev/null
+++ b/runtime/ftplugin/eiffel.vim
@@ -0,0 +1,96 @@
+" Vim filetype plugin
+" Language: Eiffel
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" 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:\<eiffel\%(Comment\|String\|Operator\)\>'
+ noremap [% <Nop>
+ noremap ]% <Nop>
+ vnoremap a% <Nop>
+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 <silent> <buffer> ]] :<C-U>call <SID>DoMotion(sections, v:count1, 'W')<CR>
+ xnoremap <silent> <buffer> ]] :<C-U>exe "normal! gv"<Bar>call <SID>DoMotion(sections, v:count1, 'W')<CR>
+ nnoremap <silent> <buffer> [[ :<C-U>call <SID>DoMotion(sections, v:count1, 'Wb')<CR>
+ xnoremap <silent> <buffer> [[ :<C-U>exe "normal! gv"<Bar>call <SID>DoMotion(sections, v:count1, 'Wb')<CR>
+
+ 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 <silent> <buffer> ]m :<C-U>call <SID>DoFeatureMotion(v:count1, 'W')<CR>
+ xnoremap <silent> <buffer> ]m :<C-U>exe "normal! gv"<Bar>call <SID>DoFeatureMotion(v:count1, 'W')<CR>
+ nnoremap <silent> <buffer> [m :<C-U>call <SID>DoFeatureMotion(v:count1, 'Wb')<CR>
+ xnoremap <silent> <buffer> [m :<C-U>exe "normal! gv"<Bar>call <SID>DoFeatureMotion(v:count1, 'Wb')<CR>
+
+ let comment_block_start = '^\%(\s\+--.*\n\)\@<!\s\+--'
+ let comment_block_end = '^\s\+--.*\n\%(\s\+--\)\@!'
+
+ nnoremap <silent> <buffer> ]- :<C-U>call <SID>DoMotion(comment_block_start, 1, 'W')<CR>
+ xnoremap <silent> <buffer> ]- :<C-U>exe "normal! gv"<Bar>call <SID>DoMotion(comment_block_start, 1, 'W')<CR>
+ nnoremap <silent> <buffer> [- :<C-U>call <SID>DoMotion(comment_block_end, 1, 'Wb')<CR>
+ xnoremap <silent> <buffer> [- :<C-U>exe "normal! gv"<Bar>call <SID>DoMotion(comment_block_end, 1, 'Wb')<CR>
+
+ let b:undo_ftplugin = b:undo_ftplugin .
+ \ "| silent! execute 'unmap <buffer> [[' | silent! execute 'unmap <buffer> ]]'" .
+ \ "| silent! execute 'unmap <buffer> [m' | silent! execute 'unmap <buffer> ]m'" .
+ \ "| silent! execute 'unmap <buffer> [-' | silent! execute 'unmap <buffer> ]-'"
+endif
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+" vim: nowrap sw=2 sts=2 ts=8