]> granicus.if.org Git - vim/commitdiff
Runtime file updates.
authorBram Moolenaar <Bram@vim.org>
Fri, 28 May 2010 18:54:39 +0000 (20:54 +0200)
committerBram Moolenaar <Bram@vim.org>
Fri, 28 May 2010 18:54:39 +0000 (20:54 +0200)
15 files changed:
.gitignore
runtime/autoload/rubycomplete.vim
runtime/compiler/eruby.vim
runtime/compiler/rspec.vim
runtime/compiler/ruby.vim
runtime/compiler/rubyunit.vim
runtime/doc/index.txt
runtime/doc/quickref.txt
runtime/doc/todo.txt
runtime/ftplugin/eruby.vim
runtime/ftplugin/ruby.vim
runtime/indent/eruby.vim
runtime/indent/ruby.vim
runtime/syntax/eruby.vim
runtime/syntax/ruby.vim

index 2fe2d985a7c59936685f97dc7128b157a7bff394..a0d4f33f18e51931970f0bcf59d01b1a1d664271 100644 (file)
@@ -2,6 +2,8 @@
 *.o
 src/vim
 src/xxd/xxd
+src/auto/if_perl.c
+src/tags
 
 # We do need src/auto/configure and src/auto/config.mk.
 src/auto/osdef.h
@@ -36,4 +38,5 @@ gvimext.lib
 *.rej
 *.orig
 *.mo
+*.swp
 *~
index 86baa0d272cbe8037148a8718b1360089e789ad7..f89be52e99f615cf5f2d5e0acd11accf1b78b88e 100644 (file)
@@ -1,11 +1,11 @@
 " Vim completion script
 " Language:             Ruby
 " Maintainer:           Mark Guzman <segfault@hasno.info>
-" Info:                 $Id: rubycomplete.vim,v 1.41 2008/06/30 06:50:45 segy Exp $
+" Last Change:          2009 Sep 28
 " URL:                  http://vim-ruby.rubyforge.org
 " Anon CVS:             See above site
 " Release Coordinator:  Doug Kearns <dougkearns@gmail.com>
-" Maintainer Version:   0.8
+" Maintainer Version:   0.8.1
 " ----------------------------------------------------------------------------
 "
 " Ruby IRB/Complete author: Keiju ISHITSUKA(keiju@ishitsuka.com)
@@ -325,7 +325,7 @@ class VimRubyCompletion
           ln = buf[x]
           if /^\s*(module|class|def|include)\s+/.match(ln)
             clscnt += 1 if $1 == "class"
-            #dprint "\$1: %s" % $1
+            #dprint "\$1$1
             classdef += "%s\n" % ln
             classdef += "end\n" if /def\s+/.match(ln)
             dprint ln
