Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 1 | " Vim filetype plugin |
Bram Moolenaar | c6249bb | 2006-04-15 20:25:09 +0000 | [diff] [blame] | 2 | " Language: Ruby |
Bram Moolenaar | ec7944a | 2013-06-12 21:29:15 +0200 | [diff] [blame] | 3 | " Maintainer: Tim Pope <vimNOSPAM@tpope.org> |
| 4 | " URL: https://github.com/vim-ruby/vim-ruby |
Bram Moolenaar | d09091d | 2019-01-17 16:07:22 +0100 | [diff] [blame] | 5 | " Release Coordinator: Doug Kearns <dougkearns@gmail.com> |
Bram Moolenaar | 4d8f476 | 2021-06-27 15:18:56 +0200 | [diff] [blame] | 6 | " Last Change: 2020 Feb 13 |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 7 | |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 8 | if (exists("b:did_ftplugin")) |
Bram Moolenaar | 60a795a | 2005-09-16 21:55:43 +0000 | [diff] [blame] | 9 | finish |
Bram Moolenaar | 071d427 | 2004-06-13 20:20:40 +0000 | [diff] [blame] | 10 | endif |
| 11 | let b:did_ftplugin = 1 |
| 12 | |
Bram Moolenaar | 60a795a | 2005-09-16 21:55:43 +0000 | [diff] [blame] | 13 | let s:cpo_save = &cpo |
| 14 | set cpo&vim |
| 15 | |
Bram Moolenaar | 756ec0f | 2007-05-05 17:59:48 +0000 | [diff] [blame] | 16 | if has("gui_running") && !has("gui_win32") |
Bram Moolenaar | ec7944a | 2013-06-12 21:29:15 +0200 | [diff] [blame] | 17 | setlocal keywordprg=ri\ -T\ -f\ bs |
Bram Moolenaar | 756ec0f | 2007-05-05 17:59:48 +0000 | [diff] [blame] | 18 | else |
| 19 | setlocal keywordprg=ri |
| 20 | endif |
| 21 | |
Bram Moolenaar | 60a795a | 2005-09-16 21:55:43 +0000 | [diff] [blame] | 22 | " Matchit support |
| 23 | if exists("loaded_matchit") && !exists("b:match_words") |
| 24 | let b:match_ignorecase = 0 |
| 25 | |
Bram Moolenaar | 756ec0f | 2007-05-05 17:59:48 +0000 | [diff] [blame] | 26 | let b:match_words = |
Bram Moolenaar | 2ed639a | 2019-12-09 23:11:18 +0100 | [diff] [blame] | 27 | \ '{\|\<\%(if\|unless\|case\|while\|until\|for\|do\|class\|module\|def\|=\@<!begin\)\>=\@!' . |
Bram Moolenaar | 756ec0f | 2007-05-05 17:59:48 +0000 | [diff] [blame] | 28 | \ ':' . |
Bram Moolenaar | 79166c4 | 2007-05-10 18:29:51 +0000 | [diff] [blame] | 29 | \ '\<\%(else\|elsif\|ensure\|when\|rescue\|break\|redo\|next\|retry\)\>' . |
Bram Moolenaar | 756ec0f | 2007-05-05 17:59:48 +0000 | [diff] [blame] | 30 | \ ':' . |
Bram Moolenaar | 2ed639a | 2019-12-09 23:11:18 +0100 | [diff] [blame] | 31 | \ '}\|\%(^\|[^.\:@$=]\)\@<=\<end\:\@!\>' . |
| 32 | \ ',^=begin\>:^=end\>,' . |
| 33 | \ ',\[:\],(:)' |
Bram Moolenaar | 60a795a | 2005-09-16 21:55:43 +0000 | [diff] [blame] | 34 | |
| 35 | let b:match_skip = |
Bram Moolenaar | 756ec0f | 2007-05-05 17:59:48 +0000 | [diff] [blame] | 36 | \ "synIDattr(synID(line('.'),col('.'),0),'name') =~ '" . |
Bram Moolenaar | 2ed639a | 2019-12-09 23:11:18 +0100 | [diff] [blame] | 37 | \ "\\<ruby\\%(String\\|.\+Delimiter\\|Character\\|.\+Escape\\|" . |
| 38 | \ "Regexp\\|Interpolation\\|Comment\\|Documentation\\|" . |
| 39 | \ "ConditionalModifier\\|RepeatModifier\\|RescueModifier\\|OptionalDo\\|" . |
| 40 | \ "MethodName\\|BlockArgument\\|KeywordAsMethod\\|ClassVariable\\|" . |
Bram Moolenaar | 79166c4 | 2007-05-10 18:29:51 +0000 | [diff] [blame] | 41 | \ "InstanceVariable\\|GlobalVariable\\|Symbol\\)\\>'" |
Bram Moolenaar | 60a795a | 2005-09-16 21:55:43 +0000 | [diff] [blame] | 42 | endif |
| 43 | |
| 44 | setlocal formatoptions-=t formatoptions+=croql |
| 45 | |
Bram Moolenaar | ec7944a | 2013-06-12 21:29:15 +0200 | [diff] [blame] | 46 | setlocal include=^\\s*\\<\\(load\\>\\\|require\\>\\\|autoload\\s*:\\=[\"']\\=\\h\\w*[\"']\\=,\\) |
Bram Moolenaar | 60a795a | 2005-09-16 21:55:43 +0000 | [diff] [blame] | 47 | setlocal suffixesadd=.rb |
Bram Moolenaar | c6249bb | 2006-04-15 20:25:09 +0000 | [diff] [blame] | 48 | |
Bram Moolenaar | 756ec0f | 2007-05-05 17:59:48 +0000 | [diff] [blame] | 49 | if exists("&ofu") && has("ruby") |
Bram Moolenaar | c6249bb | 2006-04-15 20:25:09 +0000 | [diff] [blame] | 50 | setlocal omnifunc=rubycomplete#Complete |
| 51 | endif |
Bram Moolenaar | 60a795a | 2005-09-16 21:55:43 +0000 | [diff] [blame] | 52 | |
| 53 | " TODO: |
| 54 | "setlocal define=^\\s*def |
| 55 | |
| 56 | setlocal comments=:# |
| 57 | setlocal commentstring=#\ %s |
| 58 | |
Bram Moolenaar | ec7944a | 2013-06-12 21:29:15 +0200 | [diff] [blame] | 59 | if !exists('g:ruby_version_paths') |
| 60 | let g:ruby_version_paths = {} |
| 61 | endif |
| 62 | |
Bram Moolenaar | 89bcfda | 2016-08-30 23:26:57 +0200 | [diff] [blame] | 63 | function! s:query_path(root) abort |
Bram Moolenaar | ec7944a | 2013-06-12 21:29:15 +0200 | [diff] [blame] | 64 | let code = "print $:.join %q{,}" |
Bram Moolenaar | d09091d | 2019-01-17 16:07:22 +0100 | [diff] [blame] | 65 | if &shell =~# 'sh' && empty(&shellxquote) |
Bram Moolenaar | 89bcfda | 2016-08-30 23:26:57 +0200 | [diff] [blame] | 66 | let prefix = 'env PATH='.shellescape($PATH).' ' |
Bram Moolenaar | 60a795a | 2005-09-16 21:55:43 +0000 | [diff] [blame] | 67 | else |
Bram Moolenaar | ec7944a | 2013-06-12 21:29:15 +0200 | [diff] [blame] | 68 | let prefix = '' |
| 69 | endif |
| 70 | if &shellxquote == "'" |
Bram Moolenaar | 89bcfda | 2016-08-30 23:26:57 +0200 | [diff] [blame] | 71 | let path_check = prefix.'ruby --disable-gems -e "' . code . '"' |
Bram Moolenaar | ec7944a | 2013-06-12 21:29:15 +0200 | [diff] [blame] | 72 | else |
Bram Moolenaar | 89bcfda | 2016-08-30 23:26:57 +0200 | [diff] [blame] | 73 | let path_check = prefix."ruby --disable-gems -e '" . code . "'" |
Bram Moolenaar | ec7944a | 2013-06-12 21:29:15 +0200 | [diff] [blame] | 74 | endif |
| 75 | |
| 76 | let cd = haslocaldir() ? 'lcd' : 'cd' |
Bram Moolenaar | 89bcfda | 2016-08-30 23:26:57 +0200 | [diff] [blame] | 77 | let cwd = fnameescape(getcwd()) |
Bram Moolenaar | ec7944a | 2013-06-12 21:29:15 +0200 | [diff] [blame] | 78 | try |
| 79 | exe cd fnameescape(a:root) |
| 80 | let path = split(system(path_check),',') |
Bram Moolenaar | 89bcfda | 2016-08-30 23:26:57 +0200 | [diff] [blame] | 81 | exe cd cwd |
Bram Moolenaar | ec7944a | 2013-06-12 21:29:15 +0200 | [diff] [blame] | 82 | return path |
| 83 | finally |
Bram Moolenaar | 89bcfda | 2016-08-30 23:26:57 +0200 | [diff] [blame] | 84 | exe cd cwd |
Bram Moolenaar | ec7944a | 2013-06-12 21:29:15 +0200 | [diff] [blame] | 85 | endtry |
| 86 | endfunction |
| 87 | |
Bram Moolenaar | 89bcfda | 2016-08-30 23:26:57 +0200 | [diff] [blame] | 88 | function! s:build_path(path) abort |
Bram Moolenaar | ec7944a | 2013-06-12 21:29:15 +0200 | [diff] [blame] | 89 | let path = join(map(copy(a:path), 'v:val ==# "." ? "" : v:val'), ',') |
Bram Moolenaar | 2ed639a | 2019-12-09 23:11:18 +0100 | [diff] [blame] | 90 | if &g:path !~# '\v^%(\.,)=%(/%(usr|emx)/include,)=,$' |
Bram Moolenaar | ec7944a | 2013-06-12 21:29:15 +0200 | [diff] [blame] | 91 | let path = substitute(&g:path,',,$',',','') . ',' . path |
| 92 | endif |
| 93 | return path |
| 94 | endfunction |
| 95 | |
| 96 | if !exists('b:ruby_version') && !exists('g:ruby_path') && isdirectory(expand('%:p:h')) |
| 97 | let s:version_file = findfile('.ruby-version', '.;') |
Bram Moolenaar | 89bcfda | 2016-08-30 23:26:57 +0200 | [diff] [blame] | 98 | if !empty(s:version_file) && filereadable(s:version_file) |
Bram Moolenaar | ec7944a | 2013-06-12 21:29:15 +0200 | [diff] [blame] | 99 | let b:ruby_version = get(readfile(s:version_file, '', 1), '') |
| 100 | if !has_key(g:ruby_version_paths, b:ruby_version) |
| 101 | let g:ruby_version_paths[b:ruby_version] = s:query_path(fnamemodify(s:version_file, ':p:h')) |
| 102 | endif |
Bram Moolenaar | 60a795a | 2005-09-16 21:55:43 +0000 | [diff] [blame] | 103 | endif |
| 104 | endif |
| 105 | |
Bram Moolenaar | ec7944a | 2013-06-12 21:29:15 +0200 | [diff] [blame] | 106 | if exists("g:ruby_path") |
| 107 | let s:ruby_path = type(g:ruby_path) == type([]) ? join(g:ruby_path, ',') : g:ruby_path |
| 108 | elseif has_key(g:ruby_version_paths, get(b:, 'ruby_version', '')) |
| 109 | let s:ruby_paths = g:ruby_version_paths[b:ruby_version] |
| 110 | let s:ruby_path = s:build_path(s:ruby_paths) |
| 111 | else |
| 112 | if !exists('g:ruby_default_path') |
| 113 | if has("ruby") && has("win32") |
| 114 | ruby ::VIM::command( 'let g:ruby_default_path = split("%s",",")' % $:.join(%q{,}) ) |
Bram Moolenaar | 4d8f476 | 2021-06-27 15:18:56 +0200 | [diff] [blame] | 115 | elseif executable('ruby') && !empty($HOME) |
Bram Moolenaar | ec7944a | 2013-06-12 21:29:15 +0200 | [diff] [blame] | 116 | let g:ruby_default_path = s:query_path($HOME) |
| 117 | else |
| 118 | let g:ruby_default_path = map(split($RUBYLIB,':'), 'v:val ==# "." ? "" : v:val') |
| 119 | endif |
| 120 | endif |
| 121 | let s:ruby_paths = g:ruby_default_path |
| 122 | let s:ruby_path = s:build_path(s:ruby_paths) |
| 123 | endif |
| 124 | |
| 125 | if stridx(&l:path, s:ruby_path) == -1 |
| 126 | let &l:path = s:ruby_path |
| 127 | endif |
| 128 | if exists('s:ruby_paths') && stridx(&l:tags, join(map(copy(s:ruby_paths),'v:val."/tags"'),',')) == -1 |
| 129 | let &l:tags = &tags . ',' . join(map(copy(s:ruby_paths),'v:val."/tags"'),',') |
| 130 | endif |
Bram Moolenaar | 60a795a | 2005-09-16 21:55:43 +0000 | [diff] [blame] | 131 | |
Bram Moolenaar | 89bcfda | 2016-08-30 23:26:57 +0200 | [diff] [blame] | 132 | if (has("gui_win32") || has("gui_gtk")) && !exists("b:browsefilter") |
Bram Moolenaar | 60a795a | 2005-09-16 21:55:43 +0000 | [diff] [blame] | 133 | let b:browsefilter = "Ruby Source Files (*.rb)\t*.rb\n" . |
Bram Moolenaar | 756ec0f | 2007-05-05 17:59:48 +0000 | [diff] [blame] | 134 | \ "All Files (*.*)\t*.*\n" |
Bram Moolenaar | 60a795a | 2005-09-16 21:55:43 +0000 | [diff] [blame] | 135 | endif |
| 136 | |
Bram Moolenaar | d09091d | 2019-01-17 16:07:22 +0100 | [diff] [blame] | 137 | let b:undo_ftplugin = "setl inc= sua= path= tags= fo< com< cms< kp=" |
Bram Moolenaar | 79166c4 | 2007-05-10 18:29:51 +0000 | [diff] [blame] | 138 | \."| unlet! b:browsefilter b:match_ignorecase b:match_words b:match_skip" |
| 139 | \."| if exists('&ofu') && has('ruby') | setl ofu< | endif" |
Bram Moolenaar | d09091d | 2019-01-17 16:07:22 +0100 | [diff] [blame] | 140 | |
| 141 | if get(g:, 'ruby_recommended_style', 1) |
| 142 | setlocal shiftwidth=2 softtabstop=2 expandtab |
| 143 | let b:undo_ftplugin .= ' | setl sw< sts< et<' |
| 144 | endif |
| 145 | |
| 146 | " To activate, :set ballooneval |
| 147 | if exists('+balloonexpr') && get(g:, 'ruby_balloonexpr') |
| 148 | setlocal balloonexpr=RubyBalloonexpr() |
| 149 | let b:undo_ftplugin .= "| setl bexpr=" |
| 150 | endif |
Bram Moolenaar | 79166c4 | 2007-05-10 18:29:51 +0000 | [diff] [blame] | 151 | |
Bram Moolenaar | 89bcfda | 2016-08-30 23:26:57 +0200 | [diff] [blame] | 152 | function! s:map(mode, flags, map) abort |
| 153 | let from = matchstr(a:map, '\S\+') |
| 154 | if empty(mapcheck(from, a:mode)) |
Bram Moolenaar | 2ed639a | 2019-12-09 23:11:18 +0100 | [diff] [blame] | 155 | exe a:mode.'map' '<buffer>' a:flags a:map |
Bram Moolenaar | 89bcfda | 2016-08-30 23:26:57 +0200 | [diff] [blame] | 156 | let b:undo_ftplugin .= '|sil! '.a:mode.'unmap <buffer> '.from |
| 157 | endif |
| 158 | endfunction |
| 159 | |
Bram Moolenaar | d09091d | 2019-01-17 16:07:22 +0100 | [diff] [blame] | 160 | cmap <buffer><script><expr> <Plug><ctag> substitute(RubyCursorTag(),'^$',"\022\027",'') |
Bram Moolenaar | 89bcfda | 2016-08-30 23:26:57 +0200 | [diff] [blame] | 161 | cmap <buffer><script><expr> <Plug><cfile> substitute(RubyCursorFile(),'^$',"\022\006",'') |
Bram Moolenaar | d09091d | 2019-01-17 16:07:22 +0100 | [diff] [blame] | 162 | let b:undo_ftplugin .= "| sil! cunmap <buffer> <Plug><ctag>| sil! cunmap <buffer> <Plug><cfile>" |
Bram Moolenaar | 89bcfda | 2016-08-30 23:26:57 +0200 | [diff] [blame] | 163 | |
Bram Moolenaar | 79166c4 | 2007-05-10 18:29:51 +0000 | [diff] [blame] | 164 | if !exists("g:no_plugin_maps") && !exists("g:no_ruby_maps") |
Bram Moolenaar | 89bcfda | 2016-08-30 23:26:57 +0200 | [diff] [blame] | 165 | nmap <buffer><script> <SID>: :<C-U> |
| 166 | nmap <buffer><script> <SID>c: :<C-U><C-R>=v:count ? v:count : ''<CR> |
| 167 | |
Bram Moolenaar | d09091d | 2019-01-17 16:07:22 +0100 | [diff] [blame] | 168 | nnoremap <silent> <buffer> [m :<C-U>call <SID>searchsyn('\<def\>',['rubyDefine'],'b','n')<CR> |
| 169 | nnoremap <silent> <buffer> ]m :<C-U>call <SID>searchsyn('\<def\>',['rubyDefine'],'','n')<CR> |
| 170 | nnoremap <silent> <buffer> [M :<C-U>call <SID>searchsyn('\<end\>',['rubyDefine'],'b','n')<CR> |
| 171 | nnoremap <silent> <buffer> ]M :<C-U>call <SID>searchsyn('\<end\>',['rubyDefine'],'','n')<CR> |
| 172 | xnoremap <silent> <buffer> [m :<C-U>call <SID>searchsyn('\<def\>',['rubyDefine'],'b','v')<CR> |
| 173 | xnoremap <silent> <buffer> ]m :<C-U>call <SID>searchsyn('\<def\>',['rubyDefine'],'','v')<CR> |
| 174 | xnoremap <silent> <buffer> [M :<C-U>call <SID>searchsyn('\<end\>',['rubyDefine'],'b','v')<CR> |
| 175 | xnoremap <silent> <buffer> ]M :<C-U>call <SID>searchsyn('\<end\>',['rubyDefine'],'','v')<CR> |
Bram Moolenaar | 79166c4 | 2007-05-10 18:29:51 +0000 | [diff] [blame] | 176 | |
Bram Moolenaar | d09091d | 2019-01-17 16:07:22 +0100 | [diff] [blame] | 177 | nnoremap <silent> <buffer> [[ :<C-U>call <SID>searchsyn('\<\%(class\<Bar>module\)\>',['rubyModule','rubyClass'],'b','n')<CR> |
| 178 | nnoremap <silent> <buffer> ]] :<C-U>call <SID>searchsyn('\<\%(class\<Bar>module\)\>',['rubyModule','rubyClass'],'','n')<CR> |
| 179 | nnoremap <silent> <buffer> [] :<C-U>call <SID>searchsyn('\<end\>',['rubyModule','rubyClass'],'b','n')<CR> |
| 180 | nnoremap <silent> <buffer> ][ :<C-U>call <SID>searchsyn('\<end\>',['rubyModule','rubyClass'],'','n')<CR> |
| 181 | xnoremap <silent> <buffer> [[ :<C-U>call <SID>searchsyn('\<\%(class\<Bar>module\)\>',['rubyModule','rubyClass'],'b','v')<CR> |
| 182 | xnoremap <silent> <buffer> ]] :<C-U>call <SID>searchsyn('\<\%(class\<Bar>module\)\>',['rubyModule','rubyClass'],'','v')<CR> |
| 183 | xnoremap <silent> <buffer> [] :<C-U>call <SID>searchsyn('\<end\>',['rubyModule','rubyClass'],'b','v')<CR> |
| 184 | xnoremap <silent> <buffer> ][ :<C-U>call <SID>searchsyn('\<end\>',['rubyModule','rubyClass'],'','v')<CR> |
Bram Moolenaar | 79166c4 | 2007-05-10 18:29:51 +0000 | [diff] [blame] | 185 | |
| 186 | let b:undo_ftplugin = b:undo_ftplugin |
| 187 | \."| sil! exe 'unmap <buffer> [[' | sil! exe 'unmap <buffer> ]]' | sil! exe 'unmap <buffer> []' | sil! exe 'unmap <buffer> ]['" |
| 188 | \."| sil! exe 'unmap <buffer> [m' | sil! exe 'unmap <buffer> ]m' | sil! exe 'unmap <buffer> [M' | sil! exe 'unmap <buffer> ]M'" |
Bram Moolenaar | 1d68952 | 2010-05-28 20:54:39 +0200 | [diff] [blame] | 189 | |
Bram Moolenaar | 89bcfda | 2016-08-30 23:26:57 +0200 | [diff] [blame] | 190 | if maparg('im','x') == '' && maparg('im','o') == '' && maparg('am','x') == '' && maparg('am','o') == '' |
Bram Moolenaar | ec7944a | 2013-06-12 21:29:15 +0200 | [diff] [blame] | 191 | onoremap <silent> <buffer> im :<C-U>call <SID>wrap_i('[m',']M')<CR> |
| 192 | onoremap <silent> <buffer> am :<C-U>call <SID>wrap_a('[m',']M')<CR> |
| 193 | xnoremap <silent> <buffer> im :<C-U>call <SID>wrap_i('[m',']M')<CR> |
| 194 | xnoremap <silent> <buffer> am :<C-U>call <SID>wrap_a('[m',']M')<CR> |
| 195 | let b:undo_ftplugin = b:undo_ftplugin |
| 196 | \."| sil! exe 'ounmap <buffer> im' | sil! exe 'ounmap <buffer> am'" |
| 197 | \."| sil! exe 'xunmap <buffer> im' | sil! exe 'xunmap <buffer> am'" |
| 198 | endif |
| 199 | |
Bram Moolenaar | 89bcfda | 2016-08-30 23:26:57 +0200 | [diff] [blame] | 200 | if maparg('iM','x') == '' && maparg('iM','o') == '' && maparg('aM','x') == '' && maparg('aM','o') == '' |
Bram Moolenaar | ec7944a | 2013-06-12 21:29:15 +0200 | [diff] [blame] | 201 | onoremap <silent> <buffer> iM :<C-U>call <SID>wrap_i('[[','][')<CR> |
| 202 | onoremap <silent> <buffer> aM :<C-U>call <SID>wrap_a('[[','][')<CR> |
| 203 | xnoremap <silent> <buffer> iM :<C-U>call <SID>wrap_i('[[','][')<CR> |
| 204 | xnoremap <silent> <buffer> aM :<C-U>call <SID>wrap_a('[[','][')<CR> |
| 205 | let b:undo_ftplugin = b:undo_ftplugin |
| 206 | \."| sil! exe 'ounmap <buffer> iM' | sil! exe 'ounmap <buffer> aM'" |
| 207 | \."| sil! exe 'xunmap <buffer> iM' | sil! exe 'xunmap <buffer> aM'" |
| 208 | endif |
| 209 | |
Bram Moolenaar | 89bcfda | 2016-08-30 23:26:57 +0200 | [diff] [blame] | 210 | call s:map('c', '', '<C-R><C-F> <Plug><cfile>') |
Bram Moolenaar | ec7944a | 2013-06-12 21:29:15 +0200 | [diff] [blame] | 211 | |
Bram Moolenaar | 89bcfda | 2016-08-30 23:26:57 +0200 | [diff] [blame] | 212 | cmap <buffer><script><expr> <SID>tagzv &foldopen =~# 'tag' ? '<Bar>norm! zv' : '' |
Bram Moolenaar | d09091d | 2019-01-17 16:07:22 +0100 | [diff] [blame] | 213 | call s:map('n', '<silent>', '<C-]> <SID>:exe v:count1."tag <Plug><ctag>"<SID>tagzv<CR>') |
| 214 | call s:map('n', '<silent>', 'g<C-]> <SID>:exe "tjump <Plug><ctag>"<SID>tagzv<CR>') |
| 215 | call s:map('n', '<silent>', 'g] <SID>:exe "tselect <Plug><ctag>"<SID>tagzv<CR>') |
| 216 | call s:map('n', '<silent>', '<C-W>] <SID>:exe v:count1."stag <Plug><ctag>"<SID>tagzv<CR>') |
| 217 | call s:map('n', '<silent>', '<C-W><C-]> <SID>:exe v:count1."stag <Plug><ctag>"<SID>tagzv<CR>') |
| 218 | call s:map('n', '<silent>', '<C-W>g<C-]> <SID>:exe "stjump <Plug><ctag>"<SID>tagzv<CR>') |
| 219 | call s:map('n', '<silent>', '<C-W>g] <SID>:exe "stselect <Plug><ctag>"<SID>tagzv<CR>') |
| 220 | call s:map('n', '<silent>', '<C-W>} <SID>:exe v:count1."ptag <Plug><ctag>"<CR>') |
| 221 | call s:map('n', '<silent>', '<C-W>g} <SID>:exe "ptjump <Plug><ctag>"<CR>') |
Bram Moolenaar | 89bcfda | 2016-08-30 23:26:57 +0200 | [diff] [blame] | 222 | |
| 223 | call s:map('n', '<silent>', 'gf <SID>c:find <Plug><cfile><CR>') |
| 224 | call s:map('n', '<silent>', '<C-W>f <SID>c:sfind <Plug><cfile><CR>') |
| 225 | call s:map('n', '<silent>', '<C-W><C-F> <SID>c:sfind <Plug><cfile><CR>') |
| 226 | call s:map('n', '<silent>', '<C-W>gf <SID>c:tabfind <Plug><cfile><CR>') |
Bram Moolenaar | 79166c4 | 2007-05-10 18:29:51 +0000 | [diff] [blame] | 227 | endif |
Bram Moolenaar | 60a795a | 2005-09-16 21:55:43 +0000 | [diff] [blame] | 228 | |
| 229 | let &cpo = s:cpo_save |
| 230 | unlet s:cpo_save |
| 231 | |
Bram Moolenaar | 756ec0f | 2007-05-05 17:59:48 +0000 | [diff] [blame] | 232 | if exists("g:did_ruby_ftplugin_functions") |
| 233 | finish |
| 234 | endif |
| 235 | let g:did_ruby_ftplugin_functions = 1 |
| 236 | |
Bram Moolenaar | 89bcfda | 2016-08-30 23:26:57 +0200 | [diff] [blame] | 237 | function! RubyBalloonexpr() abort |
Bram Moolenaar | 756ec0f | 2007-05-05 17:59:48 +0000 | [diff] [blame] | 238 | if !exists('s:ri_found') |
| 239 | let s:ri_found = executable('ri') |
| 240 | endif |
| 241 | if s:ri_found |
| 242 | let line = getline(v:beval_lnum) |
| 243 | let b = matchstr(strpart(line,0,v:beval_col),'\%(\w\|[:.]\)*$') |
| 244 | let a = substitute(matchstr(strpart(line,v:beval_col),'^\w*\%([?!]\|\s*=\)\?'),'\s\+','','g') |
| 245 | let str = b.a |
| 246 | let before = strpart(line,0,v:beval_col-strlen(b)) |
| 247 | let after = strpart(line,v:beval_col+strlen(a)) |
| 248 | if str =~ '^\.' |
| 249 | let str = substitute(str,'^\.','#','g') |
| 250 | if before =~ '\]\s*$' |
| 251 | let str = 'Array'.str |
| 252 | elseif before =~ '}\s*$' |
| 253 | " False positives from blocks here |
| 254 | let str = 'Hash'.str |
| 255 | elseif before =~ "[\"'`]\\s*$" || before =~ '\$\d\+\s*$' |
| 256 | let str = 'String'.str |
| 257 | elseif before =~ '\$\d\+\.\d\+\s*$' |
| 258 | let str = 'Float'.str |
| 259 | elseif before =~ '\$\d\+\s*$' |
| 260 | let str = 'Integer'.str |
| 261 | elseif before =~ '/\s*$' |
| 262 | let str = 'Regexp'.str |
| 263 | else |
| 264 | let str = substitute(str,'^#','.','') |
| 265 | endif |
| 266 | endif |
| 267 | let str = substitute(str,'.*\.\s*to_f\s*\.\s*','Float#','') |
| 268 | let str = substitute(str,'.*\.\s*to_i\%(nt\)\=\s*\.\s*','Integer#','') |
| 269 | let str = substitute(str,'.*\.\s*to_s\%(tr\)\=\s*\.\s*','String#','') |
| 270 | let str = substitute(str,'.*\.\s*to_sym\s*\.\s*','Symbol#','') |
| 271 | let str = substitute(str,'.*\.\s*to_a\%(ry\)\=\s*\.\s*','Array#','') |
| 272 | let str = substitute(str,'.*\.\s*to_proc\s*\.\s*','Proc#','') |
| 273 | if str !~ '^\w' |
| 274 | return '' |
| 275 | endif |
Bram Moolenaar | ec7944a | 2013-06-12 21:29:15 +0200 | [diff] [blame] | 276 | silent! let res = substitute(system("ri -f rdoc -T \"".str.'"'),'\n$','','') |
Bram Moolenaar | 79166c4 | 2007-05-10 18:29:51 +0000 | [diff] [blame] | 277 | if res =~ '^Nothing known about' || res =~ '^Bad argument:' || res =~ '^More than one method' |
Bram Moolenaar | 756ec0f | 2007-05-05 17:59:48 +0000 | [diff] [blame] | 278 | return '' |
| 279 | endif |
| 280 | return res |
| 281 | else |
| 282 | return "" |
| 283 | endif |
| 284 | endfunction |
| 285 | |
Bram Moolenaar | 89bcfda | 2016-08-30 23:26:57 +0200 | [diff] [blame] | 286 | function! s:searchsyn(pattern, syn, flags, mode) abort |
| 287 | let cnt = v:count1 |
Bram Moolenaar | ec7944a | 2013-06-12 21:29:15 +0200 | [diff] [blame] | 288 | norm! m' |
| 289 | if a:mode ==# 'v' |
| 290 | norm! gv |
| 291 | endif |
| 292 | let i = 0 |
Bram Moolenaar | d09091d | 2019-01-17 16:07:22 +0100 | [diff] [blame] | 293 | call map(a:syn, 'hlID(v:val)') |
Bram Moolenaar | ec7944a | 2013-06-12 21:29:15 +0200 | [diff] [blame] | 294 | while i < cnt |
| 295 | let i = i + 1 |
| 296 | let line = line('.') |
| 297 | let col = col('.') |
| 298 | let pos = search(a:pattern,'W'.a:flags) |
Bram Moolenaar | d09091d | 2019-01-17 16:07:22 +0100 | [diff] [blame] | 299 | while pos != 0 && index(a:syn, s:synid()) < 0 |
Bram Moolenaar | ec7944a | 2013-06-12 21:29:15 +0200 | [diff] [blame] | 300 | let pos = search(a:pattern,'W'.a:flags) |
Bram Moolenaar | 79166c4 | 2007-05-10 18:29:51 +0000 | [diff] [blame] | 301 | endwhile |
Bram Moolenaar | ec7944a | 2013-06-12 21:29:15 +0200 | [diff] [blame] | 302 | if pos == 0 |
| 303 | call cursor(line,col) |
| 304 | return |
| 305 | endif |
| 306 | endwhile |
Bram Moolenaar | 79166c4 | 2007-05-10 18:29:51 +0000 | [diff] [blame] | 307 | endfunction |
| 308 | |
Bram Moolenaar | d09091d | 2019-01-17 16:07:22 +0100 | [diff] [blame] | 309 | function! s:synid() abort |
| 310 | return synID(line('.'),col('.'),0) |
Bram Moolenaar | ec7944a | 2013-06-12 21:29:15 +0200 | [diff] [blame] | 311 | endfunction |
| 312 | |
Bram Moolenaar | 89bcfda | 2016-08-30 23:26:57 +0200 | [diff] [blame] | 313 | function! s:wrap_i(back,forward) abort |
Bram Moolenaar | 2ed639a | 2019-12-09 23:11:18 +0100 | [diff] [blame] | 314 | execute 'norm! k' |
| 315 | execute 'norm '.a:forward |
Bram Moolenaar | ec7944a | 2013-06-12 21:29:15 +0200 | [diff] [blame] | 316 | let line = line('.') |
| 317 | execute 'norm '.a:back |
| 318 | if line('.') == line - 1 |
| 319 | return s:wrap_a(a:back,a:forward) |
| 320 | endif |
Bram Moolenaar | 2ed639a | 2019-12-09 23:11:18 +0100 | [diff] [blame] | 321 | execute 'norm! jV' |
| 322 | execute 'norm '.a:forward |
| 323 | execute 'norm! k' |
Bram Moolenaar | ec7944a | 2013-06-12 21:29:15 +0200 | [diff] [blame] | 324 | endfunction |
| 325 | |
Bram Moolenaar | 89bcfda | 2016-08-30 23:26:57 +0200 | [diff] [blame] | 326 | function! s:wrap_a(back,forward) abort |
Bram Moolenaar | ec7944a | 2013-06-12 21:29:15 +0200 | [diff] [blame] | 327 | execute 'norm '.a:forward |
| 328 | if line('.') < line('$') && getline(line('.')+1) ==# '' |
| 329 | let after = 1 |
| 330 | endif |
| 331 | execute 'norm '.a:back |
| 332 | while getline(line('.')-1) =~# '^\s*#' && line('.') |
| 333 | - |
| 334 | endwhile |
| 335 | if exists('after') |
Bram Moolenaar | 2ed639a | 2019-12-09 23:11:18 +0100 | [diff] [blame] | 336 | execute 'norm! V' |
| 337 | execute 'norm '.a:forward |
| 338 | execute 'norm! j' |
Bram Moolenaar | ec7944a | 2013-06-12 21:29:15 +0200 | [diff] [blame] | 339 | elseif line('.') > 1 && getline(line('.')-1) =~# '^\s*$' |
Bram Moolenaar | 2ed639a | 2019-12-09 23:11:18 +0100 | [diff] [blame] | 340 | execute 'norm! kV' |
| 341 | execute 'norm '.a:forward |
Bram Moolenaar | ec7944a | 2013-06-12 21:29:15 +0200 | [diff] [blame] | 342 | else |
Bram Moolenaar | 2ed639a | 2019-12-09 23:11:18 +0100 | [diff] [blame] | 343 | execute 'norm! V' |
| 344 | execute 'norm '.a:forward |
Bram Moolenaar | ec7944a | 2013-06-12 21:29:15 +0200 | [diff] [blame] | 345 | endif |
Bram Moolenaar | 79166c4 | 2007-05-10 18:29:51 +0000 | [diff] [blame] | 346 | endfunction |
Bram Moolenaar | 756ec0f | 2007-05-05 17:59:48 +0000 | [diff] [blame] | 347 | |
Bram Moolenaar | 89bcfda | 2016-08-30 23:26:57 +0200 | [diff] [blame] | 348 | function! RubyCursorIdentifier() abort |
Bram Moolenaar | 1d68952 | 2010-05-28 20:54:39 +0200 | [diff] [blame] | 349 | let asciicode = '\%(\w\|[]})\"'."'".']\)\@<!\%(?\%(\\M-\\C-\|\\C-\\M-\|\\M-\\c\|\\c\\M-\|\\c\|\\C-\|\\M-\)\=\%(\\\o\{1,3}\|\\x\x\{1,2}\|\\\=\S\)\)' |
| 350 | let number = '\%(\%(\w\|[]})\"'."'".']\s*\)\@<!-\)\=\%(\<[[:digit:]_]\+\%(\.[[:digit:]_]\+\)\=\%([Ee][[:digit:]_]\+\)\=\>\|\<0[xXbBoOdD][[:xdigit:]_]\+\>\)\|'.asciicode |
| 351 | let operator = '\%(\[\]\|<<\|<=>\|[!<>]=\=\|===\=\|[!=]\~\|>>\|\*\*\|\.\.\.\=\|=>\|[~^&|*/%+-]\)' |
Bram Moolenaar | 89bcfda | 2016-08-30 23:26:57 +0200 | [diff] [blame] | 352 | let method = '\%(\.[_a-zA-Z]\w*\s*=>\@!\|\<[_a-zA-Z]\w*\>[?!]\=\)' |
Bram Moolenaar | 1d68952 | 2010-05-28 20:54:39 +0200 | [diff] [blame] | 353 | let global = '$\%([!$&"'."'".'*+,./:;<=>?@\`~]\|-\=\w\+\>\)' |
| 354 | let symbolizable = '\%(\%(@@\=\)\w\+\>\|'.global.'\|'.method.'\|'.operator.'\)' |
| 355 | let pattern = '\C\s*\%('.number.'\|\%(:\@<!:\)\='.symbolizable.'\)' |
| 356 | let [lnum, col] = searchpos(pattern,'bcn',line('.')) |
| 357 | let raw = matchstr(getline('.')[col-1 : ],pattern) |
Bram Moolenaar | 89bcfda | 2016-08-30 23:26:57 +0200 | [diff] [blame] | 358 | let stripped = substitute(substitute(raw,'\s\+=$','=',''),'^\s*[:.]\=','','') |
Bram Moolenaar | 1d68952 | 2010-05-28 20:54:39 +0200 | [diff] [blame] | 359 | return stripped == '' ? expand("<cword>") : stripped |
| 360 | endfunction |
| 361 | |
Bram Moolenaar | d09091d | 2019-01-17 16:07:22 +0100 | [diff] [blame] | 362 | function! RubyCursorTag() abort |
| 363 | return substitute(RubyCursorIdentifier(), '^[$@]*', '', '') |
| 364 | endfunction |
| 365 | |
Bram Moolenaar | 89bcfda | 2016-08-30 23:26:57 +0200 | [diff] [blame] | 366 | function! RubyCursorFile() abort |
| 367 | let isfname = &isfname |
| 368 | try |
| 369 | set isfname+=: |
| 370 | let cfile = expand('<cfile>') |
| 371 | finally |
| 372 | let isfname = &isfname |
| 373 | endtry |
| 374 | let pre = matchstr(strpart(getline('.'), 0, col('.')-1), '.*\f\@<!') |
| 375 | let post = matchstr(strpart(getline('.'), col('.')), '\f\@!.*') |
Bram Moolenaar | d09091d | 2019-01-17 16:07:22 +0100 | [diff] [blame] | 376 | if s:synid() ==# hlID('rubyConstant') |
Bram Moolenaar | 89bcfda | 2016-08-30 23:26:57 +0200 | [diff] [blame] | 377 | let cfile = substitute(cfile,'\.\w\+[?!=]\=$','','') |
Bram Moolenaar | d09091d | 2019-01-17 16:07:22 +0100 | [diff] [blame] | 378 | let cfile = substitute(cfile,'^::','','') |
Bram Moolenaar | 89bcfda | 2016-08-30 23:26:57 +0200 | [diff] [blame] | 379 | let cfile = substitute(cfile,'::','/','g') |
| 380 | let cfile = substitute(cfile,'\(\u\+\)\(\u\l\)','\1_\2', 'g') |
| 381 | let cfile = substitute(cfile,'\(\l\|\d\)\(\u\)','\1_\2', 'g') |
| 382 | return tolower(cfile) . '.rb' |
| 383 | elseif getline('.') =~# '^\s*require_relative\s*\(["'']\).*\1\s*$' |
Bram Moolenaar | 2ed639a | 2019-12-09 23:11:18 +0100 | [diff] [blame] | 384 | let cfile = expand('%:p:h') . '/' . matchstr(getline('.'),'\(["'']\)\zs.\{-\}\ze\1') |
| 385 | let cfile .= cfile !~# '\.rb$' ? '.rb' : '' |
Bram Moolenaar | 89bcfda | 2016-08-30 23:26:57 +0200 | [diff] [blame] | 386 | elseif getline('.') =~# '^\s*\%(require[( ]\|load[( ]\|autoload[( ]:\w\+,\)\s*\%(::\)\=File\.expand_path(\(["'']\)\.\./.*\1,\s*__FILE__)\s*$' |
| 387 | let target = matchstr(getline('.'),'\(["'']\)\.\.\zs/.\{-\}\ze\1') |
Bram Moolenaar | 2ed639a | 2019-12-09 23:11:18 +0100 | [diff] [blame] | 388 | let cfile = expand('%:p:h') . target |
| 389 | let cfile .= cfile !~# '\.rb$' ? '.rb' : '' |
Bram Moolenaar | ec7944a | 2013-06-12 21:29:15 +0200 | [diff] [blame] | 390 | elseif getline('.') =~# '^\s*\%(require \|load \|autoload :\w\+,\)\s*\(["'']\).*\1\s*$' |
Bram Moolenaar | 2ed639a | 2019-12-09 23:11:18 +0100 | [diff] [blame] | 391 | let cfile = matchstr(getline('.'),'\(["'']\)\zs.\{-\}\ze\1') |
| 392 | let cfile .= cfile !~# '\.rb$' ? '.rb' : '' |
Bram Moolenaar | 89bcfda | 2016-08-30 23:26:57 +0200 | [diff] [blame] | 393 | elseif pre.post =~# '\<File.expand_path[( ].*[''"]\{2\}, *__FILE__\>' && cfile =~# '^\.\.' |
| 394 | let cfile = expand('%:p:h') . strpart(cfile, 2) |
Bram Moolenaar | ec7944a | 2013-06-12 21:29:15 +0200 | [diff] [blame] | 395 | else |
Bram Moolenaar | 89bcfda | 2016-08-30 23:26:57 +0200 | [diff] [blame] | 396 | return substitute(cfile, '\C\v^(.*):(\d+)%(:in)=$', '+\2 \1', '') |
Bram Moolenaar | ec7944a | 2013-06-12 21:29:15 +0200 | [diff] [blame] | 397 | endif |
Bram Moolenaar | 89bcfda | 2016-08-30 23:26:57 +0200 | [diff] [blame] | 398 | let cwdpat = '^\M' . substitute(getcwd(), '[\/]', '\\[\\/]', 'g').'\ze\[\/]' |
| 399 | let cfile = substitute(cfile, cwdpat, '.', '') |
| 400 | if fnameescape(cfile) !=# cfile |
| 401 | return '+ '.fnameescape(cfile) |
Bram Moolenaar | ec7944a | 2013-06-12 21:29:15 +0200 | [diff] [blame] | 402 | else |
Bram Moolenaar | 89bcfda | 2016-08-30 23:26:57 +0200 | [diff] [blame] | 403 | return cfile |
Bram Moolenaar | ec7944a | 2013-06-12 21:29:15 +0200 | [diff] [blame] | 404 | endif |
| 405 | endfunction |
| 406 | |
Bram Moolenaar | 60a795a | 2005-09-16 21:55:43 +0000 | [diff] [blame] | 407 | " |
| 408 | " Instructions for enabling "matchit" support: |
| 409 | " |
| 410 | " 1. Look for the latest "matchit" plugin at |
| 411 | " |
Bram Moolenaar | 756ec0f | 2007-05-05 17:59:48 +0000 | [diff] [blame] | 412 | " http://www.vim.org/scripts/script.php?script_id=39 |
Bram Moolenaar | 60a795a | 2005-09-16 21:55:43 +0000 | [diff] [blame] | 413 | " |
| 414 | " It is also packaged with Vim, in the $VIMRUNTIME/macros directory. |
| 415 | " |
| 416 | " 2. Copy "matchit.txt" into a "doc" directory (e.g. $HOME/.vim/doc). |
| 417 | " |
| 418 | " 3. Copy "matchit.vim" into a "plugin" directory (e.g. $HOME/.vim/plugin). |
| 419 | " |
| 420 | " 4. Ensure this file (ftplugin/ruby.vim) is installed. |
| 421 | " |
| 422 | " 5. Ensure you have this line in your $HOME/.vimrc: |
Bram Moolenaar | 756ec0f | 2007-05-05 17:59:48 +0000 | [diff] [blame] | 423 | " filetype plugin on |
Bram Moolenaar | 60a795a | 2005-09-16 21:55:43 +0000 | [diff] [blame] | 424 | " |
| 425 | " 6. Restart Vim and create the matchit documentation: |
| 426 | " |
Bram Moolenaar | 756ec0f | 2007-05-05 17:59:48 +0000 | [diff] [blame] | 427 | " :helptags ~/.vim/doc |
Bram Moolenaar | 60a795a | 2005-09-16 21:55:43 +0000 | [diff] [blame] | 428 | " |
| 429 | " Now you can do ":help matchit", and you should be able to use "%" on Ruby |
Bram Moolenaar | 756ec0f | 2007-05-05 17:59:48 +0000 | [diff] [blame] | 430 | " keywords. Try ":echo b:match_words" to be sure. |
Bram Moolenaar | 60a795a | 2005-09-16 21:55:43 +0000 | [diff] [blame] | 431 | " |
Bram Moolenaar | 756ec0f | 2007-05-05 17:59:48 +0000 | [diff] [blame] | 432 | " Thanks to Mark J. Reed for the instructions. See ":help vimrc" for the |
Bram Moolenaar | 60a795a | 2005-09-16 21:55:43 +0000 | [diff] [blame] | 433 | " locations of plugin directories, etc., as there are several options, and it |
| 434 | " differs on Windows. Email gsinclair@soyabean.com.au if you need help. |
| 435 | " |
| 436 | |
Bram Moolenaar | 446cb83 | 2008-06-24 21:56:24 +0000 | [diff] [blame] | 437 | " vim: nowrap sw=2 sts=2 ts=8: |