diff runtime/ftplugin/ruby.vim @ 1123:c4cd8ad60bee

updated for version 7.1a
author vimboss
date Sat, 05 May 2007 17:59:48 +0000
parents a5677b7ce858
children 1d08aac0aea9
line wrap: on
line diff
--- a/runtime/ftplugin/ruby.vim
+++ b/runtime/ftplugin/ruby.vim
@@ -4,10 +4,10 @@
 " Info:			$Id$
 " URL:			http://vim-ruby.rubyforge.org
 " Anon CVS:		See above site
-" Release Coordinator:	Doug Kearns <dougkearns@gmail.com>
+" Release Coordinator:  Doug Kearns <dougkearns@gmail.com>
 " ----------------------------------------------------------------------------
 "
-" Original matchit support thanks to Ned Konz.	See his ftplugin/ruby.vim at
+" Original matchit support thanks to Ned Konz.  See his ftplugin/ruby.vim at
 "   http://bike-nomad.com/vim/ruby.vim.
 " ----------------------------------------------------------------------------
 
@@ -20,31 +20,37 @@ let b:did_ftplugin = 1
 let s:cpo_save = &cpo
 set cpo&vim
 
+if has("gui_running") && !has("gui_win32")
+  setlocal keywordprg=ri\ -T
+else
+  setlocal keywordprg=ri
+endif
+
 " Matchit support
 if exists("loaded_matchit") && !exists("b:match_words")
   let b:match_ignorecase = 0
 
  " TODO: improve optional do loops
- let b:match_words =
-    \ '\%(' .
-    \	  '\%(\%(\.\|\:\:\)\s*\|\:\)\@<!\<\%(class\|module\|begin\|def\|case\|for\|do\)\>' .
-    \	'\|' .
-    \	  '\%(\%(^\|\.\.\.\=\|[\,;=([<>~\*/%!&^|+-]\)\s*\)\@<=\%(if\|unless\|until\|while\)\>' .
-    \ '\)' .
-    \ ':' .
-    \ '\%(' .
-    \	  '\%(\%(\.\|\:\:\)\s*\|\:\)\@<!\<\%(else\|elsif\|ensure\|when\)\>' .
-    \	'\|' .
-    \	  '\%(\%(^\|;\)\s*\)\@<=\<rescue\>' .
-    \ '\)' .
-    \ ':' .
-    \ '\%(\%(\.\|\:\:\)\s*\|\:\)\@<!\<end\>' .
-    \ ',{:},\[:\],(:)'
+  let b:match_words =
+	\ '\%(' .
+	\     '\%(\%(\.\|\:\:\)\s*\|\:\)\@<!\<\%(class\|module\|begin\|def\|case\|for\|do\)\>' .
+	\   '\|' .
+	\     '\%(\%(^\|\.\.\.\=\|[{\:\,;([<>~\*/%&^|+-]\|\%(\<[_[\:lower\:]][_[\:alnum\:]]*\)\@<![!=?]\)\s*\)\@<=\%(if\|unless\|while\|until\)\>' .
+	\ '\)' .
+	\ ':' .
+	\ '\%(' .
+	\     '\%(\%(\.\|\:\:\)\s*\|\:\)\@<!\<\%(else\|elsif\|ensure\|when\)\>' .
+	\   '\|' .
+	\     '\%(\%(^\|;\)\s*\)\@<=\<rescue\>' .
+	\ '\)' .
+	\ ':' .
+	\ '\%(\%(\.\|\:\:\)\s*\|\:\)\@<!\<end\>' .
+	\ ',{:},\[:\],(:)'
 
   let b:match_skip =
-     \ "synIDattr(synID(line('.'),col('.'),0),'name') =~ '" .
-     \ "\\<ruby\\%(String\\|StringDelimiter\\|ASCIICode\\|Interpolation\\|" .
-     \ "NoInterpolation\\|Escape\\|Comment\\|Documentation\\)\\>'"
+	\ "synIDattr(synID(line('.'),col('.'),0),'name') =~ '" .
+	\ "\\<ruby\\%(String\\|StringDelimiter\\|ASCIICode\\|Interpolation\\|" .
+	\ "NoInterpolation\\|Escape\\|Comment\\|Documentation\\)\\>'"
 
 endif
 
