1071d4279SBram Moolenaar" Vim filetype plugin 2071d4279SBram Moolenaar" Language: Ruby 391170f8aSBram Moolenaar" Maintainer: Gavin Sinclair <gsinclair at gmail.com> 460a795aaSBram Moolenaar" Info: $Id$ 5a5792f58SBram Moolenaar" URL: http://vim-ruby.rubyforge.org 660a795aaSBram Moolenaar" Anon CVS: See above site 7c6249bb2SBram Moolenaar" Release Coordinator: Doug Kearns <[email protected]> 860a795aaSBram Moolenaar" ---------------------------------------------------------------------------- 960a795aaSBram Moolenaar" 1060a795aaSBram Moolenaar" Original matchit support thanks to Ned Konz. See his ftplugin/ruby.vim at 1160a795aaSBram Moolenaar" http://bike-nomad.com/vim/ruby.vim. 1260a795aaSBram Moolenaar" ---------------------------------------------------------------------------- 13071d4279SBram Moolenaar 14071d4279SBram Moolenaar" Only do this when not done yet for this buffer 15071d4279SBram Moolenaarif (exists("b:did_ftplugin")) 16071d4279SBram Moolenaar finish 17071d4279SBram Moolenaarendif 18071d4279SBram Moolenaarlet b:did_ftplugin = 1 19071d4279SBram Moolenaar 2060a795aaSBram Moolenaarlet s:cpo_save = &cpo 2160a795aaSBram Moolenaarset cpo&vim 2260a795aaSBram Moolenaar 23756ec0f3SBram Moolenaarif has("gui_running") && !has("gui_win32") 24756ec0f3SBram Moolenaar setlocal keywordprg=ri\ -T 25756ec0f3SBram Moolenaarelse 26756ec0f3SBram Moolenaar setlocal keywordprg=ri 27756ec0f3SBram Moolenaarendif 28756ec0f3SBram Moolenaar 2960a795aaSBram Moolenaar" Matchit support 3060a795aaSBram Moolenaarif exists("loaded_matchit") && !exists("b:match_words") 3160a795aaSBram Moolenaar let b:match_ignorecase = 0 3260a795aaSBram Moolenaar 3360a795aaSBram Moolenaar let b:match_words = 3479166c43SBram Moolenaar \ '\<\%(if\|unless\|case\|while\|until\|for\|do\|class\|module\|def\|begin\)\>=\@!' . 3560a795aaSBram Moolenaar \ ':' . 3679166c43SBram Moolenaar \ '\<\%(else\|elsif\|ensure\|when\|rescue\|break\|redo\|next\|retry\)\>' . 3760a795aaSBram Moolenaar \ ':' . 3879166c43SBram Moolenaar \ '\<end\>' . 3991170f8aSBram Moolenaar \ ',{:},\[:\],(:)' 4060a795aaSBram Moolenaar 4160a795aaSBram Moolenaar let b:match_skip = 4260a795aaSBram Moolenaar \ "synIDattr(synID(line('.'),col('.'),0),'name') =~ '" . 4379166c43SBram Moolenaar \ "\\<ruby\\%(String\\|StringDelimiter\\|ASCIICode\\|Escape\\|" . 4479166c43SBram Moolenaar \ "Interpolation\\|NoInterpolation\\|Comment\\|Documentation\\|" . 4579166c43SBram Moolenaar \ "ConditionalModifier\\|RepeatModifier\\|OptionalDo\\|" . 4679166c43SBram Moolenaar \ "Function\\|BlockArgument\\|KeywordAsMethod\\|ClassVariable\\|" . 4779166c43SBram Moolenaar \ "InstanceVariable\\|GlobalVariable\\|Symbol\\)\\>'" 4860a795aaSBram Moolenaarendif 4960a795aaSBram Moolenaar 5060a795aaSBram Moolenaarsetlocal formatoptions-=t formatoptions+=croql 5160a795aaSBram Moolenaar 5260a795aaSBram Moolenaarsetlocal include=^\\s*\\<\\(load\\\|\w*require\\)\\> 5360a795aaSBram Moolenaarsetlocal includeexpr=substitute(substitute(v:fname,'::','/','g'),'$','.rb','') 5460a795aaSBram Moolenaarsetlocal suffixesadd=.rb 55c6249bb2SBram Moolenaar 56756ec0f3SBram Moolenaarif exists("&ofu") && has("ruby") 579e54a0e7SBram Moolenaar setlocal omnifunc=rubycomplete#Complete 58c6249bb2SBram Moolenaarendif 5960a795aaSBram Moolenaar 60756ec0f3SBram Moolenaar" To activate, :set ballooneval 61756ec0f3SBram Moolenaarif has('balloon_eval') && exists('+balloonexpr') 62756ec0f3SBram Moolenaar setlocal balloonexpr=RubyBalloonexpr() 63756ec0f3SBram Moolenaarendif 64756ec0f3SBram Moolenaar 65756ec0f3SBram Moolenaar 6660a795aaSBram Moolenaar" TODO: 6760a795aaSBram Moolenaar"setlocal define=^\\s*def 6860a795aaSBram Moolenaar 6960a795aaSBram Moolenaarsetlocal comments=:# 7060a795aaSBram Moolenaarsetlocal commentstring=#\ %s 7160a795aaSBram Moolenaar 7260a795aaSBram Moolenaarif !exists("s:rubypath") 73756ec0f3SBram Moolenaar if has("ruby") && has("win32") 74756ec0f3SBram Moolenaar ruby VIM::command( 'let s:rubypath = "%s"' % ($: + begin; require %q{rubygems}; Gem.all_load_paths.sort.uniq; rescue LoadError; []; end).join(%q{,}) ) 75756ec0f3SBram Moolenaar let s:rubypath = '.,' . substitute(s:rubypath, '\%(^\|,\)\.\%(,\|$\)', ',,', '') 76756ec0f3SBram Moolenaar elseif executable("ruby") 77d5cdbeb8SBram Moolenaar let s:code = "print ($: + begin; require %q{rubygems}; Gem.all_load_paths.sort.uniq; rescue LoadError; []; end).join(%q{,})" 7860a795aaSBram Moolenaar if &shellxquote == "'" 79d5cdbeb8SBram Moolenaar let s:rubypath = system('ruby -e "' . s:code . '"') 8060a795aaSBram Moolenaar else 81d5cdbeb8SBram Moolenaar let s:rubypath = system("ruby -e '" . s:code . "'") 8260a795aaSBram Moolenaar endif 83d5cdbeb8SBram Moolenaar let s:rubypath = '.,' . substitute(s:rubypath, '\%(^\|,\)\.\%(,\|$\)', ',,', '') 8460a795aaSBram Moolenaar else 8560a795aaSBram Moolenaar " If we can't call ruby to get its path, just default to using the 8660a795aaSBram Moolenaar " current directory and the directory of the current file. 8760a795aaSBram Moolenaar let s:rubypath = ".,," 8860a795aaSBram Moolenaar endif 8960a795aaSBram Moolenaarendif 9060a795aaSBram Moolenaar 9160a795aaSBram Moolenaarlet &l:path = s:rubypath 9260a795aaSBram Moolenaar 9360a795aaSBram Moolenaarif has("gui_win32") && !exists("b:browsefilter") 9460a795aaSBram Moolenaar let b:browsefilter = "Ruby Source Files (*.rb)\t*.rb\n" . 9560a795aaSBram Moolenaar \ "All Files (*.*)\t*.*\n" 9660a795aaSBram Moolenaarendif 9760a795aaSBram Moolenaar 98756ec0f3SBram Moolenaarlet b:undo_ftplugin = "setl fo< inc< inex< sua< def< com< cms< path< kp<" 9979166c43SBram Moolenaar \."| unlet! b:browsefilter b:match_ignorecase b:match_words b:match_skip" 10079166c43SBram Moolenaar \."| if exists('&ofu') && has('ruby') | setl ofu< | endif" 10179166c43SBram Moolenaar \."| if has('balloon_eval') && exists('+bexpr') | setl bexpr< | endif" 10279166c43SBram Moolenaar 10379166c43SBram Moolenaarif !exists("g:no_plugin_maps") && !exists("g:no_ruby_maps") 10479166c43SBram Moolenaar 10579166c43SBram Moolenaar noremap <silent> <buffer> [m :<C-U>call <SID>searchsyn('\<def\>','rubyDefine','b')<CR> 10679166c43SBram Moolenaar noremap <silent> <buffer> ]m :<C-U>call <SID>searchsyn('\<def\>','rubyDefine','')<CR> 10779166c43SBram Moolenaar noremap <silent> <buffer> [M :<C-U>call <SID>searchsyn('\<end\>','rubyDefine','b')<CR> 10879166c43SBram Moolenaar noremap <silent> <buffer> ]M :<C-U>call <SID>searchsyn('\<end\>','rubyDefine','')<CR> 10979166c43SBram Moolenaar 11079166c43SBram Moolenaar noremap <silent> <buffer> [[ :<C-U>call <SID>searchsyn('\<\%(class\<Bar>module\)\>','rubyModule\<Bar>rubyClass','b')<CR> 11179166c43SBram Moolenaar noremap <silent> <buffer> ]] :<C-U>call <SID>searchsyn('\<\%(class\<Bar>module\)\>','rubyModule\<Bar>rubyClass','')<CR> 11279166c43SBram Moolenaar noremap <silent> <buffer> [] :<C-U>call <SID>searchsyn('\<end\>','rubyModule\<Bar>rubyClass','b')<CR> 11379166c43SBram Moolenaar noremap <silent> <buffer> ][ :<C-U>call <SID>searchsyn('\<end\>','rubyModule\<Bar>rubyClass','')<CR> 11479166c43SBram Moolenaar 11579166c43SBram Moolenaar let b:undo_ftplugin = b:undo_ftplugin 11679166c43SBram Moolenaar \."| sil! exe 'unmap <buffer> [[' | sil! exe 'unmap <buffer> ]]' | sil! exe 'unmap <buffer> []' | sil! exe 'unmap <buffer> ]['" 11779166c43SBram Moolenaar \."| sil! exe 'unmap <buffer> [m' | sil! exe 'unmap <buffer> ]m' | sil! exe 'unmap <buffer> [M' | sil! exe 'unmap <buffer> ]M'" 11879166c43SBram Moolenaarendif 11960a795aaSBram Moolenaar 12060a795aaSBram Moolenaarlet &cpo = s:cpo_save 12160a795aaSBram Moolenaarunlet s:cpo_save 12260a795aaSBram Moolenaar 123756ec0f3SBram Moolenaarif exists("g:did_ruby_ftplugin_functions") 124756ec0f3SBram Moolenaar finish 125756ec0f3SBram Moolenaarendif 126756ec0f3SBram Moolenaarlet g:did_ruby_ftplugin_functions = 1 127756ec0f3SBram Moolenaar 128756ec0f3SBram Moolenaarfunction! RubyBalloonexpr() 129756ec0f3SBram Moolenaar if !exists('s:ri_found') 130756ec0f3SBram Moolenaar let s:ri_found = executable('ri') 131756ec0f3SBram Moolenaar endif 132756ec0f3SBram Moolenaar if s:ri_found 133756ec0f3SBram Moolenaar let line = getline(v:beval_lnum) 134756ec0f3SBram Moolenaar let b = matchstr(strpart(line,0,v:beval_col),'\%(\w\|[:.]\)*$') 135756ec0f3SBram Moolenaar let a = substitute(matchstr(strpart(line,v:beval_col),'^\w*\%([?!]\|\s*=\)\?'),'\s\+','','g') 136756ec0f3SBram Moolenaar let str = b.a 137756ec0f3SBram Moolenaar let before = strpart(line,0,v:beval_col-strlen(b)) 138756ec0f3SBram Moolenaar let after = strpart(line,v:beval_col+strlen(a)) 139756ec0f3SBram Moolenaar if str =~ '^\.' 140756ec0f3SBram Moolenaar let str = substitute(str,'^\.','#','g') 141756ec0f3SBram Moolenaar if before =~ '\]\s*$' 142756ec0f3SBram Moolenaar let str = 'Array'.str 143756ec0f3SBram Moolenaar elseif before =~ '}\s*$' 144756ec0f3SBram Moolenaar " False positives from blocks here 145756ec0f3SBram Moolenaar let str = 'Hash'.str 146756ec0f3SBram Moolenaar elseif before =~ "[\"'`]\\s*$" || before =~ '\$\d\+\s*$' 147756ec0f3SBram Moolenaar let str = 'String'.str 148756ec0f3SBram Moolenaar elseif before =~ '\$\d\+\.\d\+\s*$' 149756ec0f3SBram Moolenaar let str = 'Float'.str 150756ec0f3SBram Moolenaar elseif before =~ '\$\d\+\s*$' 151756ec0f3SBram Moolenaar let str = 'Integer'.str 152756ec0f3SBram Moolenaar elseif before =~ '/\s*$' 153756ec0f3SBram Moolenaar let str = 'Regexp'.str 154756ec0f3SBram Moolenaar else 155756ec0f3SBram Moolenaar let str = substitute(str,'^#','.','') 156756ec0f3SBram Moolenaar endif 157756ec0f3SBram Moolenaar endif 158756ec0f3SBram Moolenaar let str = substitute(str,'.*\.\s*to_f\s*\.\s*','Float#','') 159756ec0f3SBram Moolenaar let str = substitute(str,'.*\.\s*to_i\%(nt\)\=\s*\.\s*','Integer#','') 160756ec0f3SBram Moolenaar let str = substitute(str,'.*\.\s*to_s\%(tr\)\=\s*\.\s*','String#','') 161756ec0f3SBram Moolenaar let str = substitute(str,'.*\.\s*to_sym\s*\.\s*','Symbol#','') 162756ec0f3SBram Moolenaar let str = substitute(str,'.*\.\s*to_a\%(ry\)\=\s*\.\s*','Array#','') 163756ec0f3SBram Moolenaar let str = substitute(str,'.*\.\s*to_proc\s*\.\s*','Proc#','') 164756ec0f3SBram Moolenaar if str !~ '^\w' 165756ec0f3SBram Moolenaar return '' 166756ec0f3SBram Moolenaar endif 167756ec0f3SBram Moolenaar silent! let res = substitute(system("ri -f simple -T \"".str.'"'),'\n$','','') 16879166c43SBram Moolenaar if res =~ '^Nothing known about' || res =~ '^Bad argument:' || res =~ '^More than one method' 169756ec0f3SBram Moolenaar return '' 170756ec0f3SBram Moolenaar endif 171756ec0f3SBram Moolenaar return res 172756ec0f3SBram Moolenaar else 173756ec0f3SBram Moolenaar return "" 174756ec0f3SBram Moolenaar endif 175756ec0f3SBram Moolenaarendfunction 176756ec0f3SBram Moolenaar 17779166c43SBram Moolenaarfunction! s:searchsyn(pattern,syn,flags) 17879166c43SBram Moolenaar norm! m' 17979166c43SBram Moolenaar let i = 0 18079166c43SBram Moolenaar let cnt = v:count ? v:count : 1 18179166c43SBram Moolenaar while i < cnt 18279166c43SBram Moolenaar let i = i + 1 18379166c43SBram Moolenaar let line = line('.') 18479166c43SBram Moolenaar let col = col('.') 18579166c43SBram Moolenaar let pos = search(a:pattern,'W'.a:flags) 18679166c43SBram Moolenaar while pos != 0 && s:synname() !~# a:syn 18779166c43SBram Moolenaar let pos = search(a:pattern,'W'.a:flags) 18879166c43SBram Moolenaar endwhile 18979166c43SBram Moolenaar if pos == 0 19079166c43SBram Moolenaar call cursor(line,col) 19179166c43SBram Moolenaar return 19279166c43SBram Moolenaar endif 19379166c43SBram Moolenaar endwhile 19479166c43SBram Moolenaarendfunction 19579166c43SBram Moolenaar 19679166c43SBram Moolenaarfunction! s:synname() 19779166c43SBram Moolenaar return synIDattr(synID(line('.'),col('.'),0),'name') 19879166c43SBram Moolenaarendfunction 199756ec0f3SBram Moolenaar 20060a795aaSBram Moolenaar" 20160a795aaSBram Moolenaar" Instructions for enabling "matchit" support: 20260a795aaSBram Moolenaar" 20360a795aaSBram Moolenaar" 1. Look for the latest "matchit" plugin at 20460a795aaSBram Moolenaar" 20560a795aaSBram Moolenaar" http://www.vim.org/scripts/script.php?script_id=39 20660a795aaSBram Moolenaar" 20760a795aaSBram Moolenaar" It is also packaged with Vim, in the $VIMRUNTIME/macros directory. 20860a795aaSBram Moolenaar" 20960a795aaSBram Moolenaar" 2. Copy "matchit.txt" into a "doc" directory (e.g. $HOME/.vim/doc). 21060a795aaSBram Moolenaar" 21160a795aaSBram Moolenaar" 3. Copy "matchit.vim" into a "plugin" directory (e.g. $HOME/.vim/plugin). 21260a795aaSBram Moolenaar" 21360a795aaSBram Moolenaar" 4. Ensure this file (ftplugin/ruby.vim) is installed. 21460a795aaSBram Moolenaar" 21560a795aaSBram Moolenaar" 5. Ensure you have this line in your $HOME/.vimrc: 21660a795aaSBram Moolenaar" filetype plugin on 21760a795aaSBram Moolenaar" 21860a795aaSBram Moolenaar" 6. Restart Vim and create the matchit documentation: 21960a795aaSBram Moolenaar" 22060a795aaSBram Moolenaar" :helptags ~/.vim/doc 22160a795aaSBram Moolenaar" 22260a795aaSBram Moolenaar" Now you can do ":help matchit", and you should be able to use "%" on Ruby 22360a795aaSBram Moolenaar" keywords. Try ":echo b:match_words" to be sure. 22460a795aaSBram Moolenaar" 22560a795aaSBram Moolenaar" Thanks to Mark J. Reed for the instructions. See ":help vimrc" for the 22660a795aaSBram Moolenaar" locations of plugin directories, etc., as there are several options, and it 22760a795aaSBram Moolenaar" differs on Windows. Email [email protected] if you need help. 22860a795aaSBram Moolenaar" 22960a795aaSBram Moolenaar 230*446cb837SBram Moolenaar" vim: nowrap sw=2 sts=2 ts=8: 231