@@ -632,7 +632,7 @@ class VimRubyCompletion
         methods = Object.constants
         methods.grep(/^#{receiver}/).collect{|e| "::" + e}
 
-      when /^(((::)?[A-Z][^:.\(]*)+)::?([^:.]*)$/ # Constant or class methods
+      when /^(((::)?[A-Z][^:.\(]*)+?)::?([^:.]*)$/ # Constant or class methods
         receiver = $1
         message = Regexp.quote($4)
         dprint "const or cls 2 [recv: \'%s\', msg: \'%s\']" % [ receiver, message ]
@@ -666,7 +666,7 @@ class VimRubyCompletion
         dprint "global"
         methods = global_variables.grep(Regexp.new(Regexp.quote($1)))
 
-      when /^((\.?[^.]+)+)\.([^.]*)$/ # variable
+      when /^((\.?[^.]+)+?)\.([^.]*)$/ # variable
         dprint "variable"
         receiver = $1
         message = Regexp.quote($3)
index 1a6813624c5005dd5bc2c4c36cfc2a6c797b1ffc..614fc17f6f6a689a99b376c7b315a6fbc0c63490 100644 (file)
@@ -1,7 +1,7 @@
 " Vim compiler file
 " Language:            eRuby
 " Maintainer:          Doug Kearns <dougkearns@gmail.com>
-" Info:                        $Id: eruby.vim,v 1.7 2008/06/29 04:18:42 tpope Exp $
+" Last Change:         2008 Aug 1
 " URL:                 http://vim-ruby.rubyforge.org
 " Anon CVS:            See above site
 " Release Coordinator: Doug Kearns <dougkearns@gmail.com>
index c185bc79d358ebf6057fdbb5b49771f1dd5e2ba2..f46527ef1c20041bc748f2fe0dff8bd313ee7e67 100644 (file)
@@ -1,7 +1,7 @@
 " Vim compiler file
 " Language:            RSpec
-" Maintainer:          Tim Pope <vimNOSPAM@tpope.info>
-" Info:                        $Id: rspec.vim,v 1.2 2008/06/29 04:18:42 tpope Exp $
+" Maintainer:          Tim Pope <vimNOSPAM@tpope.org>
+" Last Change:         2009 Dec 22
 " URL:                 http://vim-ruby.rubyforge.org
 " Anon CVS:            See above site
 " Release Coordinator: Doug Kearns <dougkearns@gmail.com>
index ff3b3c702c0881a44e23e159cf8322fc1118e6bf..9499ce189742ac272a14e8c039ff6e3e35dc2080 100644 (file)
@@ -2,7 +2,7 @@
 " Language:            Ruby
 " Function:            Syntax check and/or error reporting
 " Maintainer:          Tim Hammerquist <timh at rubyforge.org>
-" Info:                        $Id: ruby.vim,v 1.13 2008/06/29 04:18:43 tpope Exp $
+" Last Change:         2008 Aug 1
 " URL:                 http://vim-ruby.rubyforge.org
 " Anon CVS:            See above site
 " Release Coordinator: Doug Kearns <dougkearns@gmail.com>
index dd5d4cb81a06dab6c33a1946b4a5ef4e5a430e62..524c205f8a694fb21a2a90cd9776ac0abfb2c73f 100644 (file)
@@ -1,7 +1,7 @@
 " Vim compiler file
 " Language:            Test::Unit - Ruby Unit Testing Framework
 " Maintainer:          Doug Kearns <dougkearns@gmail.com>
-" Info:                        $Id: rubyunit.vim,v 1.12 2008/06/29 04:18:43 tpope Exp $
+" Last Change:         2008 Aug 1
 " URL:                 http://vim-ruby.rubyforge.org
 " Anon CVS:            See above site
 " Release Coordinator: Doug Kearns <dougkearns@gmail.com>
index 07c5768a2fcf60731a2c93d3170e8bf691d99e2f..da56816436e67c6269dddba1ba70b966aade4791 100644 (file)
@@ -1399,6 +1399,7 @@ The commands are sorted on the non-optional part of their name.
 |:ruby|                :rub[y]         execute Ruby command
 |:rubydo|      :rubyd[o]       execute Ruby command for each line
 |:rubyfile|    :rubyf[ile]     execute Ruby script file
+|:rundo|       :rund[o]        read undo information from a file
 |:runtime|     :ru[ntime]      source vim scripts in 'runtimepath'
 |:rviminfo|    :rv[iminfo]     read from viminfo file
 |:substitute|  :s[ubstitute]   find and replace text
@@ -1564,6 +1565,7 @@ The commands are sorted on the non-optional part of their name.
 |:wq|          :wq             write to a file and quit window or Vim
 |:wqall|       :wqa[ll]        write all changed buffers and quit Vim
 |:wsverb|      :ws[verb]       pass the verb to workshop over IPC
+|:wundo|       :wu[ndo]        write undo information to a file
 |:wviminfo|    :wv[iminfo]     write to viminfo file
 |:xit|         :x[it]          write if buffer changed and quit window or Vim
 |:xall|                :xa[ll]         same as ":wqall"
index 551b1adf92c993c7a17c80227447aee073387f9f..96c5cfbb52b8734df91d71301b02431f2475b8b9 100644 (file)
@@ -912,6 +912,8 @@ Short explanation of each option:           *option-list*
 'ttymouse'       'ttym'    type of mouse codes generated
 'ttyscroll'      'tsl'     maximum number of lines for a scroll
 'ttytype'        'tty'     alias for 'term'
+'undodir'        'udir'    where to store undo files
+'undofile'       'udf'     save undo information in a file
 'undolevels'     'ul'      maximum number of changes that can be undone
 'updatecount'    'uc'      after this many characters flush swap file
 'updatetime'     'ut'      after this many milliseconds flush swap file
index 572a4fa5f9a0f527267ecfba2dcb95bb737ca4a7..e0a61594469f70f10f2582ae8717ced9f12cc8d8 100644 (file)
@@ -33,6 +33,8 @@ be worked on, but only if you sponsor Vim development.  See |sponsor|.
 When Vim crashes it may run out of stack while executing autocommands.  Patch
 to not run autocommands when leaving Vim? (James Vega, 2010 May 23)
 
+Patch for invalid mem access in completion. (Dominique Pelle, 2010 May 26)
+
 Invalid memory access when deleting funcref variable.  Patch by Lech Lorens,
 2010 May 25.
 
@@ -129,6 +131,10 @@ Change to C syntax folding to make it work much faster, but a bit less
 reliable. (Lech Lorens, 2009 Nov 9)  Enable with an option?
 Most time is spent in in_id_list().
 
+Slow combination of folding and PHP syntax highlighting.  Script to reproduce
+it.  Caused by "syntax sync fromstart" in combination with patch 7.2.274.
+(Christian Brabandt, 2010 May 27)
+
 Check for unused functions, idea:
 http://blog.flameeyes.eu/2008/01/17/today-how-to-identify-unused-exported-functions-and-variables
 
@@ -1094,13 +1100,11 @@ Vim 7.3:
 - Win32 DOS and Win32 console version: test69 fails.
 - Win32 binary: vim -r fails. (Antonio Colombo)  Also on Unix.
 - using NSIS 2.46: install on Windows 7 works, but no "Edit with Vim" menu.
+   Use register_shell_extension()? (George Reilly, 2010 May 26)
    Ron's version: http://dev.ronware.org/p/vim/finfo?name=gvim.nsi
-- When running uninstall program from NSIS via install.exe, still need to
-  ask confirmation in console window, uninstaller doesn't wait.
-  Wait until the uninstaller is deleted -> doesn't work when cancelling
-  Wait until window is gone with EnumWindows (see os_win32.c).
 Patches to include:
 - Persistent undo bugs / fixes:
+    - binary distributed: ":wundo" always fails.
     - Patch not to allocate extra byte in U_ALLOC_LINE() (Dominique, 2010 May
       25)
     - Remove the old code when U_USE_MALLOC is not defined?
index 9e121c20ba09121630b7110a21dfe9159da2c6bc..7c19a09aa36f9219c00d3ba5843d380a2d1b74c0 100644 (file)
@@ -1,7 +1,7 @@
 " Vim filetype plugin
 " Language:            eRuby
-" Maintainer:          Tim Pope <vimNOSPAM@tpope.info>
-" Info:                        $Id: eruby.vim,v 1.12 2008/06/29 04:18:43 tpope Exp $
+" Maintainer:          Tim Pope <vimNOSPAM@tpope.org>
+" Last Change:         2010 Apr 15
 " URL:                 http://vim-ruby.rubyforge.org
 " Anon CVS:            See above site
 " Release Coordinator: Doug Kearns <dougkearns@gmail.com>
@@ -27,7 +27,10 @@ if !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\)\+$','',''),'\.\zs\w\+$')
+    let b:eruby_subtype = matchstr(&filetype,'^eruby\.\zs\w\+')
+  endif
+  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'
index 7dfdfb5ad7f16ec6dd3d0d91f5ef40f46ff3da91..6b9363e480407011cd3d81e655dd40884ea89635 100644 (file)
@@ -1,7 +1,7 @@
 " Vim filetype plugin
 " Language:            Ruby
 " Maintainer:          Gavin Sinclair <gsinclair at gmail.com>
-" Info:                        $Id: ruby.vim,v 1.40 2008/06/29 04:18:43 tpope Exp $
+" Last Change:         2010 Mar 15
 " URL:                 http://vim-ruby.rubyforge.org
 " Anon CVS:            See above site
 " Release Coordinator:  Doug Kearns <dougkearns@gmail.com>
@@ -69,26 +69,28 @@ endif
 setlocal comments=:#
 setlocal commentstring=#\ %s
 
-if !exists("s:rubypath")
-  if has("ruby") && has("win32")
-    ruby VIM::command( 'let s:rubypath = "%s"' % ($: + begin; require %q{rubygems}; Gem.all_load_paths.sort.uniq; rescue LoadError; []; end).join(%q{,}) )
-    let s:rubypath = '.,' . substitute(s:rubypath, '\%(^\|,\)\.\%(,\|$\)', ',,', '')
+if !exists("s:ruby_path")
+  if exists("g:ruby_path")
+    let s:ruby_path = g:ruby_path
+  elseif has("ruby") && has("win32")
+    ruby VIM::command( 'let s:ruby_path = "%s"' % ($: + begin; require %q{rubygems}; Gem.all_load_paths.sort.uniq; rescue LoadError; []; end).join(%q{,}) )
+    let s:ruby_path = '.,' . substitute(s:ruby_path, '\%(^\|,\)\.\%(,\|$\)', ',,', '')
   elseif executable("ruby")
     let s:code = "print ($: + begin; require %q{rubygems}; Gem.all_load_paths.sort.uniq; rescue LoadError; []; end).join(%q{,})"
     if &shellxquote == "'"
-      let s:rubypath = system('ruby -e "' . s:code . '"')
+      let s:ruby_path = system('ruby -e "' . s:code . '"')
     else
-      let s:rubypath = system("ruby -e '" . s:code . "'")
+      let s:ruby_path = system("ruby -e '" . s:code . "'")
     endif
-    let s:rubypath = '.,' . substitute(s:rubypath, '\%(^\|,\)\.\%(,\|$\)', ',,', '')
+    let s:ruby_path = '.,' . substitute(s:ruby_path, '\%(^\|,\)\.\%(,\|$\)', ',,', '')
   else
     " If we can't call ruby to get its path, just default to using the
     " current directory and the directory of the current file.
-    let s:rubypath = ".,,"
+    let s:ruby_path = ".,,"
   endif
 endif
 
-let &l:path = s:rubypath
+let &l:path = s:ruby_path
 
 if has("gui_win32") && !exists("b:browsefilter")
   let b:browsefilter = "Ruby Source Files (*.rb)\t*.rb\n" .
@@ -102,19 +104,44 @@ let b:undo_ftplugin = "setl fo< inc< inex< sua< def< com< cms< path< kp<"
 
 if !exists("g:no_plugin_maps") && !exists("g:no_ruby_maps")
 
-  noremap <silent> <buffer> [m :<C-U>call <SID>searchsyn('\<def\>','rubyDefine','b')<CR>
-  noremap <silent> <buffer> ]m :<C-U>call <SID>searchsyn('\<def\>','rubyDefine','')<CR>
-  noremap <silent> <buffer> [M :<C-U>call <SID>searchsyn('\<end\>','rubyDefine','b')<CR>
-  noremap <silent> <buffer> ]M :<C-U>call <SID>searchsyn('\<end\>','rubyDefine','')<CR>
+  nnoremap <silent> <buffer> [m :<C-U>call <SID>searchsyn('\<def\>','rubyDefine','b','n')<CR>
+  nnoremap <silent> <buffer> ]m :<C-U>call <SID>searchsyn('\<def\>','rubyDefine','','n')<CR>
+  nnoremap <silent> <buffer> [M :<C-U>call <SID>searchsyn('\<end\>','rubyDefine','b','n')<CR>
+  nnoremap <silent> <buffer> ]M :<C-U>call <SID>searchsyn('\<end\>','rubyDefine','','n')<CR>
+  xnoremap <silent> <buffer> [m :<C-U>call <SID>searchsyn('\<def\>','rubyDefine','b','v')<CR>
+  xnoremap <silent> <buffer> ]m :<C-U>call <SID>searchsyn('\<def\>','rubyDefine','','v')<CR>
+  xnoremap <silent> <buffer> [M :<C-U>call <SID>searchsyn('\<end\>','rubyDefine','b','v')<CR>
+  xnoremap <silent> <buffer> ]M :<C-U>call <SID>searchsyn('\<end\>','rubyDefine','','v')<CR>
 
-  noremap <silent> <buffer> [[ :<C-U>call <SID>searchsyn('\<\%(class\<Bar>module\)\>','rubyModule\<Bar>rubyClass','b')<CR>
-  noremap <silent> <buffer> ]] :<C-U>call <SID>searchsyn('\<\%(class\<Bar>module\)\>','rubyModule\<Bar>rubyClass','')<CR>
-  noremap <silent> <buffer> [] :<C-U>call <SID>searchsyn('\<end\>','rubyModule\<Bar>rubyClass','b')<CR>
-  noremap <silent> <buffer> ][ :<C-U>call <SID>searchsyn('\<end\>','rubyModule\<Bar>rubyClass','')<CR>
+  nnoremap <silent> <buffer> [[ :<C-U>call <SID>searchsyn('\<\%(class\<Bar>module\)\>','rubyModule\<Bar>rubyClass','b','n')<CR>
+  nnoremap <silent> <buffer> ]] :<C-U>call <SID>searchsyn('\<\%(class\<Bar>module\)\>','rubyModule\<Bar>rubyClass','','n')<CR>
+  nnoremap <silent> <buffer> [] :<C-U>call <SID>searchsyn('\<end\>','rubyModule\<Bar>rubyClass','b','n')<CR>
+  nnoremap <silent> <buffer> ][ :<C-U>call <SID>searchsyn('\<end\>','rubyModule\<Bar>rubyClass','','n')<CR>
+  xnoremap <silent> <buffer> [[ :<C-U>call <SID>searchsyn('\<\%(class\<Bar>module\)\>','rubyModule\<Bar>rubyClass','b','v')<CR>
+  xnoremap <silent> <buffer> ]] :<C-U>call <SID>searchsyn('\<\%(class\<Bar>module\)\>','rubyModule\<Bar>rubyClass','','v')<CR>
+  xnoremap <silent> <buffer> [] :<C-U>call <SID>searchsyn('\<end\>','rubyModule\<Bar>rubyClass','b','v')<CR>
+  xnoremap <silent> <buffer> ][ :<C-U>call <SID>searchsyn('\<end\>','rubyModule\<Bar>rubyClass','','v')<CR>
 
   let b:undo_ftplugin = b:undo_ftplugin
         \."| sil! exe 'unmap <buffer> [[' | sil! exe 'unmap <buffer> ]]' | sil! exe 'unmap <buffer> []' | sil! exe 'unmap <buffer> ]['"
         \."| sil! exe 'unmap <buffer> [m' | sil! exe 'unmap <buffer> ]m' | sil! exe 'unmap <buffer> [M' | sil! exe 'unmap <buffer> ]M'"
+
+  if maparg("\<C-]>",'n') == ''
+    nnoremap <silent> <buffer> <C-]>       :<C-U>exe  v:count1."tag <C-R>=RubyCursorIdentifier()<CR>"<CR>
+    nnoremap <silent> <buffer> g<C-]>      :<C-U>exe         "tjump <C-R>=RubyCursorIdentifier()<CR>"<CR>
+    nnoremap <silent> <buffer> g]          :<C-U>exe       "tselect <C-R>=RubyCursorIdentifier()<CR>"<CR>
+    nnoremap <silent> <buffer> <C-W>]      :<C-U>exe v:count1."stag <C-R>=RubyCursorIdentifier()<CR>"<CR>
+    nnoremap <silent> <buffer> <C-W><C-]>  :<C-U>exe v:count1."stag <C-R>=RubyCursorIdentifier()<CR>"<CR>
+    nnoremap <silent> <buffer> <C-W>g<C-]> :<C-U>exe        "stjump <C-R>=RubyCursorIdentifier()<CR>"<CR>
+    nnoremap <silent> <buffer> <C-W>g]     :<C-U>exe      "stselect <C-R>=RubyCursorIdentifier()<CR>"<CR>
+    nnoremap <silent> <buffer> <C-W>}      :<C-U>exe          "ptag <C-R>=RubyCursorIdentifier()<CR>"<CR>
+    nnoremap <silent> <buffer> <C-W>g}     :<C-U>exe        "ptjump <C-R>=RubyCursorIdentifier()<CR>"<CR>
+    let b:undo_ftplugin = b:undo_ftplugin
+          \."| sil! exe 'nunmap <buffer> <C-]>'| sil! exe 'nunmap <buffer> g<C-]>'| sil! exe 'nunmap <buffer> g]'"
+          \."| sil! exe 'nunmap <buffer> <C-W>]'| sil! exe 'nunmap <buffer> <C-W><C-]>'"
+          \."| sil! exe 'nunmap <buffer> <C-W>g<C-]>'| sil! exe 'nunmap <buffer> <C-W>g]'"
+          \."| sil! exe 'nunmap <buffer> <C-W>}'| sil! exe 'nunmap <buffer> <C-W>g}'"
+  endif
 endif
 
 let &cpo = s:cpo_save
@@ -174,8 +201,11 @@ function! RubyBalloonexpr()
   endif
 endfunction
 
-function! s:searchsyn(pattern,syn,flags)
+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
@@ -197,6 +227,20 @@ function! s:synname()
     return synIDattr(synID(line('.'),col('.'),0),'name')
 endfunction
 
+function! RubyCursorIdentifier()
+  let asciicode    = '\%(\w\|[]})\"'."'".']\)\@<!\%(?\%(\\M-\\C-\|\\C-\\M-\|\\M-\\c\|\\c\\M-\|\\c\|\\C-\|\\M-\)\=\%(\\\o\{1,3}\|\\x\x\{1,2}\|\\\=\S\)\)'
+  let number       = '\%(\%(\w\|[]})\"'."'".']\s*\)\@<!-\)\=\%(\<[[:digit:]_]\+\%(\.[[:digit:]_]\+\)\=\%([Ee][[:digit:]_]\+\)\=\>\|\<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.'\|\%(:\@<!:\)\='.symbolizable.'\)'
+  let [lnum, col]  = searchpos(pattern,'bcn',line('.'))
+  let raw          = matchstr(getline('.')[col-1 : ],pattern)
+  let stripped     = substitute(substitute(raw,'\s\+=$','=',''),'^\s*:\=','','')
+  return stripped == '' ? expand("<cword>") : stripped
+endfunction
+
 "
 " Instructions for enabling "matchit" support:
 "
index 931eaac3859ebc42ebdc699ad5da3baf9530fc88..a4de118ccf1a7738273a25bf03ff414f1b81c14b 100644 (file)
@@ -1,7 +1,7 @@
 " Vim indent file
 " Language:            eRuby
-" Maintainer:          Tim Pope <vimNOSPAM@tpope.info>
-" Info:                        $Id: eruby.vim,v 1.16 2008/06/29 04:18:43 tpope Exp $
+" Maintainer:          Tim Pope <vimNOSPAM@tpope.org>
+" Last Change:         2010 May 28
 " URL:                 http://vim-ruby.rubyforge.org
 " Anon CVS:            See above site
 " Release Coordinator: Doug Kearns <dougkearns@gmail.com>
@@ -58,7 +58,10 @@ function! GetErubyIndent(...)
   let lnum = prevnonblank(v:lnum-1)
   let line = getline(lnum)
   let cline = getline(v:lnum)
-  if cline =~# '<%-\=\s*\%(}\|end\|else\|\%(ensure\|rescue\|elsif\|when\).\{-\}\)\s*\%(-\=%>\|$\)'
+  if cline =~# '^\s*<%-\=\s*\%(}\|end\|else\|\%(ensure\|rescue\|elsif\|when\).\{-\}\)\s*\%(-\=%>\|$\)'
+    let ind = ind - &sw
+  endif
+  if line =~# '\S\s*<%-\=\s*\%(}\|end\).\{-\}\s*\%(-\=%>\|$\)'
     let ind = ind - &sw
   endif
   if line =~# '\%({\|\<do\)\%(\s*|[^|]*|\)\=\s*-\=%>'
index 4a3012f94fbd764a5e1fb61bceb53b943b789bbc..04d130104dd12a71bab11fa28437b7fe6878fff4 100644 (file)
@@ -1,7 +1,7 @@
 " Vim indent file
 " Language:            Ruby
 " Maintainer:          Nikolai Weibull <now at bitwi.se>
-" Info:                        $Id: ruby.vim,v 1.47 2008/06/29 04:18:43 tpope Exp $
+" Last Change:         2009 Dec 17
 " URL:                 http://vim-ruby.rubyforge.org
 " Anon CVS:            See above site
 " Release Coordinator: Doug Kearns <dougkearns@gmail.com>
@@ -178,7 +178,7 @@ function s:LineHasOpeningBrackets(lnum)
 endfunction
 
 function s:Match(lnum, regex)
-  let col = match(getline(a:lnum), a:regex) + 1
+  let col = match(getline(a:lnum), '\C'.a:regex) + 1
   return col > 0 && !s:IsInStringOrComment(a:lnum, col) ? col : 0
 endfunction
 
index 1e45ffd491fa26281e9602f6032c6fa79a041a74..42c8b51065ae7f96c1480b844ff3435009276a18 100644 (file)
@@ -1,7 +1,7 @@
 " Vim syntax file
 " Language:            eRuby
-" Maintainer:          Tim Pope <vimNOSPAM@tpope.info>
-" Info:                        $Id: eruby.vim,v 1.23 2008/06/29 04:18:43 tpope Exp $
+" Maintainer:          Tim Pope <vimNOSPAM@tpope.org>
+" Last Change:         2010 Apr 15
 " URL:                 http://vim-ruby.rubyforge.org
 " Anon CVS:            See above site
 " Release Coordinator: Doug Kearns <dougkearns@gmail.com>
@@ -22,7 +22,10 @@ if !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\)\+$','',''),'\.\zs\w\+$')
+    let b:eruby_subtype = matchstr(&filetype,'^eruby\.\zs\w\+')
+  endif
+  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'
@@ -56,13 +59,13 @@ 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="-\=%\@<!%\{1,'.b:eruby_nest_level.'\}>" contains=@rubyTop        containedin=ALLBUT,@erubyRegions keepend'
-exe 'syn region  erubyExpression matchgroup=erubyDelimiter start="<%\{1,'.b:eruby_nest_level.'\}="       end="-\=%\@<!%\{1,'.b:eruby_nest_level.'\}>" contains=@rubyTop        containedin=ALLBUT,@erubyRegions keepend'
-exe 'syn region  erubyComment    matchgroup=erubyDelimiter start="<%\{1,'.b:eruby_nest_level.'\}#"       end="-\=%\@<!%\{1,'.b:eruby_nest_level.'\}>" contains=rubyTodo,@Spell containedin=ALLBUT,@erubyRegions keepend'
+exe 'syn region  erubyBlock      matchgroup=erubyDelimiter start="<%\{1,'.b:eruby_nest_level.'\}%\@!-\=" end="[=-]\=%\@<!%\{1,'.b:eruby_nest_level.'\}>" contains=@rubyTop  containedin=ALLBUT,@erubyRegions keepend'
+exe 'syn region  erubyExpression matchgroup=erubyDelimiter start="<%\{1,'.b:eruby_nest_level.'\}=\{1,4}" end="[=-]\=%\@<!%\{1,'.b:eruby_nest_level.'\}>" contains=@rubyTop  containedin=ALLBUT,@erubyRegions keepend'
+exe 'syn region  erubyComment    matchgroup=erubyDelimiter start="<%\{1,'.b:eruby_nest_level.'\}#"       end="%\@<!%\{1,'.b:eruby_nest_level.'\}>" contains=rubyTodo,@Spell containedin=ALLBUT,@erubyRegions keepend'
 
 " Define the default highlighting.
 
-hi def link erubyDelimiter             Delimiter
+hi def link erubyDelimiter             PreProc
 hi def link erubyComment               Comment
 
 let b:current_syntax = 'eruby'
index f82b4c2cb74f7b32430ac2bfdc168bc82b5d71f1..e3aee1200d21d9cf7173dd27d9ca53e51c349718 100644 (file)
@@ -1,7 +1,7 @@
 " Vim syntax file
 " Language:            Ruby
 " Maintainer:          Doug Kearns <dougkearns@gmail.com>
-" Info:                        $Id: ruby.vim,v 1.152 2008/06/29 04:33:41 tpope Exp $
+" Last Change:         2009 Dec 2
 " URL:                 http://vim-ruby.rubyforge.org
 " Anon CVS:            See above site
 " Release Coordinator: Doug Kearns <dougkearns@gmail.com>
@@ -19,7 +19,7 @@ if has("folding") && exists("ruby_fold")
   setlocal foldmethod=syntax
 endif
 
-syn cluster rubyNotTop                 contains=@rubyExtendedStringSpecial,@rubyRegexpSpecial,@rubyDeclaration,rubyConditional,rubyTodo
+syn cluster rubyNotTop contains=@rubyExtendedStringSpecial,@rubyRegexpSpecial,@rubyDeclaration,rubyConditional,rubyExceptional,rubyMethodExceptional,rubyTodo
 
 if exists("ruby_space_errors")
   if !exists("ruby_no_trail_space_error")
@@ -38,76 +38,79 @@ if exists("ruby_operators")
 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 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  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  rubyInterpolation         "#\$\%(-\w\|\W\)"       display contained contains=rubyInterpolationDelimiter,rubyPredefinedVariable,rubyInvalidVariable
 syn match  rubyInterpolationDelimiter "#\ze\$\%(-\w\|\W\)"    display contained
-syn region rubyNoInterpolation       start="\\#{" end="}"    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  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
+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 display
-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 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
+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\|[]})\"'/]\)\@<!\%(?\%(\\M-\\C-\|\\C-\\M-\|\\M-\\c\|\\c\\M-\|\\c\|\\C-\|\\M-\)\=\%(\\\o\{1,3}\|\\x\x\{1,2}\|\\\=\S\)\)"
-syn match rubyInteger  "\<0[xX]\x\+\%(_\x\+\)*\>"                                                              display
-syn match rubyInteger  "\<\%(0[dD]\)\=\%(0\|[1-9]\d*\%(_\d\+\)*\)\>"                                           display
-syn match rubyInteger  "\<0[oO]\=\o\+\%(_\o\+\)*\>"                                                            display
-syn match rubyInteger  "\<0[bB][01]\+\%(_[01]\+\)*\>"                                                          display
-syn match rubyFloat    "\<\%(0\|[1-9]\d*\%(_\d\+\)*\)\.\d\+\%(_\d\+\)*\>"                                      display
-syn match rubyFloat    "\<\%(0\|[1-9]\d*\%(_\d\+\)*\)\%(\.\d\+\%(_\d\+\)*\)\=\%([eE][-+]\=\d\+\%(_\d\+\)*\)\>" display
+syn match rubyInteger  "\%(\%(\w\|[]})\"']\s*\)\@<!-\)\=\<0[xX]\x\+\%(_\x\+\)*\>"                                                              display
+syn match rubyInteger  "\%(\%(\w\|[]})\"']\s*\)\@<!-\)\=\<\%(0[dD]\)\=\%(0\|[1-9]\d*\%(_\d\+\)*\)\>"                                           display
+syn match rubyInteger  "\%(\%(\w\|[]})\"']\s*\)\@<!-\)\=\<0[oO]\=\o\+\%(_\o\+\)*\>"                                                            display
+syn match rubyInteger  "\%(\%(\w\|[]})\"']\s*\)\@<!-\)\=\<0[bB][01]\+\%(_[01]\+\)*\>"                                                          display
+syn match rubyFloat    "\%(\%(\w\|[]})\"']\s*\)\@<!-\)\=\<\%(0\|[1-9]\d*\%(_\d\+\)*\)\.\d\+\%(_\d\+\)*\>"                                      display
+syn match rubyFloat    "\%(\%(\w\|[]})\"']\s*\)\@<!-\)\=\<\%(0\|[1-9]\d*\%(_\d\+\)*\)\%(\.\d\+\%(_\d\+\)*\)\=\%([eE][-+]\=\d\+\%(_\d\+\)*\)\>" display
 
 " Identifiers
 syn match rubyLocalVariableOrMethod "\<[_[:lower:]][_[:alnum:]]*[?!=]\=" contains=NONE display transparent
 syn match rubyBlockArgument        "&[_[:lower:]][_[:alnum:]]"          contains=NONE display transparent
 
-syn match  rubyConstant                        "\%(\%([.@$]\@<!\.\)\@<!\<\|::\)\_s*\zs\u\w*\%(\>\|::\)\@=\%(\s*(\)\@!"
-syn match  rubyClassVariable           "@@\h\w*" display
-syn match  rubyInstanceVariable                "@\h\w*"  display
-syn match  rubyGlobalVariable          "$\%(\h\w*\|-.\)"
-syn match  rubySymbol                  "[]})\"':]\@<!:\%(\^\|\~\|<<\|<=>\|<=\|<\|===\|==\|=\~\|>>\|>=\|>\||\|-@\|-\|/\|\[]=\|\[]\|\*\*\|\*\|&\|%\|+@\|+\|`\)"
-syn match  rubySymbol                  "[]})\"':]\@<!:\$\%(-.\|[`~<=>_,;:!?/.'"@$*\&+0]\)"
-syn match  rubySymbol                  "[]})\"':]\@<!:\%(\$\|@@\=\)\=\h\w*"
-syn match  rubySymbol                  "[]})\"':]\@<!:\h\w*\%([?!=]>\@!\)\="
-syn region rubySymbol                  start="[]})\"':]\@<!:\"" end="\"" skip="\\\\\|\\\""
-syn region rubySymbol                  start="[]})\"':]\@<!:\"" end="\"" skip="\\\\\|\\\"" contains=@rubyStringSpecial fold
-
-syn match  rubyBlockParameter          "\h\w*" contained
-syn region rubyBlockParameterList      start="\%(\%(\<do\>\|{\)\s*\)\@<=|" end="|" oneline display contains=rubyBlockParameter
-
-syn match rubyInvalidVariable    "$[^ A-Za-z_-]"
+syn match  rubyConstant                "\%(\%([.@$]\@<!\.\)\@<!\<\|::\)\_s*\zs\u\w*\%(\>\|::\)\@=\%(\s*(\)\@!"
+syn match  rubyClassVariable   "@@\h\w*" display
+syn match  rubyInstanceVariable "@\h\w*"  display
+syn match  rubyGlobalVariable  "$\%(\h\w*\|-.\)"
+syn match  rubySymbol          "[]})\"':]\@<!:\%(\^\|\~\|<<\|<=>\|<=\|<\|===\|==\|=\~\|>>\|>=\|>\||\|-@\|-\|/\|\[]=\|\[]\|\*\*\|\*\|&\|%\|+@\|+\|`\)"
+syn match  rubySymbol          "[]})\"':]\@<!:\$\%(-.\|[`~<=>_,;:!?/.'"@$*\&+0]\)"
+syn match  rubySymbol          "[]})\"':]\@<!:\%(\$\|@@\=\)\=\h\w*"
+syn match  rubySymbol          "[]})\"':]\@<!:\h\w*\%([?!=]>\@!\)\="
+syn match  rubySymbol          "\%([{(,]\_s*\)\@<=\l\w*[!?]\=::\@!"he=e-1
+syn match  rubySymbol          "[]})\"':]\@<!\h\w*[!?]\=:\s\@="he=e-1
+syn region rubySymbol          start="[]})\"':]\@<!:'"  end="'"  skip="\\\\\|\\'"  contains=rubyQuoteEscape fold
+syn region rubySymbol          start="[]})\"':]\@<!:\"" end="\"" skip="\\\\\|\\\"" contains=@rubyStringSpecial fold
+
+syn match  rubyBlockParameter    "\h\w*" contained
+syn region rubyBlockParameterList start="\%(\%(\<do\>\|{\)\s*\)\@<=|" end="|" oneline display contains=rubyBlockParameter
+
+syn match rubyInvalidVariable   "$[^ A-Za-z_-]"
 syn match rubyPredefinedVariable #$[!$&"'*+,./0:;<=>?@\`~1-9]#
 syn match rubyPredefinedVariable "$_\>"                                                                                           display
 syn match rubyPredefinedVariable "$-[0FIKadilpvw]\>"                                                                      display
@@ -125,48 +128,48 @@ syn region rubyRegexp matchgroup=rubyRegexpDelimiter start="\%(\%(^\|\<\%(and\|o
 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
+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 fold
-syn region rubyString matchgroup=rubyStringDelimiter start="'" end="'"  skip="\\\\\|\\'"                              fold
+syn region rubyString matchgroup=rubyStringDelimiter start="'" end="'"  skip="\\\\\|\\'"  contains=rubyQuoteEscape    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="%[qw]\z([~`!@#$%^&*_\-+=|\:;"',.?/]\)"  end="\z1" skip="\\\\\|\\\z1" fold
-syn region rubyString matchgroup=rubyStringDelimiter start="%[qw]{"                                end="}"   skip="\\\\\|\\}"   fold   contains=rubyNestedCurlyBraces,rubyDelimEscape
-syn region rubyString matchgroup=rubyStringDelimiter start="%[qw]<"                                end=">"   skip="\\\\\|\\>"   fold   contains=rubyNestedAngleBrackets,rubyDelimEscape
-syn region rubyString matchgroup=rubyStringDelimiter start="%[qw]\["                               end="\]"  skip="\\\\\|\\\]"  fold   contains=rubyNestedSquareBrackets,rubyDelimEscape
-syn region rubyString matchgroup=rubyStringDelimiter start="%[qw]("                                end=")"   skip="\\\\\|\\)"   fold   contains=rubyNestedParentheses,rubyDelimEscape
-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
+syn region rubyString matchgroup=rubyStringDelimiter start="%[qw]\z([~`!@#$%^&*_\-+=|\:;"',.?/]\)" end="\z1" skip="\\\\\|\\\z1" fold
+syn region rubyString matchgroup=rubyStringDelimiter start="%[qw]{"                               end="}"   skip="\\\\\|\\}"   fold contains=rubyNestedCurlyBraces,rubyDelimEscape
+syn region rubyString matchgroup=rubyStringDelimiter start="%[qw]<"                               end=">"   skip="\\\\\|\\>"   fold contains=rubyNestedAngleBrackets,rubyDelimEscape
+syn region rubyString matchgroup=rubyStringDelimiter start="%[qw]\["                              end="\]"  skip="\\\\\|\\\]"  fold contains=rubyNestedSquareBrackets,rubyDelimEscape
+syn region rubyString matchgroup=rubyStringDelimiter start="%[qw]("                               end=")"   skip="\\\\\|\\)"   fold contains=rubyNestedParentheses,rubyDelimEscape
+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="%[QWx]\z([~`!@#$%^&*_\-+=|\:;"',.?/]\)" end="\z1" skip="\\\\\|\\\z1" contains=@rubyStringSpecial fold
-syn region rubyString matchgroup=rubyStringDelimiter start="%[QWx]\={"                             end="}"   skip="\\\\\|\\}"   contains=@rubyStringSpecial,rubyNestedCurlyBraces,rubyDelimEscape fold
-syn region rubyString matchgroup=rubyStringDelimiter start="%[QWx]\=<"                             end=">"   skip="\\\\\|\\>"   contains=@rubyStringSpecial,rubyNestedAngleBrackets,rubyDelimEscape fold
+syn region rubyString matchgroup=rubyStringDelimiter start="%[QWx]\={"                             end="}"   skip="\\\\\|\\}"   contains=@rubyStringSpecial,rubyNestedCurlyBraces,rubyDelimEscape    fold
+syn region rubyString matchgroup=rubyStringDelimiter start="%[QWx]\=<"                             end=">"   skip="\\\\\|\\>"   contains=@rubyStringSpecial,rubyNestedAngleBrackets,rubyDelimEscape  fold
 syn region rubyString matchgroup=rubyStringDelimiter start="%[QWx]\=\["                                    end="\]"  skip="\\\\\|\\\]"  contains=@rubyStringSpecial,rubyNestedSquareBrackets,rubyDelimEscape fold
-syn region rubyString matchgroup=rubyStringDelimiter start="%[QWx]\=("                             end=")"   skip="\\\\\|\\)"   contains=@rubyStringSpecial,rubyNestedParentheses,rubyDelimEscape fold
+syn region rubyString matchgroup=rubyStringDelimiter start="%[QWx]\=("                             end=")"   skip="\\\\\|\\)"   contains=@rubyStringSpecial,rubyNestedParentheses,rubyDelimEscape    fold
 
 " Here Document
-syn region rubyHeredocStart matchgroup=rubyStringDelimiter start=+\%(\%(class\s*\|\%([]})"'.]\|::\)\)\_s*\|\w\)\@<!<<-\=\zs\%(\h\w*\)+   end=+$+ oneline contains=ALLBUT,@rubyNotTop
+syn region rubyHeredocStart matchgroup=rubyStringDelimiter start=+\%(\%(class\s*\|\%([]})"'.]\|::\)\)\_s*\|\w\)\@<!<<-\=\zs\%(\h\w*\)+  end=+$+ oneline contains=ALLBUT,@rubyNotTop
 syn region rubyHeredocStart matchgroup=rubyStringDelimiter start=+\%(\%(class\s*\|\%([]})"'.]\|::\)\)\_s*\|\w\)\@<!<<-\=\zs"\%([^"]*\)"+ end=+$+ oneline contains=ALLBUT,@rubyNotTop
 syn region rubyHeredocStart matchgroup=rubyStringDelimiter start=+\%(\%(class\s*\|\%([]})"'.]\|::\)\)\_s*\|\w\)\@<!<<-\=\zs'\%([^']*\)'+ end=+$+ oneline contains=ALLBUT,@rubyNotTop
 syn region rubyHeredocStart matchgroup=rubyStringDelimiter start=+\%(\%(class\s*\|\%([]})"'.]\|::\)\)\_s*\|\w\)\@<!<<-\=\zs`\%([^`]*\)`+ end=+$+ oneline contains=ALLBUT,@rubyNotTop
 
-syn region rubyString start=+\%(\%(class\s*\|\%([]})"'.]\|::\)\)\_s*\|\w\)\@<!<<\z(\h\w*\)\ze+hs=s+2    matchgroup=rubyStringDelimiter end=+^\z1$+ contains=rubyHeredocStart,@rubyStringSpecial fold keepend
-syn region rubyString start=+\%(\%(class\s*\|\%([]})"'.]\|::\)\)\_s*\|\w\)\@<!<<"\z([^"]*\)"\ze+hs=s+2  matchgroup=rubyStringDelimiter end=+^\z1$+ contains=rubyHeredocStart,@rubyStringSpecial fold keepend
-syn region rubyString start=+\%(\%(class\s*\|\%([]})"'.]\|::\)\)\_s*\|\w\)\@<!<<'\z([^']*\)'\ze+hs=s+2  matchgroup=rubyStringDelimiter end=+^\z1$+ contains=rubyHeredocStart                 fold keepend
-syn region rubyString start=+\%(\%(class\s*\|\%([]})"'.]\|::\)\)\_s*\|\w\)\@<!<<`\z([^`]*\)`\ze+hs=s+2  matchgroup=rubyStringDelimiter end=+^\z1$+ contains=rubyHeredocStart,@rubyStringSpecial fold keepend
+syn region rubyString start=+\%(\%(class\s*\|\%([]})"'.]\|::\)\)\_s*\|\w\)\@<!<<\z(\h\w*\)\ze+hs=s+2   matchgroup=rubyStringDelimiter end=+^\z1$+ contains=rubyHeredocStart,@rubyStringSpecial fold keepend
+syn region rubyString start=+\%(\%(class\s*\|\%([]})"'.]\|::\)\)\_s*\|\w\)\@<!<<"\z([^"]*\)"\ze+hs=s+2 matchgroup=rubyStringDelimiter end=+^\z1$+ contains=rubyHeredocStart,@rubyStringSpecial fold keepend
+syn region rubyString start=+\%(\%(class\s*\|\%([]})"'.]\|::\)\)\_s*\|\w\)\@<!<<'\z([^']*\)'\ze+hs=s+2 matchgroup=rubyStringDelimiter end=+^\z1$+ contains=rubyHeredocStart                    fold keepend
+syn region rubyString start=+\%(\%(class\s*\|\%([]})"'.]\|::\)\)\_s*\|\w\)\@<!<<`\z([^`]*\)`\ze+hs=s+2 matchgroup=rubyStringDelimiter end=+^\z1$+ contains=rubyHeredocStart,@rubyStringSpecial fold keepend
 
 syn region rubyString start=+\%(\%(class\s*\|\%([]}).]\|::\)\)\_s*\|\w\)\@<!<<-\z(\h\w*\)\ze+hs=s+3    matchgroup=rubyStringDelimiter end=+^\s*\zs\z1$+ contains=rubyHeredocStart,@rubyStringSpecial fold keepend
 syn region rubyString start=+\%(\%(class\s*\|\%([]}).]\|::\)\)\_s*\|\w\)\@<!<<-"\z([^"]*\)"\ze+hs=s+3  matchgroup=rubyStringDelimiter end=+^\s*\zs\z1$+ contains=rubyHeredocStart,@rubyStringSpecial fold keepend
@@ -177,36 +180,47 @@ if exists('main_syntax') && main_syntax == 'eruby'
   let b:ruby_no_expensive = 1
 end
 
-syn match  rubyAliasDeclaration    "[^[:space:];#.()]\+"  contained contains=rubySymbol,rubyGlobalVariable,rubyPredefinedVariable nextgroup=rubyAliasDeclaration2 skipwhite
-syn match  rubyAliasDeclaration2   "[^[:space:];#.()]\+"  contained contains=rubySymbol,rubyGlobalVariable,rubyPredefinedVariable
-syn match  rubyMethodDeclaration   "[^[:space:];#(]\+"   contained contains=rubyConstant,rubyBoolean,rubyPseudoVariable,rubyInstanceVariable,rubyClassVariable,rubyGlobalVariable
-syn match  rubyClassDeclaration    "[^[:space:];#<]\+"   contained contains=rubyConstant,rubyOperator
-syn match  rubyModuleDeclaration   "[^[:space:];#<]\+"   contained contains=rubyConstant,rubyOperator
-syn match  rubyFunction "\<[_[:alpha:]][_[:alnum:]]*[?!=]\=[[:alnum:].:?!=]\@!" contained containedin=rubyMethodDeclaration
+syn match  rubyAliasDeclaration    "[^[:space:];#.()]\+" contained contains=rubySymbol,rubyGlobalVariable,rubyPredefinedVariable nextgroup=rubyAliasDeclaration2 skipwhite
+syn match  rubyAliasDeclaration2   "[^[:space:];#.()]\+" contained contains=rubySymbol,rubyGlobalVariable,rubyPredefinedVariable
+syn match  rubyMethodDeclaration   "[^[:space:];#(]\+"  contained contains=rubyConstant,rubyBoolean,rubyPseudoVariable,rubyInstanceVariable,rubyClassVariable,rubyGlobalVariable
+syn match  rubyClassDeclaration    "[^[:space:];#<]\+"  contained contains=rubyConstant,rubyOperator
+syn match  rubyModuleDeclaration   "[^[:space:];#<]\+"  contained contains=rubyConstant,rubyOperator
+syn match  rubyFunction "\<[_[:alpha:]][_[:alnum:]]*[?!=]\=[[:alnum:]_.:?!=]\@!" contained containedin=rubyMethodDeclaration
 syn match  rubyFunction "\%(\s\|^\)\@<=[_[:alpha:]][_[:alnum:]]*[?!=]\=\%(\s\|$\)\@=" contained containedin=rubyAliasDeclaration,rubyAliasDeclaration2
 syn match  rubyFunction "\%([[:space:].]\|^\)\@<=\%(\[\]=\=\|\*\*\|[+-]@\=\|[*/%|&^~]\|<<\|>>\|[<>]=\=\|<=>\|===\|==\|=\~\|`\)\%([[:space:];#(]\|$\)\@=" contained containedin=rubyAliasDeclaration,rubyAliasDeclaration2,rubyMethodDeclaration
 
-syn cluster rubyDeclaration    contains=rubyAliasDeclaration,rubyAliasDeclaration2,rubyMethodDeclaration,rubyModuleDeclaration,rubyClassDeclaration,rubyFunction,rubyBlockParameter
+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       "\<defined?" display
+syn match   rubyKeyword               "\<\%(super\|yield\)\>[?!]\@!"
+syn match   rubyBoolean               "\<\%(true\|false\)\>[?!]\@!"
+syn match   rubyPseudoVariable "\<\%(nil\|self\|__FILE__\|__LINE__\)\>[?!]\@!"
+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 "\<alias\>"            nextgroup=rubyAliasDeclaration  skipwhite skipnl
-  syn match  rubyDefine "\<def\>"              nextgroup=rubyMethodDeclaration skipwhite skipnl
-  syn match  rubyDefine "\<undef\>"            nextgroup=rubyFunction skipwhite skipnl
-  syn match  rubyClass "\<class\>"             nextgroup=rubyClassDeclaration  skipwhite skipnl
-  syn match  rubyModule "\<module\>"           nextgroup=rubyModuleDeclaration skipwhite skipnl
-  syn region rubyBlock start="\<def\>"         matchgroup=rubyDefine end="\%(\<def\_s\+\)\@<!\<end\>" contains=ALLBUT,@rubyNotTop fold
-  syn region rubyBlock start="\<class\>"       matchgroup=rubyClass  end="\<end\>" contains=ALLBUT,@rubyNotTop fold
-  syn region rubyBlock start="\<module\>"      matchgroup=rubyModule end="\<end\>" contains=ALLBUT,@rubyNotTop fold
+  syn match  rubyDefine "\<alias\>"  nextgroup=rubyAliasDeclaration  skipwhite skipnl
+  syn match  rubyDefine "\<def\>"    nextgroup=rubyMethodDeclaration skipwhite skipnl
+  syn match  rubyDefine "\<undef\>"  nextgroup=rubyFunction         skipwhite skipnl
+  syn match  rubyClass "\<class\>"  nextgroup=rubyClassDeclaration  skipwhite skipnl
+  syn match  rubyModule "\<module\>" nextgroup=rubyModuleDeclaration skipwhite skipnl
+
+  syn region rubyMethodBlock start="\<def\>"   matchgroup=rubyDefine end="\%(\<def\_s\+\)\@<!\<end\>" contains=ALLBUT,@rubyNotTop fold
+  syn region rubyBlock      start="\<class\>"  matchgroup=rubyClass  end="\<end\>"                    contains=ALLBUT,@rubyNotTop fold
+  syn region rubyBlock      start="\<module\>" matchgroup=rubyModule end="\<end\>"                    contains=ALLBUT,@rubyNotTop fold
 
   " modifiers
-  syn match  rubyConditionalModifier "\<\%(if\|unless\)\>"   display
-  syn match  rubyRepeatModifier             "\<\%(while\|until\)\>" display
+  syn match rubyConditionalModifier "\<\%(if\|unless\)\>"    display
+  syn match rubyRepeatModifier      "\<\%(while\|until\)\>" display
 
-  syn region rubyDoBlock matchgroup=rubyControl start="\<do\>" end="\<end\>" contains=ALLBUT,@rubyNotTop fold
+  syn region rubyDoBlock      matchgroup=rubyControl start="\<do\>" end="\<end\>"                 contains=ALLBUT,@rubyNotTop fold
   " curly bracket block or hash literal
-  syn region rubyCurlyBlock   start="{" end="}" contains=ALLBUT,@rubyNotTop fold
+  syn region rubyCurlyBlock   start="{" end="}"                                                          contains=ALLBUT,@rubyNotTop fold
   syn region rubyArrayLiteral matchgroup=rubyArrayDelimiter start="\%(\w\|[\]})]\)\@<!\[" end="]" contains=ALLBUT,@rubyNotTop fold
 
   " statements without 'do'
@@ -214,9 +228,12 @@ if !exists("b:ruby_no_expensive") && !exists("ruby_no_expensive")
   syn region rubyCaseExpression               matchgroup=rubyConditional start="\<case\>"  end="\<end\>" contains=ALLBUT,@rubyNotTop fold
   syn region rubyConditionalExpression matchgroup=rubyConditional start="\%(\%(^\|\.\.\.\=\|[{:,;([<>~\*/%&^|+=-]\|\%(\<[_[:lower:]][_[:alnum:]]*\)\@<![?!]\)\s*\)\@<=\%(if\|unless\)\>" end="\<end\>" contains=ALLBUT,@rubyNotTop fold
 
-  syn match rubyConditional "\<\%(then\|else\|when\)\>[?!]\@!"  contained containedin=rubyCaseExpression
+  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="\<for\>[?!]\@!" start="\%(\%(^\|\.\.\.\=\|[{:,;([<>~\*/%&^|+-]\|\%(\<[_[:lower:]][_[:alnum:]]*\)\@<![!=?]\)\s*\)\@<=\<\%(until\|while\)\>" matchgroup=rubyOptionalDo end="\%(\<do\>\)" end="\ze\%(;\|$\)" oneline contains=ALLBUT,@rubyNotTop
   syn region rubyRepeatExpression start="\<for\>[?!]\@!" start="\%(\%(^\|\.\.\.\=\|[{:,;([<>~\*/%&^|+-]\|\%(\<[_[:lower:]][_[:alnum:]]*\)\@<![!=?]\)\s*\)\@<=\<\%(until\|while\)\>" matchgroup=rubyRepeat end="\<end\>" contains=ALLBUT,@rubyNotTop nextgroup=rubyOptionalDoLine fold
@@ -227,23 +244,13 @@ if !exists("b:ruby_no_expensive") && !exists("ruby_no_expensive")
   exec "syn sync minlines=" . ruby_minlines
 
 else
-  syn match   rubyControl "\<def\>[?!]\@!"     nextgroup=rubyMethodDeclaration skipwhite skipnl
-  syn match   rubyControl "\<class\>[?!]\@!"   nextgroup=rubyClassDeclaration  skipwhite skipnl
-  syn match   rubyControl "\<module\>[?!]\@!"  nextgroup=rubyModuleDeclaration skipwhite skipnl
-  syn match   rubyControl "\<\%(case\|begin\|do\|for\|if\|unless\|while\|until\|else\|elsif\|then\|when\|end\)\>[?!]\@!"
-  syn match   rubyKeyword "\<\%(alias\|undef\)\>[?!]\@!"
+  syn match rubyControl "\<def\>[?!]\@!"    nextgroup=rubyMethodDeclaration skipwhite skipnl
+  syn match rubyControl "\<class\>[?!]\@!"  nextgroup=rubyClassDeclaration  skipwhite skipnl
+  syn match rubyControl "\<module\>[?!]\@!" 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
 
-" 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\|ensure\|in\|next\|not\|or\|redo\|rescue\|retry\|return\)\>[?!]\@!"
-syn match   rubyOperator       "\<defined?" display
-syn match   rubyKeyword                "\<\%(super\|yield\)\>[?!]\@!"
-syn match   rubyBoolean                "\<\%(true\|false\)\>[?!]\@!"
-syn match   rubyPseudoVariable "\<\%(nil\|self\|__FILE__\|__LINE__\)\>[?!]\@!"
-syn match   rubyBeginEnd       "\<\%(BEGIN\|END\)\>[?!]\@!"
-
 " Special Methods
 if !exists("ruby_no_special_methods")
   syn keyword rubyAccess    public protected private module_function
@@ -260,9 +267,9 @@ if !exists("ruby_no_special_methods")
 endif
 
 " Comments and Documentation
-syn match   rubySharpBang     "\%^#!.*" display
-syn keyword rubyTodo         FIXME NOTE TODO OPTIMIZE XXX contained
-syn match   rubyComment       "#.*" contains=rubySharpBang,rubySpaceError,rubyTodo,@Spell
+syn match   rubySharpBang "\%^#!.*" display
+syn keyword rubyTodo     FIXME NOTE TODO OPTIMIZE XXX contained
+syn match   rubyComment   "#.*" contains=rubySharpBang,rubySpaceError,rubyTodo,@Spell
 if !exists("ruby_no_comment_fold")
   syn region rubyMultilineComment start="\%(\%(^\s*#.*\n\)\@<!\%(^\s*#.*\n\)\)\%(\(^\s*#.*\n\)\{1,}\)\@=" end="\%(^\s*#.*\n\)\@<=\%(^\s*#.*\n\)\%(^\s*#\)\@!" contains=rubyComment transparent fold keepend
   syn region rubyDocumentation   start="^=begin\ze\%(\s.*\)\=$" end="^=end\s*$" contains=rubySpaceError,rubyTodo,@Spell fold
@@ -271,30 +278,32 @@ else
 endif
 
 " Note: this is a hack to prevent 'keywords' being highlighted as such when called as methods with an explicit receiver
-syn match rubyKeywordAsMethod "\%(\%(\.\@<!\.\)\|::\)\_s*\%(alias\|and\|begin\|break\|case\|class\|def\|defined\|do\|else\)\>"                 transparent contains=NONE
-syn match rubyKeywordAsMethod "\%(\%(\.\@<!\.\)\|::\)\_s*\%(elsif\|end\|ensure\|false\|for\|if\|in\|module\|next\|nil\)\>"                     transparent contains=NONE
-syn match rubyKeywordAsMethod "\%(\%(\.\@<!\.\)\|::\)\_s*\%(not\|or\|redo\|rescue\|retry\|return\|self\|super\|then\|true\)\>"                 transparent contains=NONE
-syn match rubyKeywordAsMethod "\%(\%(\.\@<!\.\)\|::\)\_s*\%(undef\|unless\|until\|when\|while\|yield\|BEGIN\|END\|__FILE__\|__LINE__\)\>"      transparent contains=NONE
+syn match rubyKeywordAsMethod "\%(\%(\.\@<!\.\)\|::\)\_s*\%(alias\|and\|begin\|break\|case\|class\|def\|defined\|do\|else\)\>"           transparent contains=NONE
+syn match rubyKeywordAsMethod "\%(\%(\.\@<!\.\)\|::\)\_s*\%(elsif\|end\|ensure\|false\|for\|if\|in\|module\|next\|nil\)\>"               transparent contains=NONE
+syn match rubyKeywordAsMethod "\%(\%(\.\@<!\.\)\|::\)\_s*\%(not\|or\|redo\|rescue\|retry\|return\|self\|super\|then\|true\)\>"           transparent contains=NONE
+syn match rubyKeywordAsMethod "\%(\%(\.\@<!\.\)\|::\)\_s*\%(undef\|unless\|until\|when\|while\|yield\|BEGIN\|END\|__FILE__\|__LINE__\)\>" transparent contains=NONE
 
-syn match rubyKeywordAsMethod "\<\%(alias\|begin\|case\|class\|def\|do\|end\)[?!]"             transparent contains=NONE
-syn match rubyKeywordAsMethod "\<\%(if\|module\|undef\|unless\|until\|while\)[?!]"             transparent contains=NONE
+syn match rubyKeywordAsMethod "\<\%(alias\|begin\|case\|class\|def\|do\|end\)[?!]" transparent contains=NONE
+syn match rubyKeywordAsMethod "\<\%(if\|module\|undef\|unless\|until\|while\)[?!]" transparent contains=NONE
 
-syn match rubyKeywordAsMethod "\%(\%(\.\@<!\.\)\|::\)\_s*\%(abort\|at_exit\|attr\|attr_accessor\|attr_reader\)\>"      transparent contains=NONE
-syn match rubyKeywordAsMethod "\%(\%(\.\@<!\.\)\|::\)\_s*\%(attr_writer\|autoload\|callcc\|catch\|caller\)\>"          transparent contains=NONE
-syn match rubyKeywordAsMethod "\%(\%(\.\@<!\.\)\|::\)\_s*\%(eval\|class_eval\|instance_eval\|module_eval\|exit\)\>"    transparent contains=NONE
-syn match rubyKeywordAsMethod "\%(\%(\.\@<!\.\)\|::\)\_s*\%(extend\|fail\|fork\|include\|lambda\)\>"                   transparent contains=NONE
-syn match rubyKeywordAsMethod "\%(\%(\.\@<!\.\)\|::\)\_s*\%(load\|loop\|private\|proc\|protected\)\>"                  transparent contains=NONE
-syn match rubyKeywordAsMethod "\%(\%(\.\@<!\.\)\|::\)\_s*\%(public\|require\|raise\|throw\|trap\)\>"                   transparent contains=NONE
+syn match rubyKeywordAsMethod "\%(\%(\.\@<!\.\)\|::\)\_s*\%(abort\|at_exit\|attr\|attr_accessor\|attr_reader\)\>"   transparent contains=NONE
+syn match rubyKeywordAsMethod "\%(\%(\.\@<!\.\)\|::\)\_s*\%(attr_writer\|autoload\|callcc\|catch\|caller\)\>"      transparent contains=NONE
+syn match rubyKeywordAsMethod "\%(\%(\.\@<!\.\)\|::\)\_s*\%(eval\|class_eval\|instance_eval\|module_eval\|exit\)\>" transparent contains=NONE
+syn match rubyKeywordAsMethod "\%(\%(\.\@<!\.\)\|::\)\_s*\%(extend\|fail\|fork\|include\|lambda\)\>"               transparent contains=NONE
+syn match rubyKeywordAsMethod "\%(\%(\.\@<!\.\)\|::\)\_s*\%(load\|loop\|private\|proc\|protected\)\>"              transparent contains=NONE
+syn match rubyKeywordAsMethod "\%(\%(\.\@<!\.\)\|::\)\_s*\%(public\|require\|raise\|throw\|trap\)\>"               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
@@ -334,6 +343,7 @@ 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