@@ -54,10 +60,16 @@ setlocal include=^\\s*\\<\\(load\\\|\w*r
 setlocal includeexpr=substitute(substitute(v:fname,'::','/','g'),'$','.rb','')
 setlocal suffixesadd=.rb
 
-if version >= 700
+if exists("&ofu") && has("ruby")
   setlocal omnifunc=rubycomplete#Complete
 endif
 
+" To activate, :set ballooneval
+if has('balloon_eval') && exists('+balloonexpr')
+  setlocal balloonexpr=RubyBalloonexpr()
+endif
+
+
 " TODO:
 "setlocal define=^\\s*def
 
@@ -65,7 +77,10 @@ setlocal comments=:#
 setlocal commentstring=#\ %s
 
 if !exists("s:rubypath")
-  if executable("ruby")
+  if has("ruby") && has("win32")
+    ruby VIM::command( 'let s:rubypath = "%s"' % ($: + begin; require %q{rubygems}; Gem.all_load_paths.sort.uniq; rescue LoadError; []; end).join(%q{,}) )
+    let s:rubypath = '.,' . substitute(s:rubypath, '\%(^\|,\)\.\%(,\|$\)', ',,', '')
+  elseif executable("ruby")
     let s:code = "print ($: + begin; require %q{rubygems}; Gem.all_load_paths.sort.uniq; rescue LoadError; []; end).join(%q{,})"
     if &shellxquote == "'"
       let s:rubypath = system('ruby -e "' . s:code . '"')
@@ -84,21 +99,78 @@ let &l:path = s:rubypath
 
 if has("gui_win32") && !exists("b:browsefilter")
   let b:browsefilter = "Ruby Source Files (*.rb)\t*.rb\n" .
-		     \ "All Files (*.*)\t*.*\n"
+                     \ "All Files (*.*)\t*.*\n"
 endif
 
-let b:undo_ftplugin = "setl fo< inc< inex< sua< def< com< cms< path< "
+let b:undo_ftplugin = "setl fo< inc< inex< sua< def< com< cms< path< kp<"
       \ "| unlet! b:browsefilter b:match_ignorecase b:match_words b:match_skip"
+      \ "| if exists('&ofu') && has('ruby') | setl ofu< | endif"
+      \ "| if has('balloon_eval') && exists('+bexpr') | setl bexpr< | endif"
 
 let &cpo = s:cpo_save
 unlet s:cpo_save
 
+if exists("g:did_ruby_ftplugin_functions")
+  finish
+endif
+let g:did_ruby_ftplugin_functions = 1
+
+function! RubyBalloonexpr()
+  if !exists('s:ri_found')
+    let s:ri_found = executable('ri')
+  endif
+  if s:ri_found
+    let line = getline(v:beval_lnum)
+    let b = matchstr(strpart(line,0,v:beval_col),'\%(\w\|[:.]\)*$')
+    let a = substitute(matchstr(strpart(line,v:beval_col),'^\w*\%([?!]\|\s*=\)\?'),'\s\+','','g')
+    let str = b.a
+    let before = strpart(line,0,v:beval_col-strlen(b))
+    let after  = strpart(line,v:beval_col+strlen(a))
+    if str =~ '^\.'
+      let str = substitute(str,'^\.','#','g')
+      if before =~ '\]\s*$'
+        let str = 'Array'.str
+      elseif before =~ '}\s*$'
+        " False positives from blocks here
+        let str = 'Hash'.str
+      elseif before =~ "[\"'`]\\s*$" || before =~ '\$\d\+\s*$'
+        let str = 'String'.str
+      elseif before =~ '\$\d\+\.\d\+\s*$'
+        let str = 'Float'.str
+      elseif before =~ '\$\d\+\s*$'
+        let str = 'Integer'.str
+      elseif before =~ '/\s*$'
+        let str = 'Regexp'.str
+      else
+        let str = substitute(str,'^#','.','')
+      endif
+    endif
+    let str = substitute(str,'.*\.\s*to_f\s*\.\s*','Float#','')
+    let str = substitute(str,'.*\.\s*to_i\%(nt\)\=\s*\.\s*','Integer#','')
+    let str = substitute(str,'.*\.\s*to_s\%(tr\)\=\s*\.\s*','String#','')
+    let str = substitute(str,'.*\.\s*to_sym\s*\.\s*','Symbol#','')
+    let str = substitute(str,'.*\.\s*to_a\%(ry\)\=\s*\.\s*','Array#','')
+    let str = substitute(str,'.*\.\s*to_proc\s*\.\s*','Proc#','')
+    if str !~ '^\w'
+      return ''
+    endif
+    silent! let res = substitute(system("ri -f simple -T \"".str.'"'),'\n$','','')
+    if res =~ '^Nothing known about' || res =~ '^Bad argument:'
+      return ''
+    endif
+    return res
+  else
+    return ""
+  endif
+endfunction
+
+
 "
 " Instructions for enabling "matchit" support:
 "
 " 1. Look for the latest "matchit" plugin at
 "
-"	  http://www.vim.org/scripts/script.php?script_id=39
+"         http://www.vim.org/scripts/script.php?script_id=39
 "
 "    It is also packaged with Vim, in the $VIMRUNTIME/macros directory.
 "
@@ -109,16 +181,16 @@ unlet s:cpo_save
 " 4. Ensure this file (ftplugin/ruby.vim) is installed.
 "
 " 5. Ensure you have this line in your $HOME/.vimrc:
-"	  filetype plugin on
+"         filetype plugin on
 "
 " 6. Restart Vim and create the matchit documentation:
 "
-"	  :helptags ~/.vim/doc
+"         :helptags ~/.vim/doc
 "
 "    Now you can do ":help matchit", and you should be able to use "%" on Ruby
-"    keywords.	Try ":echo b:match_words" to be sure.
+"    keywords.  Try ":echo b:match_words" to be sure.
 "
-" Thanks to Mark J. Reed for the instructions.	See ":help vimrc" for the
+" Thanks to Mark J. Reed for the instructions.  See ":help vimrc" for the
 " locations of plugin directories, etc., as there are several options, and it
 " differs on Windows.  Email gsinclair@soyabean.com.au if you need help.
 "