xref: /vim-8.2.3635/runtime/ftplugin/ruby.vim (revision 446cb837)
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