diff --git a/ftdetect/ruby.vim b/ftdetect/ruby.vim deleted file mode 100644 index a4e9a6d..0000000 --- a/ftdetect/ruby.vim +++ /dev/null @@ -1,62 +0,0 @@ -" Ruby -au BufNewFile,BufRead *.rb,*.rbw,*.gemspec set filetype=ruby - -" Ruby on Rails -au BufNewFile,BufRead *.builder,*.rxml,*.rjs set filetype=ruby - -" Rakefile -au BufNewFile,BufRead [rR]akefile,*.rake set filetype=ruby - -" Rantfile -au BufNewFile,BufRead [rR]antfile,*.rant set filetype=ruby - -" IRB config -au BufNewFile,BufRead .irbrc,irbrc set filetype=ruby - -" Pry config -au BufNewFile,BufRead .pryrc set filetype=ruby - -" Rackup -au BufNewFile,BufRead *.ru set filetype=ruby - -" Capistrano -au BufNewFile,BufRead Capfile set filetype=ruby - -" Bundler -au BufNewFile,BufRead Gemfile set filetype=ruby - -" Guard -au BufNewFile,BufRead Guardfile,.Guardfile set filetype=ruby - -" Chef -au BufNewFile,BufRead Cheffile set filetype=ruby -au BufNewFile,BufRead Berksfile set filetype=ruby - -" Vagrant -au BufNewFile,BufRead [vV]agrantfile set filetype=ruby - -" Autotest -au BufNewFile,BufRead .autotest set filetype=ruby - -" eRuby -au BufNewFile,BufRead *.erb,*.rhtml set filetype=eruby - -" Thor -au BufNewFile,BufRead [tT]horfile,*.thor set filetype=ruby - -" Rabl -au BufNewFile,BufRead *.rabl set filetype=ruby - -" Jbuilder -au BufNewFile,BufRead *.jbuilder set filetype=ruby - -" Puppet librarian -au BufNewFile,BufRead Puppetfile set filetype=ruby -" -" Buildr Buildfile -au BufNewFile,BufRead [Bb]uildfile set filetype=ruby - -" Appraisal -au BufNewFile,BufRead Appraisals set filetype=ruby - -" vim: nowrap sw=2 sts=2 ts=8 noet: diff --git a/ftplugin/eruby.vim b/ftplugin/eruby.vim deleted file mode 100644 index 9bb8e86..0000000 --- a/ftplugin/eruby.vim +++ /dev/null @@ -1,102 +0,0 @@ -" Vim filetype plugin -" Language: eRuby -" Maintainer: Tim Pope -" URL: https://github.com/vim-ruby/vim-ruby -" Release Coordinator: Doug Kearns - -" Only do this when not done yet for this buffer -if exists("b:did_ftplugin") - finish -endif - -let s:save_cpo = &cpo -set cpo-=C - -" Define some defaults in case the included ftplugins don't set them. -let s:undo_ftplugin = "" -let s:browsefilter = "All Files (*.*)\t*.*\n" -let s:match_words = "" - -if !exists("g:eruby_default_subtype") - let g:eruby_default_subtype = "html" -endif - -if &filetype =~ '^eruby\.' - let b:eruby_subtype = matchstr(&filetype,'^eruby\.\zs\w\+') -elseif !exists("b:eruby_subtype") - let s:lines = getline(1)."\n".getline(2)."\n".getline(3)."\n".getline(4)."\n".getline(5)."\n".getline("$") - let b:eruby_subtype = matchstr(s:lines,'eruby_subtype=\zs\w\+') - if b:eruby_subtype == '' - let b:eruby_subtype = matchstr(substitute(expand("%:t"),'\c\%(\.erb\|\.eruby\|\.erubis\)\+$','',''),'\.\zs\w\+$') - endif - if b:eruby_subtype == 'rhtml' - let b:eruby_subtype = 'html' - elseif b:eruby_subtype == 'rb' - let b:eruby_subtype = 'ruby' - elseif b:eruby_subtype == 'yml' - let b:eruby_subtype = 'yaml' - elseif b:eruby_subtype == 'js' - let b:eruby_subtype = 'javascript' - elseif b:eruby_subtype == 'txt' - " Conventional; not a real file type - let b:eruby_subtype = 'text' - elseif b:eruby_subtype == '' - let b:eruby_subtype = g:eruby_default_subtype - endif -endif - -if exists("b:eruby_subtype") && b:eruby_subtype != '' - exe "runtime! ftplugin/".b:eruby_subtype.".vim ftplugin/".b:eruby_subtype."_*.vim ftplugin/".b:eruby_subtype."/*.vim" -else - runtime! ftplugin/html.vim ftplugin/html_*.vim ftplugin/html/*.vim -endif -unlet! b:did_ftplugin - -" Override our defaults if these were set by an included ftplugin. -if exists("b:undo_ftplugin") - let s:undo_ftplugin = b:undo_ftplugin - unlet b:undo_ftplugin -endif -if exists("b:browsefilter") - let s:browsefilter = b:browsefilter - unlet b:browsefilter -endif -if exists("b:match_words") - let s:match_words = b:match_words - unlet b:match_words -endif - -runtime! ftplugin/ruby.vim ftplugin/ruby_*.vim ftplugin/ruby/*.vim -let b:did_ftplugin = 1 - -" Combine the new set of values with those previously included. -if exists("b:undo_ftplugin") - let s:undo_ftplugin = b:undo_ftplugin . " | " . s:undo_ftplugin -endif -if exists ("b:browsefilter") - let s:browsefilter = substitute(b:browsefilter,'\cAll Files (\*\.\*)\t\*\.\*\n','','') . s:browsefilter -endif -if exists("b:match_words") - let s:match_words = b:match_words . ',' . s:match_words -endif - -" Change the browse dialog on Win32 to show mainly eRuby-related files -if has("gui_win32") - let b:browsefilter="eRuby Files (*.erb, *.rhtml)\t*.erb;*.rhtml\n" . s:browsefilter -endif - -" Load the combined list of match_words for matchit.vim -if exists("loaded_matchit") - let b:match_words = s:match_words -endif - -" TODO: comments= -setlocal commentstring=<%#%s%> - -let b:undo_ftplugin = "setl cms< " - \ " | unlet! b:browsefilter b:match_words | " . s:undo_ftplugin - -let &cpo = s:save_cpo -unlet s:save_cpo - -" vim: nowrap sw=2 sts=2 ts=8: diff --git a/ftplugin/ruby.vim b/ftplugin/ruby.vim deleted file mode 100644 index 9630a94..0000000 --- a/ftplugin/ruby.vim +++ /dev/null @@ -1,395 +0,0 @@ -" Vim filetype plugin -" Language: Ruby -" Maintainer: Tim Pope -" URL: https://github.com/vim-ruby/vim-ruby -" Release Coordinator: Doug Kearns -" ---------------------------------------------------------------------------- - -if (exists("b:did_ftplugin")) - finish -endif -let b:did_ftplugin = 1 - -let s:cpo_save = &cpo -set cpo&vim - -if has("gui_running") && !has("gui_win32") - setlocal keywordprg=ri\ -T\ -f\ bs -else - setlocal keywordprg=ri -endif - -" Matchit support -if exists("loaded_matchit") && !exists("b:match_words") - let b:match_ignorecase = 0 - - let b:match_words = - \ '\<\%(if\|unless\|case\|while\|until\|for\|do\|class\|module\|def\|begin\)\>=\@!' . - \ ':' . - \ '\<\%(else\|elsif\|ensure\|when\|rescue\|break\|redo\|next\|retry\)\>' . - \ ':' . - \ '\' . - \ ',{:},\[:\],(:)' - - let b:match_skip = - \ "synIDattr(synID(line('.'),col('.'),0),'name') =~ '" . - \ "\\'" -endif - -setlocal formatoptions-=t formatoptions+=croql - -setlocal include=^\\s*\\<\\(load\\>\\\|require\\>\\\|autoload\\s*:\\=[\"']\\=\\h\\w*[\"']\\=,\\) -setlocal includeexpr=substitute(substitute(v:fname,'::','/','g'),'$','.rb','') -setlocal suffixesadd=.rb - -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 - -setlocal comments=:# -setlocal commentstring=#\ %s - -if !exists('g:ruby_version_paths') - let g:ruby_version_paths = {} -endif - -function! s:query_path(root) - let code = "print $:.join %q{,}" - if &shell =~# 'sh' && $PATH !~# '\s' - let prefix = 'env PATH='.$PATH.' ' - else - let prefix = '' - endif - if &shellxquote == "'" - let path_check = prefix.'ruby -e "' . code . '"' - else - let path_check = prefix."ruby -e '" . code . "'" - endif - - let cd = haslocaldir() ? 'lcd' : 'cd' - let cwd = getcwd() - try - exe cd fnameescape(a:root) - let path = split(system(path_check),',') - exe cd fnameescape(cwd) - return path - finally - exe cd fnameescape(cwd) - endtry -endfunction - -function! s:build_path(path) - let path = join(map(copy(a:path), 'v:val ==# "." ? "" : v:val'), ',') - if &g:path !~# '\v^\.%(,/%(usr|emx)/include)=,,$' - let path = substitute(&g:path,',,$',',','') . ',' . path - endif - return path -endfunction - -if !exists('b:ruby_version') && !exists('g:ruby_path') && isdirectory(expand('%:p:h')) - let s:version_file = findfile('.ruby-version', '.;') - if !empty(s:version_file) - let b:ruby_version = get(readfile(s:version_file, '', 1), '') - if !has_key(g:ruby_version_paths, b:ruby_version) - let g:ruby_version_paths[b:ruby_version] = s:query_path(fnamemodify(s:version_file, ':p:h')) - endif - endif -endif - -if exists("g:ruby_path") - let s:ruby_path = type(g:ruby_path) == type([]) ? join(g:ruby_path, ',') : g:ruby_path -elseif has_key(g:ruby_version_paths, get(b:, 'ruby_version', '')) - let s:ruby_paths = g:ruby_version_paths[b:ruby_version] - let s:ruby_path = s:build_path(s:ruby_paths) -else - if !exists('g:ruby_default_path') - if has("ruby") && has("win32") - ruby ::VIM::command( 'let g:ruby_default_path = split("%s",",")' % $:.join(%q{,}) ) - elseif executable('ruby') - let g:ruby_default_path = s:query_path($HOME) - else - let g:ruby_default_path = map(split($RUBYLIB,':'), 'v:val ==# "." ? "" : v:val') - endif - endif - let s:ruby_paths = g:ruby_default_path - let s:ruby_path = s:build_path(s:ruby_paths) -endif - -if stridx(&l:path, s:ruby_path) == -1 - let &l:path = s:ruby_path -endif -if exists('s:ruby_paths') && stridx(&l:tags, join(map(copy(s:ruby_paths),'v:val."/tags"'),',')) == -1 - let &l:tags = &tags . ',' . join(map(copy(s:ruby_paths),'v:val."/tags"'),',') -endif - -if has("gui_win32") && !exists("b:browsefilter") - let b:browsefilter = "Ruby Source Files (*.rb)\t*.rb\n" . - \ "All Files (*.*)\t*.*\n" -endif - -let b:undo_ftplugin = "setl fo< inc< inex< sua< def< com< cms< path< tags< 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" - -if !exists("g:no_plugin_maps") && !exists("g:no_ruby_maps") - nnoremap [m :call searchsyn('\','rubyDefine','b','n') - nnoremap ]m :call searchsyn('\','rubyDefine','','n') - nnoremap [M :call searchsyn('\','rubyDefine','b','n') - nnoremap ]M :call searchsyn('\','rubyDefine','','n') - xnoremap [m :call searchsyn('\','rubyDefine','b','v') - xnoremap ]m :call searchsyn('\','rubyDefine','','v') - xnoremap [M :call searchsyn('\','rubyDefine','b','v') - xnoremap ]M :call searchsyn('\','rubyDefine','','v') - - nnoremap [[ :call searchsyn('\<\%(class\module\)\>','rubyModule\rubyClass','b','n') - nnoremap ]] :call searchsyn('\<\%(class\module\)\>','rubyModule\rubyClass','','n') - nnoremap [] :call searchsyn('\','rubyModule\rubyClass','b','n') - nnoremap ][ :call searchsyn('\','rubyModule\rubyClass','','n') - xnoremap [[ :call searchsyn('\<\%(class\module\)\>','rubyModule\rubyClass','b','v') - xnoremap ]] :call searchsyn('\<\%(class\module\)\>','rubyModule\rubyClass','','v') - xnoremap [] :call searchsyn('\','rubyModule\rubyClass','b','v') - xnoremap ][ :call searchsyn('\','rubyModule\rubyClass','','v') - - let b:undo_ftplugin = b:undo_ftplugin - \."| sil! exe 'unmap [[' | sil! exe 'unmap ]]' | sil! exe 'unmap []' | sil! exe 'unmap ]['" - \."| sil! exe 'unmap [m' | sil! exe 'unmap ]m' | sil! exe 'unmap [M' | sil! exe 'unmap ]M'" - - if maparg('im','n') == '' - onoremap im :call wrap_i('[m',']M') - onoremap am :call wrap_a('[m',']M') - xnoremap im :call wrap_i('[m',']M') - xnoremap am :call wrap_a('[m',']M') - let b:undo_ftplugin = b:undo_ftplugin - \."| sil! exe 'ounmap im' | sil! exe 'ounmap am'" - \."| sil! exe 'xunmap im' | sil! exe 'xunmap am'" - endif - - if maparg('iM','n') == '' - onoremap iM :call wrap_i('[[','][') - onoremap aM :call wrap_a('[[','][') - xnoremap iM :call wrap_i('[[','][') - xnoremap aM :call wrap_a('[[','][') - let b:undo_ftplugin = b:undo_ftplugin - \."| sil! exe 'ounmap iM' | sil! exe 'ounmap aM'" - \."| sil! exe 'xunmap iM' | sil! exe 'xunmap aM'" - endif - - if maparg("\",'n') == '' - nnoremap :exe v:count1."tag =RubyCursorIdentifier()" - nnoremap g :exe "tjump =RubyCursorIdentifier()" - nnoremap g] :exe "tselect =RubyCursorIdentifier()" - nnoremap ] :exe v:count1."stag =RubyCursorIdentifier()" - nnoremap :exe v:count1."stag =RubyCursorIdentifier()" - nnoremap g :exe "stjump =RubyCursorIdentifier()" - nnoremap g] :exe "stselect =RubyCursorIdentifier()" - nnoremap } :exe "ptag =RubyCursorIdentifier()" - nnoremap g} :exe "ptjump =RubyCursorIdentifier()" - let b:undo_ftplugin = b:undo_ftplugin - \."| sil! exe 'nunmap '| sil! exe 'nunmap g'| sil! exe 'nunmap g]'" - \."| sil! exe 'nunmap ]'| sil! exe 'nunmap '" - \."| sil! exe 'nunmap g'| sil! exe 'nunmap g]'" - \."| sil! exe 'nunmap }'| sil! exe 'nunmap g}'" - endif - - if maparg("gf",'n') == '' - " By using findfile() rather than gf's normal behavior, we prevent - " erroneously editing a directory. - nnoremap gf :exe gf(v:count1,"gf",'edit') - nnoremap f :exe gf(v:count1,"\C-W>f",'split') - nnoremap :exe gf(v:count1,"\C-W>\C-F>",'split') - nnoremap gf :exe gf(v:count1,"\C-W>gf",'tabedit') - let b:undo_ftplugin = b:undo_ftplugin - \."| sil! exe 'nunmap gf' | sil! exe 'nunmap f' | sil! exe 'nunmap ' | sil! exe 'nunmap gf'" - endif -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 rdoc -T \"".str.'"'),'\n$','','') - if res =~ '^Nothing known about' || res =~ '^Bad argument:' || res =~ '^More than one method' - return '' - endif - return res - else - return "" - endif -endfunction - -function! s:searchsyn(pattern,syn,flags,mode) - norm! m' - if a:mode ==# 'v' - norm! gv - endif - let i = 0 - let cnt = v:count ? v:count : 1 - while i < cnt - let i = i + 1 - let line = line('.') - let col = col('.') - let pos = search(a:pattern,'W'.a:flags) - while pos != 0 && s:synname() !~# a:syn - let pos = search(a:pattern,'W'.a:flags) - endwhile - if pos == 0 - call cursor(line,col) - return - endif - endwhile -endfunction - -function! s:synname() - return synIDattr(synID(line('.'),col('.'),0),'name') -endfunction - -function! s:wrap_i(back,forward) - execute 'norm k'.a:forward - let line = line('.') - execute 'norm '.a:back - if line('.') == line - 1 - return s:wrap_a(a:back,a:forward) - endif - execute 'norm jV'.a:forward.'k' -endfunction - -function! s:wrap_a(back,forward) - execute 'norm '.a:forward - if line('.') < line('$') && getline(line('.')+1) ==# '' - let after = 1 - endif - execute 'norm '.a:back - while getline(line('.')-1) =~# '^\s*#' && line('.') - - - endwhile - if exists('after') - execute 'norm V'.a:forward.'j' - elseif line('.') > 1 && getline(line('.')-1) =~# '^\s*$' - execute 'norm kV'.a:forward - else - execute 'norm V'.a:forward - endif -endfunction - -function! RubyCursorIdentifier() - let asciicode = '\%(\w\|[]})\"'."'".']\)\@\|\<0[xXbBoOdD][[:xdigit:]_]\+\>\)\|'.asciicode - let operator = '\%(\[\]\|<<\|<=>\|[!<>]=\=\|===\=\|[!=]\~\|>>\|\*\*\|\.\.\.\=\|=>\|[~^&|*/%+-]\)' - let method = '\%(\<[_a-zA-Z]\w*\>\%([?!]\|\s*=>\@!\)\=\)' - let global = '$\%([!$&"'."'".'*+,./:;<=>?@\`~]\|-\=\w\+\>\)' - let symbolizable = '\%(\%(@@\=\)\w\+\>\|'.global.'\|'.method.'\|'.operator.'\)' - let pattern = '\C\s*\%('.number.'\|\%(:\@") : stripped -endfunction - -function! s:gf(count,map,edit) abort - if getline('.') =~# '^\s*require_relative\s*\(["'']\).*\1\s*$' - let target = matchstr(getline('.'),'\(["'']\)\zs.\{-\}\ze\1') - return a:edit.' %:h/'.target.'.rb' - elseif getline('.') =~# '^\s*\%(require[( ]\|load[( ]\|autoload[( ]:\w\+,\)\s*\s*\%(::\)\=File\.expand_path(\(["'']\)\.\./.*\1,\s*__FILE__)\s*$' - let target = matchstr(getline('.'),'\(["'']\)\.\./\zs.\{-\}\ze\1') - return a:edit.' %:h/'.target.'.rb' - elseif getline('.') =~# '^\s*\%(require \|load \|autoload :\w\+,\)\s*\(["'']\).*\1\s*$' - let target = matchstr(getline('.'),'\(["'']\)\zs.\{-\}\ze\1') - else - let target = expand('') - endif - let found = findfile(target, &path, a:count) - if found ==# '' - return 'norm! '.a:count.a:map - else - return a:edit.' '.fnameescape(found) - 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 -" -" It is also packaged with Vim, in the $VIMRUNTIME/macros directory. -" -" 2. Copy "matchit.txt" into a "doc" directory (e.g. $HOME/.vim/doc). -" -" 3. Copy "matchit.vim" into a "plugin" directory (e.g. $HOME/.vim/plugin). -" -" 4. Ensure this file (ftplugin/ruby.vim) is installed. -" -" 5. Ensure you have this line in your $HOME/.vimrc: -" filetype plugin on -" -" 6. Restart Vim and create the matchit documentation: -" -" :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. -" -" 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. -" - -" vim: nowrap sw=2 sts=2 ts=8: diff --git a/indent/ruby.vim b/indent/ruby.vim deleted file mode 100644 index 8044c80..0000000 --- a/indent/ruby.vim +++ /dev/null @@ -1,537 +0,0 @@ -" Vim indent file -" Language: Ruby -" Maintainer: Nikolai Weibull -" URL: https://github.com/vim-ruby/vim-ruby -" Release Coordinator: Doug Kearns - -" 0. Initialization {{{1 -" ================= - -" Only load this indent file when no other was loaded. -if exists("b:did_indent") - finish -endif -let b:did_indent = 1 - -setlocal nosmartindent - -" Now, set up our indentation expression and keys that trigger it. -setlocal indentexpr=GetRubyIndent(v:lnum) -setlocal indentkeys=0{,0},0),0],!^F,o,O,e -setlocal indentkeys+==end,=else,=elsif,=when,=ensure,=rescue,==begin,==end - -" Only define the function once. -if exists("*GetRubyIndent") - finish -endif - -let s:cpo_save = &cpo -set cpo&vim - -" 1. Variables {{{1 -" ============ - -" Regex of syntax group names that are or delimit strings/symbols or are comments. -let s:syng_strcom = '\' - -" Regex of syntax group names that are strings. -let s:syng_string = - \ '\' - -" Regex of syntax group names that are strings or documentation. -let s:syng_stringdoc = - \'\' - -" Expression used to check whether we should skip a match with searchpair(). -let s:skip_expr = - \ "synIDattr(synID(line('.'),col('.'),1),'name') =~ '".s:syng_strcom."'" - -" Regex used for words that, at the start of a line, add a level of indent. -let s:ruby_indent_keywords = '^\s*\zs\<\%(module\|class\|def\|if\|for' . - \ '\|while\|until\|else\|elsif\|case\|when\|unless\|begin\|ensure' . - \ '\|rescue\):\@!\>' . - \ '\|\%([=,*/%+-]\|<<\|>>\|:\s\)\s*\zs' . - \ '\<\%(if\|for\|while\|until\|case\|unless\|begin\):\@!\>' - -" Regex used for words that, at the start of a line, remove a level of indent. -let s:ruby_deindent_keywords = - \ '^\s*\zs\<\%(ensure\|else\|rescue\|elsif\|when\|end\):\@!\>' - -" Regex that defines the start-match for the 'end' keyword. -"let s:end_start_regex = '\%(^\|[^.]\)\<\%(module\|class\|def\|if\|for\|while\|until\|case\|unless\|begin\|do\)\>' -" TODO: the do here should be restricted somewhat (only at end of line)? -let s:end_start_regex = - \ '\C\%(^\s*\|[=,*/%+\-|;{]\|<<\|>>\|:\s\)\s*\zs' . - \ '\<\%(module\|class\|def\|if\|for\|while\|until\|case\|unless\|begin\):\@!\>' . - \ '\|\%(^\|[^.:@$]\)\@<=\' - -" Regex that defines the middle-match for the 'end' keyword. -let s:end_middle_regex = '\<\%(ensure\|else\|\%(\%(^\|;\)\s*\)\@<=\\|when\|elsif\):\@!\>' - -" Regex that defines the end-match for the 'end' keyword. -let s:end_end_regex = '\%(^\|[^.:@$]\)\@<=\' - -" Expression used for searchpair() call for finding match for 'end' keyword. -let s:end_skip_expr = s:skip_expr . - \ ' || (expand("") == "do"' . - \ ' && getline(".") =~ "^\\s*\\<\\(while\\|until\\|for\\):\\@!\\>")' - -" Regex that defines continuation lines, not including (, {, or [. -let s:non_bracket_continuation_regex = '\%([\\.,:*/%+]\|\\|%\@ 0 - " Go in and out of blocks comments as necessary. - " If the line isn't empty (with opt. comment) or in a string, end search. - let line = getline(lnum) - if line =~ '^=begin' - if in_block - let in_block = 0 - else - break - endif - elseif !in_block && line =~ '^=end' - let in_block = 1 - elseif !in_block && line !~ '^\s*#.*$' && !(s:IsInStringOrComment(lnum, 1) - \ && s:IsInStringOrComment(lnum, strlen(line))) - break - endif - let lnum = prevnonblank(lnum - 1) - endwhile - return lnum -endfunction - -" Find line above 'lnum' that started the continuation 'lnum' may be part of. -function s:GetMSL(lnum) - " Start on the line we're at and use its indent. - let msl = a:lnum - let msl_body = getline(msl) - let lnum = s:PrevNonBlankNonString(a:lnum - 1) - while lnum > 0 - " If we have a continuation line, or we're in a string, use line as MSL. - " Otherwise, terminate search as we have found our MSL already. - let line = getline(lnum) - - if s:Match(lnum, s:splat_regex) - " If the above line looks like the "*" of a splat, use the current one's - " indentation. - " - " Example: - " Hash[* - " method_call do - " something - " - return msl - elseif s:Match(line, s:non_bracket_continuation_regex) && - \ s:Match(msl, s:non_bracket_continuation_regex) - " If the current line is a non-bracket continuation and so is the - " previous one, keep its indent and continue looking for an MSL. - " - " Example: - " method_call one, - " two, - " three - " - let msl = lnum - elseif s:Match(lnum, s:non_bracket_continuation_regex) && - \ (s:Match(msl, s:bracket_continuation_regex) || s:Match(msl, s:block_continuation_regex)) - " If the current line is a bracket continuation or a block-starter, but - " the previous is a non-bracket one, respect the previous' indentation, - " and stop here. - " - " Example: - " method_call one, - " two { - " three - " - return lnum - elseif s:Match(lnum, s:bracket_continuation_regex) && - \ (s:Match(msl, s:bracket_continuation_regex) || s:Match(msl, s:block_continuation_regex)) - " If both lines are bracket continuations (the current may also be a - " block-starter), use the current one's and stop here - " - " Example: - " method_call( - " other_method_call( - " foo - return msl - elseif s:Match(lnum, s:block_regex) && - \ !s:Match(msl, s:continuation_regex) && - \ !s:Match(msl, s:block_continuation_regex) - " If the previous line is a block-starter and the current one is - " mostly ordinary, use the current one as the MSL. - " - " Example: - " method_call do - " something - " something_else - return msl - else - let col = match(line, s:continuation_regex) + 1 - if (col > 0 && !s:IsInStringOrComment(lnum, col)) - \ || s:IsInString(lnum, strlen(line)) - let msl = lnum - else - break - endif - endif - - let msl_body = getline(msl) - let lnum = s:PrevNonBlankNonString(lnum - 1) - endwhile - return msl -endfunction - -" Check if line 'lnum' has more opening brackets than closing ones. -function s:ExtraBrackets(lnum) - let opening = {'parentheses': [], 'braces': [], 'brackets': []} - let closing = {'parentheses': [], 'braces': [], 'brackets': []} - - let line = getline(a:lnum) - let pos = match(line, '[][(){}]', 0) - - " Save any encountered opening brackets, and remove them once a matching - " closing one has been found. If a closing bracket shows up that doesn't - " close anything, save it for later. - while pos != -1 - if !s:IsInStringOrComment(a:lnum, pos + 1) - if line[pos] == '(' - call add(opening.parentheses, {'type': '(', 'pos': pos}) - elseif line[pos] == ')' - if empty(opening.parentheses) - call add(closing.parentheses, {'type': ')', 'pos': pos}) - else - let opening.parentheses = opening.parentheses[0:-2] - endif - elseif line[pos] == '{' - call add(opening.braces, {'type': '{', 'pos': pos}) - elseif line[pos] == '}' - if empty(opening.braces) - call add(closing.braces, {'type': '}', 'pos': pos}) - else - let opening.braces = opening.braces[0:-2] - endif - elseif line[pos] == '[' - call add(opening.brackets, {'type': '[', 'pos': pos}) - elseif line[pos] == ']' - if empty(opening.brackets) - call add(closing.brackets, {'type': ']', 'pos': pos}) - else - let opening.brackets = opening.brackets[0:-2] - endif - endif - endif - - let pos = match(line, '[][(){}]', pos + 1) - endwhile - - " Find the rightmost brackets, since they're the ones that are important in - " both opening and closing cases - let rightmost_opening = {'type': '(', 'pos': -1} - let rightmost_closing = {'type': ')', 'pos': -1} - - for opening in opening.parentheses + opening.braces + opening.brackets - if opening.pos > rightmost_opening.pos - let rightmost_opening = opening - endif - endfor - - for closing in closing.parentheses + closing.braces + closing.brackets - if closing.pos > rightmost_closing.pos - let rightmost_closing = closing - endif - endfor - - return [rightmost_opening, rightmost_closing] -endfunction - -function s:Match(lnum, regex) - let col = match(getline(a:lnum), '\C'.a:regex) + 1 - return col > 0 && !s:IsInStringOrComment(a:lnum, col) ? col : 0 -endfunction - -function s:MatchLast(lnum, regex) - let line = getline(a:lnum) - let col = match(line, '.*\zs' . a:regex) - while col != -1 && s:IsInStringOrComment(a:lnum, col) - let line = strpart(line, 0, col) - let col = match(line, '.*' . a:regex) - endwhile - return col + 1 -endfunction - -" 3. GetRubyIndent Function {{{1 -" ========================= - -function GetRubyIndent(...) - " 3.1. Setup {{{2 - " ---------- - - " For the current line, use the first argument if given, else v:lnum - let clnum = a:0 ? a:1 : v:lnum - - " Set up variables for restoring position in file. Could use clnum here. - let vcol = col('.') - - " 3.2. Work on the current line {{{2 - " ----------------------------- - - " Get the current line. - let line = getline(clnum) - let ind = -1 - - " If we got a closing bracket on an empty line, find its match and indent - " according to it. For parentheses we indent to its column - 1, for the - " others we indent to the containing line's MSL's level. Return -1 if fail. - let col = matchend(line, '^\s*[]})]') - if col > 0 && !s:IsInStringOrComment(clnum, col) - call cursor(clnum, col) - let bs = strpart('(){}[]', stridx(')}]', line[col - 1]) * 2, 2) - if searchpair(escape(bs[0], '\['), '', bs[1], 'bW', s:skip_expr) > 0 - if line[col-1]==')' && col('.') != col('$') - 1 - let ind = virtcol('.') - 1 - else - let ind = indent(s:GetMSL(line('.'))) - endif - endif - return ind - endif - - " If we have a =begin or =end set indent to first column. - if match(line, '^\s*\%(=begin\|=end\)$') != -1 - return 0 - endif - - " If we have a deindenting keyword, find its match and indent to its level. - " TODO: this is messy - if s:Match(clnum, s:ruby_deindent_keywords) - call cursor(clnum, 1) - if searchpair(s:end_start_regex, s:end_middle_regex, s:end_end_regex, 'bW', - \ s:end_skip_expr) > 0 - let msl = s:GetMSL(line('.')) - let line = getline(line('.')) - - if strpart(line, 0, col('.') - 1) =~ '=\s*$' && - \ strpart(line, col('.') - 1, 2) !~ 'do' - let ind = virtcol('.') - 1 - elseif getline(msl) =~ '=\s*\(#.*\)\=$' - let ind = indent(line('.')) - else - let ind = indent(msl) - endif - endif - return ind - endif - - " If we are in a multi-line string or line-comment, don't do anything to it. - if s:IsInStringOrDocumentation(clnum, matchend(line, '^\s*') + 1) - return indent('.') - endif - - " If we are at the closing delimiter of a "<<" heredoc-style string, set the - " indent to 0. - if line =~ '^\k\+\s*$' - \ && s:IsInStringDelimiter(clnum, 1) - \ && search('\V<<'.line, 'nbW') > 0 - return 0 - endif - - " 3.3. Work on the previous line. {{{2 - " ------------------------------- - - " Find a non-blank, non-multi-line string line above the current line. - let lnum = s:PrevNonBlankNonString(clnum - 1) - - " If the line is empty and inside a string, use the previous line. - if line =~ '^\s*$' && lnum != prevnonblank(clnum - 1) - return indent(prevnonblank(clnum)) - endif - - " At the start of the file use zero indent. - if lnum == 0 - return 0 - endif - - " Set up variables for the previous line. - let line = getline(lnum) - let ind = indent(lnum) - - " If the previous line ended with a block opening, add a level of indent. - if s:Match(lnum, s:block_regex) - return indent(s:GetMSL(lnum)) + &sw - endif - - " If the previous line ended with the "*" of a splat, add a level of indent - if line =~ s:splat_regex - return indent(lnum) + &sw - endif - - " If the previous line contained unclosed opening brackets and we are still - " in them, find the rightmost one and add indent depending on the bracket - " type. - " - " If it contained hanging closing brackets, find the rightmost one, find its - " match and indent according to that. - if line =~ '[[({]' || line =~ '[])}]\s*\%(#.*\)\=$' - let [opening, closing] = s:ExtraBrackets(lnum) - - if opening.pos != -1 - if opening.type == '(' && searchpair('(', '', ')', 'bW', s:skip_expr) > 0 - if col('.') + 1 == col('$') - return ind + &sw - else - return virtcol('.') - endif - else - let nonspace = matchend(line, '\S', opening.pos + 1) - 1 - return nonspace > 0 ? nonspace : ind + &sw - endif - elseif closing.pos != -1 - call cursor(lnum, closing.pos + 1) - normal! % - - if s:Match(line('.'), s:ruby_indent_keywords) - return indent('.') + &sw - else - return indent('.') - endif - else - call cursor(clnum, vcol) - end - endif - - " If the previous line ended with an "end", match that "end"s beginning's - " indent. - let col = s:Match(lnum, '\%(^\|[^.:@$]\)\\s*\%(#.*\)\=$') - if col > 0 - call cursor(lnum, col) - if searchpair(s:end_start_regex, '', s:end_end_regex, 'bW', - \ s:end_skip_expr) > 0 - let n = line('.') - let ind = indent('.') - let msl = s:GetMSL(n) - if msl != n - let ind = indent(msl) - end - return ind - endif - end - - let col = s:Match(lnum, s:ruby_indent_keywords) - if col > 0 - call cursor(lnum, col) - let ind = virtcol('.') - 1 + &sw - " TODO: make this better (we need to count them) (or, if a searchpair - " fails, we know that something is lacking an end and thus we indent a - " level - if s:Match(lnum, s:end_end_regex) - let ind = indent('.') - endif - return ind - endif - - " 3.4. Work on the MSL line. {{{2 - " -------------------------- - - " Set up variables to use and search for MSL to the previous line. - let p_lnum = lnum - let lnum = s:GetMSL(lnum) - - " If the previous line wasn't a MSL and is continuation return its indent. - " TODO: the || s:IsInString() thing worries me a bit. - if p_lnum != lnum - if s:Match(p_lnum, s:non_bracket_continuation_regex) || s:IsInString(p_lnum,strlen(line)) - return ind - endif - endif - - " Set up more variables, now that we know we wasn't continuation bound. - let line = getline(lnum) - let msl_ind = indent(lnum) - - " If the MSL line had an indenting keyword in it, add a level of indent. - " TODO: this does not take into account contrived things such as - " module Foo; class Bar; end - if s:Match(lnum, s:ruby_indent_keywords) - let ind = msl_ind + &sw - if s:Match(lnum, s:end_end_regex) - let ind = ind - &sw - endif - return ind - endif - - " If the previous line ended with [*+/.,-=], but wasn't a block ending or a - " closing bracket, indent one extra level. - if s:Match(lnum, s:non_bracket_continuation_regex) && !s:Match(lnum, '^\s*\([\])}]\|end\)') - if lnum == p_lnum - let ind = msl_ind + &sw - else - let ind = msl_ind - endif - return ind - endif - - " }}}2 - - return ind -endfunction - -" }}}1 - -let &cpo = s:cpo_save -unlet s:cpo_save - -" vim:set sw=2 sts=2 ts=8 et: diff --git a/syntax/eruby.vim b/syntax/eruby.vim deleted file mode 100644 index c20b086..0000000 --- a/syntax/eruby.vim +++ /dev/null @@ -1,74 +0,0 @@ -" Vim syntax file -" Language: eRuby -" Maintainer: Tim Pope -" URL: https://github.com/vim-ruby/vim-ruby -" Release Coordinator: Doug Kearns - -if exists("b:current_syntax") - finish -endif - -if !exists("main_syntax") - let main_syntax = 'eruby' -endif - -if !exists("g:eruby_default_subtype") - let g:eruby_default_subtype = "html" -endif - -if &filetype =~ '^eruby\.' - let b:eruby_subtype = matchstr(&filetype,'^eruby\.\zs\w\+') -elseif !exists("b:eruby_subtype") && main_syntax == 'eruby' - let s:lines = getline(1)."\n".getline(2)."\n".getline(3)."\n".getline(4)."\n".getline(5)."\n".getline("$") - let b:eruby_subtype = matchstr(s:lines,'eruby_subtype=\zs\w\+') - if b:eruby_subtype == '' - let b:eruby_subtype = matchstr(substitute(expand("%:t"),'\c\%(\.erb\|\.eruby\|\.erubis\)\+$','',''),'\.\zs\w\+$') - endif - if b:eruby_subtype == 'rhtml' - let b:eruby_subtype = 'html' - elseif b:eruby_subtype == 'rb' - let b:eruby_subtype = 'ruby' - elseif b:eruby_subtype == 'yml' - let b:eruby_subtype = 'yaml' - elseif b:eruby_subtype == 'js' - let b:eruby_subtype = 'javascript' - elseif b:eruby_subtype == 'txt' - " Conventional; not a real file type - let b:eruby_subtype = 'text' - elseif b:eruby_subtype == '' - let b:eruby_subtype = g:eruby_default_subtype - endif -endif - -if !exists("b:eruby_nest_level") - let b:eruby_nest_level = strlen(substitute(substitute(substitute(expand("%:t"),'@','','g'),'\c\.\%(erb\|rhtml\)\>','@','g'),'[^@]','','g')) -endif -if !b:eruby_nest_level - let b:eruby_nest_level = 1 -endif - -if exists("b:eruby_subtype") && b:eruby_subtype != '' - exe "runtime! syntax/".b:eruby_subtype.".vim" - unlet! b:current_syntax -endif -syn include @rubyTop syntax/ruby.vim - -syn cluster erubyRegions contains=erubyOneLiner,erubyBlock,erubyExpression,erubyComment - -exe 'syn region erubyOneLiner matchgroup=erubyDelimiter start="^%\{1,'.b:eruby_nest_level.'\}%\@!" end="$" contains=@rubyTop containedin=ALLBUT,@erubyRegions keepend oneline' -exe 'syn region erubyBlock matchgroup=erubyDelimiter start="<%\{1,'.b:eruby_nest_level.'\}%\@!-\=" end="[=-]\=%\@" contains=@rubyTop containedin=ALLBUT,@erubyRegions keepend' -exe 'syn region erubyExpression matchgroup=erubyDelimiter start="<%\{1,'.b:eruby_nest_level.'\}=\{1,4}" end="[=-]\=%\@" contains=@rubyTop containedin=ALLBUT,@erubyRegions keepend' -exe 'syn region erubyComment matchgroup=erubyDelimiter start="<%\{1,'.b:eruby_nest_level.'\}-\=#" end="[=-]\=%\@" contains=rubyTodo,@Spell containedin=ALLBUT,@erubyRegions keepend' - -" Define the default highlighting. - -hi def link erubyDelimiter PreProc -hi def link erubyComment Comment - -let b:current_syntax = 'eruby' - -if main_syntax == 'eruby' - unlet main_syntax -endif - -" vim: nowrap sw=2 sts=2 ts=8: diff --git a/syntax/ruby.vim b/syntax/ruby.vim deleted file mode 100644 index 75da608..0000000 --- a/syntax/ruby.vim +++ /dev/null @@ -1,369 +0,0 @@ -" Vim syntax file -" Language: Ruby -" Maintainer: Doug Kearns -" URL: https://github.com/vim-ruby/vim-ruby -" Release Coordinator: Doug Kearns -" ---------------------------------------------------------------------------- -" -" Previous Maintainer: Mirko Nasato -" Thanks to perl.vim authors, and to Reimer Behrends. :-) (MN) -" ---------------------------------------------------------------------------- - -if exists("b:current_syntax") - finish -endif - -if has("folding") && exists("ruby_fold") - setlocal foldmethod=syntax -endif - -syn cluster rubyNotTop contains=@rubyExtendedStringSpecial,@rubyRegexpSpecial,@rubyDeclaration,rubyConditional,rubyExceptional,rubyMethodExceptional,rubyTodo - -if exists("ruby_space_errors") - if !exists("ruby_no_trail_space_error") - syn match rubySpaceError display excludenl "\s\+$" - endif - if !exists("ruby_no_tab_space_error") - syn match rubySpaceError display " \+\t"me=e-1 - endif -endif - -" Operators -if exists("ruby_operators") - syn match rubyOperator "[~!^&|*/%+-]\|\%(class\s*\)\@\|<=\|\%(<\|\>\|>=\|=\@\|\*\*\|\.\.\.\|\.\.\|::" - syn match rubyOperator "->\|-=\|/=\|\*\*=\|\*=\|&&=\|&=\|&&\|||=\||=\|||\|%=\|+=\|!\~\|!=" - syn region rubyBracketOperator matchgroup=rubyOperator start="\%(\w[?!]\=\|[]})]\)\@<=\[\s*" end="\s*]" contains=ALLBUT,@rubyNotTop -endif - -" Expression Substitution and Backslash Notation -syn match rubyStringEscape "\\\\\|\\[abefnrstv]\|\\\o\{1,3}\|\\x\x\{1,2}" contained display -syn match rubyStringEscape "\%(\\M-\\C-\|\\C-\\M-\|\\M-\\c\|\\c\\M-\|\\c\|\\C-\|\\M-\)\%(\\\o\{1,3}\|\\x\x\{1,2}\|\\\=\S\)" contained display -syn match rubyQuoteEscape "\\[\\']" contained display - -syn region rubyInterpolation matchgroup=rubyInterpolationDelimiter start="#{" end="}" contained contains=ALLBUT,@rubyNotTop -syn match rubyInterpolation "#\%(\$\|@@\=\)\w\+" display contained contains=rubyInterpolationDelimiter,rubyInstanceVariable,rubyClassVariable,rubyGlobalVariable,rubyPredefinedVariable -syn match rubyInterpolationDelimiter "#\ze\%(\$\|@@\=\)\w\+" display contained -syn match rubyInterpolation "#\$\%(-\w\|\W\)" display contained contains=rubyInterpolationDelimiter,rubyPredefinedVariable,rubyInvalidVariable -syn match rubyInterpolationDelimiter "#\ze\$\%(-\w\|\W\)" display contained -syn region rubyNoInterpolation start="\\#{" end="}" contained -syn match rubyNoInterpolation "\\#{" display contained -syn match rubyNoInterpolation "\\#\%(\$\|@@\=\)\w\+" display contained -syn match rubyNoInterpolation "\\#\$\W" display contained - -syn match rubyDelimEscape "\\[(<{\[)>}\]]" transparent display contained contains=NONE - -syn region rubyNestedParentheses start="(" skip="\\\\\|\\)" matchgroup=rubyString end=")" transparent contained -syn region rubyNestedCurlyBraces start="{" skip="\\\\\|\\}" matchgroup=rubyString end="}" transparent contained -syn region rubyNestedAngleBrackets start="<" skip="\\\\\|\\>" matchgroup=rubyString end=">" transparent contained -syn region rubyNestedSquareBrackets start="\[" skip="\\\\\|\\\]" matchgroup=rubyString end="\]" transparent contained - -" These are mostly Oniguruma ready -syn region rubyRegexpComment matchgroup=rubyRegexpSpecial start="(?#" skip="\\)" end=")" contained -syn region rubyRegexpParens matchgroup=rubyRegexpSpecial start="(\(?:\|?<\=[=!]\|?>\|?<[a-z_]\w*>\|?[imx]*-[imx]*:\=\|\%(?#\)\@!\)" skip="\\)" end=")" contained transparent contains=@rubyRegexpSpecial -syn region rubyRegexpBrackets matchgroup=rubyRegexpCharClass start="\[\^\=" skip="\\\]" end="\]" contained transparent contains=rubyStringEscape,rubyRegexpEscape,rubyRegexpCharClass oneline -syn match rubyRegexpCharClass "\\[DdHhSsWw]" contained display -syn match rubyRegexpCharClass "\[:\^\=\%(alnum\|alpha\|ascii\|blank\|cntrl\|digit\|graph\|lower\|print\|punct\|space\|upper\|xdigit\):\]" contained -syn match rubyRegexpEscape "\\[].*?+^$|\\/(){}[]" contained -syn match rubyRegexpQuantifier "[*?+][?+]\=" contained display -syn match rubyRegexpQuantifier "{\d\+\%(,\d*\)\=}?\=" contained display -syn match rubyRegexpAnchor "[$^]\|\\[ABbGZz]" contained display -syn match rubyRegexpDot "\." contained display -syn match rubyRegexpSpecial "|" contained display -syn match rubyRegexpSpecial "\\[1-9]\d\=\d\@!" contained display -syn match rubyRegexpSpecial "\\k<\%([a-z_]\w*\|-\=\d\+\)\%([+-]\d\+\)\=>" contained display -syn match rubyRegexpSpecial "\\k'\%([a-z_]\w*\|-\=\d\+\)\%([+-]\d\+\)\='" contained display -syn match rubyRegexpSpecial "\\g<\%([a-z_]\w*\|-\=\d\+\)>" contained display -syn match rubyRegexpSpecial "\\g'\%([a-z_]\w*\|-\=\d\+\)'" contained display - -syn cluster rubyStringSpecial contains=rubyInterpolation,rubyNoInterpolation,rubyStringEscape -syn cluster rubyExtendedStringSpecial contains=@rubyStringSpecial,rubyNestedParentheses,rubyNestedCurlyBraces,rubyNestedAngleBrackets,rubyNestedSquareBrackets -syn cluster rubyRegexpSpecial contains=rubyInterpolation,rubyNoInterpolation,rubyStringEscape,rubyRegexpSpecial,rubyRegexpEscape,rubyRegexpBrackets,rubyRegexpCharClass,rubyRegexpDot,rubyRegexpQuantifier,rubyRegexpAnchor,rubyRegexpParens,rubyRegexpComment - -" Numbers and ASCII Codes -syn match rubyASCIICode "\%(\w\|[]})\"'/]\)\@" display -syn match rubyInteger "\%(\%(\w\|[]})\"']\s*\)\@" display -syn match rubyInteger "\%(\%(\w\|[]})\"']\s*\)\@" display -syn match rubyInteger "\%(\%(\w\|[]})\"']\s*\)\@" display -syn match rubyFloat "\%(\%(\w\|[]})\"']\s*\)\@" display -syn match rubyFloat "\%(\%(\w\|[]})\"']\s*\)\@" display - -" Identifiers -syn match rubyLocalVariableOrMethod "\<[_[:lower:]][_[:alnum:]]*[?!=]\=" contains=NONE display transparent -syn match rubyBlockArgument "&[_[:lower:]][_[:alnum:]]" contains=NONE display transparent - -syn match rubyConstant "\%(\%(^\|[^.]\)\.\s*\)\@\%(\s*(\)\@!" -syn match rubyClassVariable "@@\%(\h\|[^\x00-\x7F]\)\%(\w\|[^\x00-\x7F]\)*" display -syn match rubyInstanceVariable "@\%(\h\|[^\x00-\x7F]\)\%(\w\|[^\x00-\x7F]\)*" display -syn match rubyGlobalVariable "$\%(\%(\h\|[^\x00-\x7F]\)\%(\w\|[^\x00-\x7F]\)*\|-.\)" -syn match rubySymbol "[]})\"':]\@\|<=\|<\|===\|[=!]=\|[=!]\~\|!\|>>\|>=\|>\||\|-@\|-\|/\|\[]=\|\[]\|\*\*\|\*\|&\|%\|+@\|+\|`\)" -syn match rubySymbol "[]})\"':]\@_,;:!?/.'"@$*\&+0]\)" -syn match rubySymbol "[]})\"':]\@\@!\)\=" -syn match rubySymbol "\%([{(,]\_s*\)\@<=\l\w*[!?]\=::\@!"he=e-1 -syn match rubySymbol "[]})\"':]\@\|{\)\s*\)\@<=|" end="|" oneline display contains=rubyBlockParameter - -syn match rubyInvalidVariable "$[^ A-Za-z_-]" -syn match rubyPredefinedVariable #$[!$&"'*+,./0:;<=>?@\`~]# -syn match rubyPredefinedVariable "$\d\+" display -syn match rubyPredefinedVariable "$_\>" display -syn match rubyPredefinedVariable "$-[0FIKadilpvw]\>" display -syn match rubyPredefinedVariable "$\%(deferr\|defout\|stderr\|stdin\|stdout\)\>" display -syn match rubyPredefinedVariable "$\%(DEBUG\|FILENAME\|KCODE\|LOADED_FEATURES\|LOAD_PATH\|PROGRAM_NAME\|SAFE\|VERBOSE\)\>" display -syn match rubyPredefinedConstant "\%(\%(^\|[^.]\)\.\s*\)\@\%(\s*(\)\@!" -syn match rubyPredefinedConstant "\%(\%(^\|[^.]\)\.\s*\)\@\%(\s*(\)\@!" - -" Normal Regular Expression -syn region rubyRegexp matchgroup=rubyRegexpDelimiter start="\%(\%(^\|\<\%(and\|or\|while\|until\|unless\|if\|elsif\|when\|not\|then\|else\)\|[;\~=!|&(,{[<>?:*+-]\)\s*\)\@<=/" end="/[iomxneus]*" skip="\\\\\|\\/" contains=@rubyRegexpSpecial fold -syn region rubyRegexp matchgroup=rubyRegexpDelimiter start="\%(\h\k*\s\+\)\@<=/[ \t=]\@!" end="/[iomxneus]*" skip="\\\\\|\\/" contains=@rubyRegexpSpecial fold - -" Generalized Regular Expression -syn region rubyRegexp matchgroup=rubyRegexpDelimiter start="%r\z([~`!@#$%^&*_\-+=|\:;"',.? /]\)" end="\z1[iomxneus]*" skip="\\\\\|\\\z1" contains=@rubyRegexpSpecial fold -syn region rubyRegexp matchgroup=rubyRegexpDelimiter start="%r{" end="}[iomxneus]*" skip="\\\\\|\\}" contains=@rubyRegexpSpecial fold -syn region rubyRegexp matchgroup=rubyRegexpDelimiter start="%r<" end=">[iomxneus]*" skip="\\\\\|\\>" contains=@rubyRegexpSpecial,rubyNestedAngleBrackets,rubyDelimEscape fold -syn region rubyRegexp matchgroup=rubyRegexpDelimiter start="%r\[" end="\][iomxneus]*" skip="\\\\\|\\\]" contains=@rubyRegexpSpecial fold -syn region rubyRegexp matchgroup=rubyRegexpDelimiter start="%r(" end=")[iomxneus]*" skip="\\\\\|\\)" contains=@rubyRegexpSpecial fold - -" Normal String and Shell Command Output -syn region rubyString matchgroup=rubyStringDelimiter start="\"" end="\"" skip="\\\\\|\\\"" contains=@rubyStringSpecial,@Spell fold -syn region rubyString matchgroup=rubyStringDelimiter start="'" end="'" skip="\\\\\|\\'" contains=rubyQuoteEscape,@Spell fold -syn region rubyString matchgroup=rubyStringDelimiter start="`" end="`" skip="\\\\\|\\`" contains=@rubyStringSpecial fold - -" Generalized Single Quoted String, Symbol and Array of Strings -syn region rubyString matchgroup=rubyStringDelimiter start="%[qwi]\z([~`!@#$%^&*_\-+=|\:;"',.?/]\)" end="\z1" skip="\\\\\|\\\z1" fold -syn region rubyString matchgroup=rubyStringDelimiter start="%[qwi]{" end="}" skip="\\\\\|\\}" fold contains=rubyNestedCurlyBraces,rubyDelimEscape -syn region rubyString matchgroup=rubyStringDelimiter start="%[qwi]<" end=">" skip="\\\\\|\\>" fold contains=rubyNestedAngleBrackets,rubyDelimEscape -syn region rubyString matchgroup=rubyStringDelimiter start="%[qwi]\[" end="\]" skip="\\\\\|\\\]" fold contains=rubyNestedSquareBrackets,rubyDelimEscape -syn region rubyString matchgroup=rubyStringDelimiter start="%[qwi](" end=")" skip="\\\\\|\\)" fold contains=rubyNestedParentheses,rubyDelimEscape -syn region rubyString matchgroup=rubyStringDelimiter start="%q " end=" " skip="\\\\\|\\)" fold -syn region rubySymbol matchgroup=rubySymbolDelimiter start="%s\z([~`!@#$%^&*_\-+=|\:;"',.? /]\)" end="\z1" skip="\\\\\|\\\z1" fold -syn region rubySymbol matchgroup=rubySymbolDelimiter start="%s{" end="}" skip="\\\\\|\\}" fold contains=rubyNestedCurlyBraces,rubyDelimEscape -syn region rubySymbol matchgroup=rubySymbolDelimiter start="%s<" end=">" skip="\\\\\|\\>" fold contains=rubyNestedAngleBrackets,rubyDelimEscape -syn region rubySymbol matchgroup=rubySymbolDelimiter start="%s\[" end="\]" skip="\\\\\|\\\]" fold contains=rubyNestedSquareBrackets,rubyDelimEscape -syn region rubySymbol matchgroup=rubySymbolDelimiter start="%s(" end=")" skip="\\\\\|\\)" fold contains=rubyNestedParentheses,rubyDelimEscape - -" Generalized Double Quoted String and Array of Strings and Shell Command Output -" Note: %= is not matched here as the beginning of a double quoted string -syn region rubyString matchgroup=rubyStringDelimiter start="%\z([~`!@#$%^&*_\-+|\:;"',.?/]\)" end="\z1" skip="\\\\\|\\\z1" contains=@rubyStringSpecial fold -syn region rubyString matchgroup=rubyStringDelimiter start="%[QWIx]\z([~`!@#$%^&*_\-+=|\:;"',.?/]\)" end="\z1" skip="\\\\\|\\\z1" contains=@rubyStringSpecial fold -syn region rubyString matchgroup=rubyStringDelimiter start="%[QWIx]\={" end="}" skip="\\\\\|\\}" contains=@rubyStringSpecial,rubyNestedCurlyBraces,rubyDelimEscape fold -syn region rubyString matchgroup=rubyStringDelimiter start="%[QWIx]\=<" end=">" skip="\\\\\|\\>" contains=@rubyStringSpecial,rubyNestedAngleBrackets,rubyDelimEscape fold -syn region rubyString matchgroup=rubyStringDelimiter start="%[QWIx]\=\[" end="\]" skip="\\\\\|\\\]" contains=@rubyStringSpecial,rubyNestedSquareBrackets,rubyDelimEscape fold -syn region rubyString matchgroup=rubyStringDelimiter start="%[QWIx]\=(" end=")" skip="\\\\\|\\)" contains=@rubyStringSpecial,rubyNestedParentheses,rubyDelimEscape fold -syn region rubyString matchgroup=rubyStringDelimiter start="%[Qx] " end=" " skip="\\\\\|\\)" contains=@rubyStringSpecial fold - -" Here Document -syn region rubyHeredocStart matchgroup=rubyStringDelimiter start=+\%(\%(class\s*\|\%([]})"'.]\|::\)\)\_s*\|\w\)\@>\|[<>]=\=\|<=>\|===\|[=!]=\|[=!]\~\|!\|`\)\%([[:space:];#(]\|$\)\@=" contained containedin=rubyAliasDeclaration,rubyAliasDeclaration2,rubyMethodDeclaration - -syn cluster rubyDeclaration contains=rubyAliasDeclaration,rubyAliasDeclaration2,rubyMethodDeclaration,rubyModuleDeclaration,rubyClassDeclaration,rubyFunction,rubyBlockParameter - -" Keywords -" Note: the following keywords have already been defined: -" begin case class def do end for if module unless until while -syn match rubyControl "\<\%(and\|break\|in\|next\|not\|or\|redo\|rescue\|retry\|return\)\>[?!]\@!" -syn match rubyOperator "\[?!]\@!" -syn match rubyBoolean "\<\%(true\|false\)\>[?!]\@!" -syn match rubyPseudoVariable "\<\%(nil\|self\|__ENCODING__\|__FILE__\|__LINE__\|__callee__\|__method__\)\>[?!]\@!" " TODO: reorganise -syn match rubyBeginEnd "\<\%(BEGIN\|END\)\>[?!]\@!" - -" Expensive Mode - match 'end' with the appropriate opening keyword for syntax -" based folding and special highlighting of module/class/method definitions -if !exists("b:ruby_no_expensive") && !exists("ruby_no_expensive") - syn match rubyDefine "\" nextgroup=rubyAliasDeclaration skipwhite skipnl - syn match rubyDefine "\" nextgroup=rubyMethodDeclaration skipwhite skipnl - syn match rubyDefine "\" nextgroup=rubyFunction skipwhite skipnl - syn match rubyClass "\" nextgroup=rubyClassDeclaration skipwhite skipnl - syn match rubyModule "\" nextgroup=rubyModuleDeclaration skipwhite skipnl - - syn region rubyMethodBlock start="\" matchgroup=rubyDefine end="\%(\" contains=ALLBUT,@rubyNotTop fold - syn region rubyBlock start="\" matchgroup=rubyClass end="\" contains=ALLBUT,@rubyNotTop fold - syn region rubyBlock start="\" matchgroup=rubyModule end="\" contains=ALLBUT,@rubyNotTop fold - - " modifiers - syn match rubyConditionalModifier "\<\%(if\|unless\)\>" display - syn match rubyRepeatModifier "\<\%(while\|until\)\>" display - - syn region rubyDoBlock matchgroup=rubyControl start="\" end="\" contains=ALLBUT,@rubyNotTop fold - " curly bracket block or hash literal - syn region rubyCurlyBlock matchgroup=rubyCurlyBlockDelimiter start="{" end="}" contains=ALLBUT,@rubyNotTop fold - syn region rubyArrayLiteral matchgroup=rubyArrayDelimiter start="\%(\w\|[\]})]\)\@" end="\" contains=ALLBUT,@rubyNotTop fold - syn region rubyCaseExpression matchgroup=rubyConditional start="\" end="\" contains=ALLBUT,@rubyNotTop fold - syn region rubyConditionalExpression matchgroup=rubyConditional start="\%(\%(^\|\.\.\.\=\|[{:,;([<>~\*/%&^|+=-]\|\%(\<[_[:lower:]][_[:alnum:]]*\)\@" end="\%(\%(\%(\.\@" contains=ALLBUT,@rubyNotTop fold - - syn match rubyConditional "\<\%(then\|else\|when\)\>[?!]\@!" contained containedin=rubyCaseExpression - syn match rubyConditional "\<\%(then\|else\|elsif\)\>[?!]\@!" contained containedin=rubyConditionalExpression - - syn match rubyExceptional "\<\%(\%(\%(;\|^\)\s*\)\@<=rescue\|else\|ensure\)\>[?!]\@!" contained containedin=rubyBlockExpression - syn match rubyMethodExceptional "\<\%(\%(\%(;\|^\)\s*\)\@<=rescue\|else\|ensure\)\>[?!]\@!" contained containedin=rubyMethodBlock - - " statements with optional 'do' - syn region rubyOptionalDoLine matchgroup=rubyRepeat start="\[?!]\@!" start="\%(\%(^\|\.\.\.\=\|[{:,;([<>~\*/%&^|+-]\|\%(\<[_[:lower:]][_[:alnum:]]*\)\@" matchgroup=rubyOptionalDo end="\%(\\)" end="\ze\%(;\|$\)" oneline contains=ALLBUT,@rubyNotTop - syn region rubyRepeatExpression start="\[?!]\@!" start="\%(\%(^\|\.\.\.\=\|[{:,;([<>~\*/%&^|+-]\|\%(\<[_[:lower:]][_[:alnum:]]*\)\@" matchgroup=rubyRepeat end="\" contains=ALLBUT,@rubyNotTop nextgroup=rubyOptionalDoLine fold - - if !exists("ruby_minlines") - let ruby_minlines = 500 - endif - exec "syn sync minlines=" . ruby_minlines - -else - syn match rubyControl "\[?!]\@!" nextgroup=rubyMethodDeclaration skipwhite skipnl - syn match rubyControl "\[?!]\@!" nextgroup=rubyClassDeclaration skipwhite skipnl - syn match rubyControl "\[?!]\@!" nextgroup=rubyModuleDeclaration skipwhite skipnl - syn match rubyControl "\<\%(case\|begin\|do\|for\|if\|unless\|while\|until\|else\|elsif\|ensure\|then\|when\|end\)\>[?!]\@!" - syn match rubyKeyword "\<\%(alias\|undef\)\>[?!]\@!" -endif - -" Special Methods -if !exists("ruby_no_special_methods") - syn keyword rubyAccess public protected private public_class_method private_class_method public_constant private_constant module_function - " attr is a common variable name - syn match rubyAttribute "\%(\%(^\|;\)\s*\)\@<=attr\>\(\s*[.=]\)\@!" - syn keyword rubyAttribute attr_accessor attr_reader attr_writer - syn match rubyControl "\<\%(exit!\|\%(abort\|at_exit\|exit\|fork\|loop\|trap\)\>[?!]\@!\)" - syn keyword rubyEval eval class_eval instance_eval module_eval - syn keyword rubyException raise fail catch throw - " false positive with 'include?' - syn match rubyInclude "\[?!]\@!" - syn keyword rubyInclude autoload extend load prepend refine require require_relative using - syn keyword rubyKeyword callcc caller lambda proc -endif - -" Comments and Documentation -syn match rubySharpBang "\%^#!.*" display -syn keyword rubyTodo FIXME NOTE TODO OPTIMIZE XXX todo contained -syn match rubyComment "#.*" contains=rubySharpBang,rubySpaceError,rubyTodo,@Spell -if !exists("ruby_no_comment_fold") - syn region rubyMultilineComment start="\%(\%(^\s*#.*\n\)\@" transparent contains=NONE -syn match rubyKeywordAsMethod "\%(\%(\.\@" transparent contains=NONE -syn match rubyKeywordAsMethod "\%(\%(\.\@" transparent contains=NONE -syn match rubyKeywordAsMethod "\%(\%(\.\@" transparent contains=NONE - -syn match rubyKeywordAsMethod "\<\%(alias\|begin\|case\|class\|def\|do\|end\)[?!]" transparent contains=NONE -syn match rubyKeywordAsMethod "\<\%(if\|module\|refine\|undef\|unless\|until\|while\)[?!]" transparent contains=NONE - -syn match rubyKeywordAsMethod "\%(\%(\.\@" transparent contains=NONE -syn match rubyKeywordAsMethod "\%(\%(\.\@" transparent contains=NONE -syn match rubyKeywordAsMethod "\%(\%(\.\@" transparent contains=NONE -syn match rubyKeywordAsMethod "\%(\%(\.\@" transparent contains=NONE -syn match rubyKeywordAsMethod "\%(\%(\.\@" transparent contains=NONE -syn match rubyKeywordAsMethod "\%(\%(\.\@" transparent contains=NONE - -" __END__ Directive -syn region rubyData matchgroup=rubyDataDirective start="^__END__$" end="\%$" fold - -hi def link rubyClass rubyDefine -hi def link rubyModule rubyDefine -hi def link rubyMethodExceptional rubyDefine -hi def link rubyDefine Define -hi def link rubyFunction Function -hi def link rubyConditional Conditional -hi def link rubyConditionalModifier rubyConditional -hi def link rubyExceptional rubyConditional -hi def link rubyRepeat Repeat -hi def link rubyRepeatModifier rubyRepeat -hi def link rubyOptionalDo rubyRepeat -hi def link rubyControl Statement -hi def link rubyInclude Include -hi def link rubyInteger Number -hi def link rubyASCIICode Character -hi def link rubyFloat Float -hi def link rubyBoolean Boolean -hi def link rubyException Exception -if !exists("ruby_no_identifiers") - hi def link rubyIdentifier Identifier -else - hi def link rubyIdentifier NONE -endif -hi def link rubyClassVariable rubyIdentifier -hi def link rubyConstant Type -hi def link rubyGlobalVariable rubyIdentifier -hi def link rubyBlockParameter rubyIdentifier -hi def link rubyInstanceVariable rubyIdentifier -hi def link rubyPredefinedIdentifier rubyIdentifier -hi def link rubyPredefinedConstant rubyPredefinedIdentifier -hi def link rubyPredefinedVariable rubyPredefinedIdentifier -hi def link rubySymbol Constant -hi def link rubyKeyword Keyword -hi def link rubyOperator Operator -hi def link rubyBeginEnd Statement -hi def link rubyAccess Statement -hi def link rubyAttribute Statement -hi def link rubyEval Statement -hi def link rubyPseudoVariable Constant - -hi def link rubyComment Comment -hi def link rubyData Comment -hi def link rubyDataDirective Delimiter -hi def link rubyDocumentation Comment -hi def link rubyTodo Todo - -hi def link rubyQuoteEscape rubyStringEscape -hi def link rubyStringEscape Special -hi def link rubyInterpolationDelimiter Delimiter -hi def link rubyNoInterpolation rubyString -hi def link rubySharpBang PreProc -hi def link rubyRegexpDelimiter rubyStringDelimiter -hi def link rubySymbolDelimiter rubyStringDelimiter -hi def link rubyStringDelimiter Delimiter -hi def link rubyHeredoc rubyString -hi def link rubyString String -hi def link rubyRegexpEscape rubyRegexpSpecial -hi def link rubyRegexpQuantifier rubyRegexpSpecial -hi def link rubyRegexpAnchor rubyRegexpSpecial -hi def link rubyRegexpDot rubyRegexpCharClass -hi def link rubyRegexpCharClass rubyRegexpSpecial -hi def link rubyRegexpSpecial Special -hi def link rubyRegexpComment Comment -hi def link rubyRegexp rubyString - -hi def link rubyInvalidVariable Error -hi def link rubyError Error -hi def link rubySpaceError rubyError - -let b:current_syntax = "ruby" - -" vim: nowrap sw=2 sts=2 ts=8 noet: