summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2019-12-09 23:11:18 +0100
committerBram Moolenaar <Bram@vim.org>2019-12-09 23:11:18 +0100
commit2ed639abdc4000436115f378e28320b7bee38a6e (patch)
tree224e20482d2b67d1a680f5487b0515a7714097fa
parent661ed8b4b6da405c95ede88b0e45ac27adba3f71 (diff)
Update a few runtime files.
-rw-r--r--runtime/autoload/rubycomplete.vim59
-rw-r--r--runtime/doc/pi_logipat.txt3
-rw-r--r--runtime/doc/pi_netrw.txt4
-rw-r--r--runtime/doc/todo.txt4
-rw-r--r--runtime/doc/version8.txt20
-rw-r--r--runtime/ftplugin/ruby.vim49
-rw-r--r--runtime/indent/ruby.vim33
-rw-r--r--runtime/syntax/ruby.vim745
8 files changed, 504 insertions, 413 deletions
diff --git a/runtime/autoload/rubycomplete.vim b/runtime/autoload/rubycomplete.vim
index ea18470232..e8a1879668 100644
--- a/runtime/autoload/rubycomplete.vim
+++ b/runtime/autoload/rubycomplete.vim
@@ -3,7 +3,7 @@
" Maintainer: Mark Guzman <segfault@hasno.info>
" URL: https://github.com/vim-ruby/vim-ruby
" Release Coordinator: Doug Kearns <dougkearns@gmail.com>
-" Last Change: 2019 Jan 06
+" Last Change: 2019 Feb 25
" ----------------------------------------------------------------------------
"
" Ruby IRB/Complete author: Keiju ISHITSUKA(keiju@ishitsuka.com)
@@ -53,6 +53,23 @@ if !exists("g:rubycomplete_include_objectspace")
endif
" }}} configuration failsafe initialization
+" {{{ regex patterns
+
+" Regex that defines the start-match for the 'end' keyword.
+let s:end_start_regex =
+ \ '\C\%(^\s*\|[=,*/%+\-|;{]\|<<\|>>\|:\s\)\s*\zs' .
+ \ '\<\%(module\|class\|if\|for\|while\|until\|case\|unless\|begin' .
+ \ '\|\%(\K\k*[!?]\?\s\+\)\=def\):\@!\>' .
+ \ '\|\%(^\|[^.:@$]\)\@<=\<do:\@!\>'
+
+" Regex that defines the middle-match for the 'end' keyword.
+let s:end_middle_regex = '\<\%(ensure\|else\|\%(\%(^\|;\)\s*\)\@<=\<rescue:\@!\>\|when\|elsif\):\@!\>'
+
+" Regex that defines the end-match for the 'end' keyword.
+let s:end_end_regex = '\%(^\|[^.:@$]\)\@<=\<end:\@!\>'
+
+" }}} regex patterns
+
" {{{ vim-side support functions
let s:rubycomplete_debug = 0
@@ -103,7 +120,7 @@ function! s:GetBufferRubyEntity( name, type, ... )
endif
let curpos = getpos(".")
- let [enum,ecol] = searchpairpos( crex, '', '\(end\|}\)', 'W' )
+ let [enum,ecol] = searchpairpos( s:end_start_regex, s:end_middle_regex, s:end_end_regex, 'W' )
call cursor(lastpos[1], lastpos[2])
if lnum > enum
@@ -128,19 +145,28 @@ function! s:IsPosInClassDef(pos)
return ret
endfunction
+function! s:IsInComment(pos)
+ let stack = synstack(a:pos[0], a:pos[1])
+ if !empty(stack)
+ return synIDattr(stack[0], 'name') =~ 'ruby\%(.*Comment\|Documentation\)'
+ else
+ return 0
+ endif
+endfunction
+
function! s:GetRubyVarType(v)
let stopline = 1
let vtp = ''
- let pos = getpos('.')
+ let curpos = getpos('.')
let sstr = '^\s*#\s*@var\s*'.escape(a:v, '*').'\>\s\+[^ \t]\+\s*$'
let [lnum,lcol] = searchpos(sstr,'nb',stopline)
if lnum != 0 && lcol != 0
- call setpos('.',pos)
+ call setpos('.',curpos)
let str = getline(lnum)
let vtp = substitute(str,sstr,'\1','')
return vtp
endif
- call setpos('.',pos)
+ call setpos('.',curpos)
let ctors = '\(now\|new\|open\|get_instance'
if exists('g:rubycomplete_rails') && g:rubycomplete_rails == 1 && s:rubycomplete_rails_loaded == 1
let ctors = ctors.'\|find\|create'
@@ -150,9 +176,13 @@ function! s:GetRubyVarType(v)
let fstr = '=\s*\([^ \t]\+.' . ctors .'\>\|[\[{"''/]\|%[xwQqr][(\[{@]\|[A-Za-z0-9@:\-()\.]\+...\?\|lambda\|&\)'
let sstr = ''.escape(a:v, '*').'\>\s*[+\-*/]*'.fstr
- let [lnum,lcol] = searchpos(sstr,'nb',stopline)
- if lnum != 0 && lcol != 0
- let str = matchstr(getline(lnum),fstr,lcol)
+ let pos = searchpos(sstr,'bW')
+ while pos != [0,0] && s:IsInComment(pos)
+ let pos = searchpos(sstr,'bW')
+ endwhile
+ if pos != [0,0]
+ let [lnum, col] = pos
+ let str = matchstr(getline(lnum),fstr,col)
let str = substitute(str,'^=\s*','','')
call setpos('.',pos)
@@ -174,7 +204,7 @@ function! s:GetRubyVarType(v)
end
return ''
endif
- call setpos('.',pos)
+ call setpos('.',curpos)
return ''
endfunction
@@ -671,11 +701,10 @@ class VimRubyCompletion
methods.delete_if { |c| c.match( /'/ ) }
end
- when /^::([A-Z][^:\.\(]*)$/ # Absolute Constant or class methods
+ when /^::([A-Z][^:\.\(]*)?$/ # Absolute Constant or class methods
dprint "const or cls"
receiver = $1
- methods = Object.constants
- methods.grep(/^#{receiver}/).collect{|e| "::" + e}
+ methods = Object.constants.collect{ |c| c.to_s }.grep(/^#{receiver}/)
when /^(((::)?[A-Z][^:.\(]*)+?)::?([^:.]*)$/ # Constant or class methods
receiver = $1
@@ -684,13 +713,13 @@ class VimRubyCompletion
load_buffer_class( receiver )
load_buffer_module( receiver )
begin
- classes = eval("#{receiver}.constants")
- #methods = eval("#{receiver}.methods")
+ constants = eval("#{receiver}.constants").collect{ |c| c.to_s }.grep(/^#{message}/)
+ methods = eval("#{receiver}.methods").collect{ |m| m.to_s }.grep(/^#{message}/)
rescue Exception
dprint "exception: %s" % $!
+ constants = []
methods = []
end
- methods.grep(/^#{message}/).collect{|e| receiver + "::" + e}
when /^(:[^:.]+)\.([^.]*)$/ # Symbol
dprint "symbol"
diff --git a/runtime/doc/pi_logipat.txt b/runtime/doc/pi_logipat.txt
index 8d33a565ac..23db48700e 100644
--- a/runtime/doc/pi_logipat.txt
+++ b/runtime/doc/pi_logipat.txt
@@ -41,7 +41,6 @@ Copyright: (c) 2004-2015 by Charles E. Campbell *logiPat-copyright*
is performed and echoed onto the display.
:LogiPatFlags {search flags} *LogiPat-flags*
- :LogiPatFlags {search flags}
LogiPat uses the |search()| command. The flags
passed to that call to search() may be specified
by the :LogiPatFlags command.
@@ -105,7 +104,7 @@ Copyright: (c) 2004-2015 by Charles E. Campbell *logiPat-copyright*
==============================================================================
-3. LogiPat History *logiPat-history*
+5. LogiPat History *logiPat-history*
v4 Jun 22, 2015 * LogiPat has been picked up by Bram M for standard
plugin distribution; hence the name change
diff --git a/runtime/doc/pi_netrw.txt b/runtime/doc/pi_netrw.txt
index 94dbfa5503..c271c5f0f6 100644
--- a/runtime/doc/pi_netrw.txt
+++ b/runtime/doc/pi_netrw.txt
@@ -1,4 +1,4 @@
-*pi_netrw.txt* For Vim version 8.1. Last change: 2019 Nov 30
+*pi_netrw.txt* For Vim version 8.1. Last change: 2019 Dec 09
------------------------------------------------
NETRW REFERENCE MANUAL by Charles E. Campbell
@@ -1184,7 +1184,7 @@ One may easily "bookmark" the currently browsed directory by using >
*.netrwbook*
Bookmarks are retained in between sessions of vim in a file called .netrwbook
as a |List|, which is typically stored in the first directory on the user's
-|'runtimepath'|; entries are kept in sorted order.
+runtimepath'; entries are kept in sorted order.
If there are marked files and/or directories, mb will add them to the bookmark
list.
diff --git a/runtime/doc/todo.txt b/runtime/doc/todo.txt
index f709155ccd..cf2cc80b08 100644
--- a/runtime/doc/todo.txt
+++ b/runtime/doc/todo.txt
@@ -1,4 +1,4 @@
-*todo.txt* For Vim version 8.1. Last change: 2019 Dec 07
+*todo.txt* For Vim version 8.1. Last change: 2019 Dec 08
VIM REFERENCE MANUAL by Bram Moolenaar
@@ -118,6 +118,8 @@ E290, E292, E362, E366, E450, E451, E452,
E453, E454, E460, E489, E491, E565, E578, E610, E611, E653,
E654, E856, E857, E860, E861, E863, E889, E900
+Patch to move duplicated code to a function. (Yegappan Lakshmanan, #5330)
+
Running test_gui and test_gui_init with Motif sometimes kills the window
manager. Problem with Motif? Now test_gui crashes in submenu_change().
Athena is OK.
diff --git a/runtime/doc/version8.txt b/runtime/doc/version8.txt
index 7aeada537c..c13fa10d08 100644
--- a/runtime/doc/version8.txt
+++ b/runtime/doc/version8.txt
@@ -1,4 +1,4 @@
-*version8.txt* For Vim version 8.1. Last change: 2019 Dec 08
+*version8.txt* For Vim version 8.1. Last change: 2019 Dec 09
VIM REFERENCE MANUAL by Bram Moolenaar
@@ -25831,14 +25831,14 @@ window. This also works for normal windows.
Text properties *new-text-properties*
---------------
-Text properties give a plugin author flexibility what to highlight. This can
-be used with an external asynchronous parser to do syntax highlighting. Or
-to highlight text in a popup window. The text properties stick with the text
-when characters are deleted or inserted, which makes them also useful as text
-markers. See |text-properties|.
+Text properties give a plugin author flexibility about what to highlight.
+This can be used with an external asynchronous parser to do syntax
+highlighting. Or to highlight text in a popup window. The text properties
+stick with the text when characters are deleted or inserted, which makes them
+also useful as text markers. See |text-properties|.
The listener functions have been added to report text changes to a server so
-that it can dynamically update highligting, mark syntax errors and the like.
+that it can dynamically update highlighting, mark syntax errors and the like.
See |listener_add()|.
@@ -39746,7 +39746,7 @@ Files: src/testdir/test_exit.vim, src/ex_docmd.c
Patch 8.1.2198
Problem: Crash when using :center in autocommand.
-Solution: Bail out early for an empty line. (Dominique pelle, closes #5095)
+Solution: Bail out early for an empty line. (Dominique Pelle, closes #5095)
Files: src/ex_cmds.c, src/testdir/test_textformat.vim
Patch 8.1.2199
@@ -40610,7 +40610,7 @@ Solution: Make sure long line does not overflow IObuff. (Dominique Pelle,
Files: src/quickfix.c, src/testdir/test_quickfix.vim
Patch 8.1.2341
-Problem: Not so easy to interrupt a script programatically.
+Problem: Not so easy to interrupt a script programmatically.
Solution: Add the interrupt() function. (Yasuhiro Matsumoto, closes #2834)
Files: runtime/doc/eval.txt, src/evalfunc.c, src/ex_eval.c,
src/testdir/Make_all.mak, src/testdir/test_interrupt.vim
@@ -41039,7 +41039,7 @@ Solution: Free the old title. Don't copy expr_line.
Files: src/term.c, src/os_unix.c, src/register.c
Patch 8.1.2407
-Problem: proto file and dependenciess outdated.
+Problem: proto file and dependencies outdated.
Solution: Update proto files and dependencies.
Files: src/Makefile, src/proto/bufwrite.pro, src/proto/cmdhist.pro,
src/proto/optionstr.pro, src/proto/popupwin.pro,
diff --git a/runtime/ftplugin/ruby.vim b/runtime/ftplugin/ruby.vim
index 054c35e5fa..b4a8eaa0d8 100644
--- a/runtime/ftplugin/ruby.vim
+++ b/runtime/ftplugin/ruby.vim
@@ -3,7 +3,7 @@
" Maintainer: Tim Pope <vimNOSPAM@tpope.org>
" URL: https://github.com/vim-ruby/vim-ruby
" Release Coordinator: Doug Kearns <dougkearns@gmail.com>
-" Last Change: 2019 Jan 06
+" Last Change: 2019 Nov 06
if (exists("b:did_ftplugin"))
finish
@@ -24,20 +24,20 @@ 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\)\>=\@!' .
+ \ '{\|\<\%(if\|unless\|case\|while\|until\|for\|do\|class\|module\|def\|=\@<!begin\)\>=\@!' .
\ ':' .
\ '\<\%(else\|elsif\|ensure\|when\|rescue\|break\|redo\|next\|retry\)\>' .
\ ':' .
- \ '\%(^\|[^.\:@$]\)\@<=\<end\:\@!\>' .
- \ ',{:},\[:\],(:)'
+ \ '}\|\%(^\|[^.\:@$=]\)\@<=\<end\:\@!\>' .
+ \ ',^=begin\>:^=end\>,' .
+ \ ',\[:\],(:)'
let b:match_skip =
\ "synIDattr(synID(line('.'),col('.'),0),'name') =~ '" .
- \ "\\<ruby\\%(String\\|StringDelimiter\\|ASCIICode\\|Escape\\|" .
- \ "Regexp\\|RegexpDelimiter\\|" .
- \ "Interpolation\\|NoInterpolation\\|Comment\\|Documentation\\|" .
- \ "ConditionalModifier\\|RepeatModifier\\|OptionalDo\\|" .
- \ "Function\\|BlockArgument\\|KeywordAsMethod\\|ClassVariable\\|" .
+ \ "\\<ruby\\%(String\\|.\+Delimiter\\|Character\\|.\+Escape\\|" .
+ \ "Regexp\\|Interpolation\\|Comment\\|Documentation\\|" .
+ \ "ConditionalModifier\\|RepeatModifier\\|RescueModifier\\|OptionalDo\\|" .
+ \ "MethodName\\|BlockArgument\\|KeywordAsMethod\\|ClassVariable\\|" .
\ "InstanceVariable\\|GlobalVariable\\|Symbol\\)\\>'"
endif
@@ -87,7 +87,7 @@ endfunction
function! s:build_path(path) abort
let path = join(map(copy(a:path), 'v:val ==# "." ? "" : v:val'), ',')
- if &g:path !~# '\v^\.%(,/%(usr|emx)/include)=,,$'
+ if &g:path !~# '\v^%(\.,)=%(/%(usr|emx)/include,)=,$'
let path = substitute(&g:path,',,$',',','') . ',' . path
endif
return path
@@ -152,7 +152,7 @@ endif
function! s:map(mode, flags, map) abort
let from = matchstr(a:map, '\S\+')
if empty(mapcheck(from, a:mode))
- exe a:mode.'map' '<buffer>' a:map
+ exe a:mode.'map' '<buffer>' a:flags a:map
let b:undo_ftplugin .= '|sil! '.a:mode.'unmap <buffer> '.from
endif
endfunction
@@ -311,13 +311,16 @@ function! s:synid() abort
endfunction
function! s:wrap_i(back,forward) abort
- execute 'norm k'.a:forward
+ execute 'norm! k'
+ execute 'norm '.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'
+ execute 'norm! jV'
+ execute 'norm '.a:forward
+ execute 'norm! k'
endfunction
function! s:wrap_a(back,forward) abort
@@ -330,11 +333,15 @@ function! s:wrap_a(back,forward) abort
-
endwhile
if exists('after')
- execute 'norm V'.a:forward.'j'
+ execute 'norm! V'
+ execute 'norm '.a:forward
+ execute 'norm! j'
elseif line('.') > 1 && getline(line('.')-1) =~# '^\s*$'
- execute 'norm kV'.a:forward
+ execute 'norm! kV'
+ execute 'norm '.a:forward
else
- execute 'norm V'.a:forward
+ execute 'norm! V'
+ execute 'norm '.a:forward
endif
endfunction
@@ -366,7 +373,6 @@ function! RubyCursorFile() abort
endtry
let pre = matchstr(strpart(getline('.'), 0, col('.')-1), '.*\f\@<!')
let post = matchstr(strpart(getline('.'), col('.')), '\f\@!.*')
- let ext = getline('.') =~# '^\s*\%(require\%(_relative\)\=\|autoload\)\>' && cfile !~# '\.rb$' ? '.rb' : ''
if s:synid() ==# hlID('rubyConstant')
let cfile = substitute(cfile,'\.\w\+[?!=]\=$','','')
let cfile = substitute(cfile,'^::','','')
@@ -375,12 +381,15 @@ function! RubyCursorFile() abort
let cfile = substitute(cfile,'\(\l\|\d\)\(\u\)','\1_\2', 'g')
return tolower(cfile) . '.rb'
elseif getline('.') =~# '^\s*require_relative\s*\(["'']\).*\1\s*$'
- let cfile = expand('%:p:h') . '/' . matchstr(getline('.'),'\(["'']\)\zs.\{-\}\ze\1') . ext
+ let cfile = expand('%:p:h') . '/' . matchstr(getline('.'),'\(["'']\)\zs.\{-\}\ze\1')
+ let cfile .= cfile !~# '\.rb$' ? '.rb' : ''
elseif getline('.') =~# '^\s*\%(require[( ]\|load[( ]\|autoload[( ]:\w\+,\)\s*\%(::\)\=File\.expand_path(\(["'']\)\.\./.*\1,\s*__FILE__)\s*$'
let target = matchstr(getline('.'),'\(["'']\)\.\.\zs/.\{-\}\ze\1')
- let cfile = expand('%:p:h') . target . ext
+ let cfile = expand('%:p:h') . target
+ let cfile .= cfile !~# '\.rb$' ? '.rb' : ''
elseif getline('.') =~# '^\s*\%(require \|load \|autoload :\w\+,\)\s*\(["'']\).*\1\s*$'
- let cfile = matchstr(getline('.'),'\(["'']\)\zs.\{-\}\ze\1') . ext
+ let cfile = matchstr(getline('.'),'\(["'']\)\zs.\{-\}\ze\1')
+ let cfile .= cfile !~# '\.rb$' ? '.rb' : ''
elseif pre.post =~# '\<File.expand_path[( ].*[''"]\{2\}, *__FILE__\>' && cfile =~# '^\.\.'
let cfile = expand('%:p:h') . strpart(cfile, 2)
else
diff --git a/runtime/indent/ruby.vim b/runtime/indent/ruby.vim
index 5c420d7543..23b61fdfe0 100644
--- a/runtime/indent/ruby.vim
+++ b/runtime/indent/ruby.vim
@@ -4,7 +4,7 @@
" Previous Maintainer: Nikolai Weibull <now at bitwi.se>
" URL: https://github.com/vim-ruby/vim-ruby
" Release Coordinator: Doug Kearns <dougkearns@gmail.com>
-" Last Change: 2019 Jan 06
+" Last Change: 2019 Dec 08
" 0. Initialization {{{1
" =================
@@ -51,15 +51,27 @@ set cpo&vim
" Syntax group names that are strings.
let s:syng_string =
- \ ['String', 'Interpolation', 'InterpolationDelimiter', 'NoInterpolation', 'StringEscape']
+ \ ['String', 'Interpolation', 'InterpolationDelimiter', 'StringEscape']
" Syntax group names that are strings or documentation.
let s:syng_stringdoc = s:syng_string + ['Documentation']
" Syntax group names that are or delimit strings/symbols/regexes or are comments.
-let s:syng_strcom = s:syng_stringdoc +
- \ ['Regexp', 'RegexpDelimiter', 'RegexpEscape',
- \ 'Symbol', 'StringDelimiter', 'ASCIICode', 'Comment']
+let s:syng_strcom = s:syng_stringdoc + [
+ \ 'Character',
+ \ 'Comment',
+ \ 'HeredocDelimiter',
+ \ 'PercentRegexpDelimiter',
+ \ 'PercentStringDelimiter',
+ \ 'PercentSymbolDelimiter',
+ \ 'Regexp',
+ \ 'RegexpCharClass',
+ \ 'RegexpDelimiter',
+ \ 'RegexpEscape',
+ \ 'StringDelimiter',
+ \ 'Symbol',
+ \ 'SymbolDelimiter',
+ \ ]
" Expression used to check whether we should skip a match with searchpair().
let s:skip_expr =
@@ -69,7 +81,7 @@ let s:skip_expr =
let s:ruby_indent_keywords =
\ '^\s*\zs\<\%(module\|class\|if\|for' .
\ '\|while\|until\|else\|elsif\|case\|when\|unless\|begin\|ensure\|rescue' .
- \ '\|\%(\K\k*[!?]\?\)\=\s*def\):\@!\>' .
+ \ '\|\%(\K\k*[!?]\?\s\+\)\=def\):\@!\>' .
\ '\|\%([=,*/%+-]\|<<\|>>\|:\s\)\s*\zs' .
\ '\<\%(if\|for\|while\|until\|case\|unless\|begin\):\@!\>'
@@ -83,7 +95,7 @@ let s:ruby_deindent_keywords =
let s:end_start_regex =
\ '\C\%(^\s*\|[=,*/%+\-|;{]\|<<\|>>\|:\s\)\s*\zs' .
\ '\<\%(module\|class\|if\|for\|while\|until\|case\|unless\|begin' .
- \ '\|\%(\K\k*[!?]\?\)\=\s*def\):\@!\>' .
+ \ '\|\%(\K\k*[!?]\?\s\+\)\=def\):\@!\>' .
\ '\|\%(^\|[^.:@$]\)\@<=\<do:\@!\>'
" Regex that defines the middle-match for the 'end' keyword.
@@ -146,7 +158,7 @@ let s:block_regex =
let s:block_continuation_regex = '^\s*[^])}\t ].*'.s:block_regex
" Regex that describes a leading operator (only a method call's dot for now)
-let s:leading_operator_regex = '^\s*[.]'
+let s:leading_operator_regex = '^\s*\%(&\=\.\)'
" 2. GetRubyIndent Function {{{1
" =========================
@@ -695,7 +707,10 @@ endfunction
" Check if the character at lnum:col is inside a string delimiter
function! s:IsInStringDelimiter(lnum, col) abort
- return s:IsInRubyGroup(['StringDelimiter'], a:lnum, a:col)
+ return s:IsInRubyGroup(
+ \ ['HeredocDelimiter', 'PercentStringDelimiter', 'StringDelimiter'],
+ \ a:lnum, a:col
+ \ )
endfunction
function! s:IsAssignment(str, pos) abort
diff --git a/runtime/syntax/ruby.vim b/runtime/syntax/ruby.vim
index 8b88378e60..0de63d0ef3 100644
--- a/runtime/syntax/ruby.vim
+++ b/runtime/syntax/ruby.vim
@@ -3,7 +3,7 @@
" Maintainer: Doug Kearns <dougkearns@gmail.com>
" URL: https://github.com/vim-ruby/vim-ruby
" Release Coordinator: Doug Kearns <dougkearns@gmail.com>
-" Last Change: 2018 Jul 09
+" Last Change: 2019 Jul 13
" ----------------------------------------------------------------------------
"
" Previous Maintainer: Mirko Nasato
@@ -19,6 +19,11 @@ endif
let s:cpo_sav = &cpo
set cpo&vim
+" eRuby Config {{{1
+if exists('main_syntax') && main_syntax == 'eruby'
+ let b:ruby_no_expensive = 1
+endif
+
" Folding Config {{{1
if has("folding") && exists("ruby_fold")
setlocal foldmethod=syntax
@@ -33,6 +38,10 @@ let s:foldable_groups = split(
\ )
function! s:foldable(...) abort
+ if index(s:foldable_groups, 'NONE') > -1
+ return 0
+ endif
+
if index(s:foldable_groups, 'ALL') > -1
return 1
endif
@@ -44,9 +53,20 @@ function! s:foldable(...) abort
endfor
return 0
-endfunction " }}}
+endfunction
+
+function! s:run_syntax_fold(args) abort
+ let [_0, _1, groups, cmd; _] = matchlist(a:args, '\(["'']\)\(.\{-}\)\1\s\+\(.*\)')
+ if call('s:foldable', split(groups))
+ let cmd .= ' fold'
+ endif
+ exe cmd
+endfunction
+
+com! -nargs=* SynFold call s:run_syntax_fold(<q-args>)
-syn cluster rubyNotTop contains=@rubyExtendedStringSpecial,@rubyRegexpSpecial,@rubyDeclaration,rubyConditional,rubyExceptional,rubyMethodExceptional,rubyTodo,rubyModuleName,rubyClassName,rubySymbolDelimiter
+" Not-Top Cluster {{{1
+syn cluster rubyNotTop contains=@rubyCommentNotTop,@rubyStringNotTop,@rubyRegexpSpecial,@rubyDeclaration,@rubyExceptionHandler,@rubyClassOperator,rubyConditional,rubyModuleName,rubyClassName,rubySymbolDelimiter,rubyParentheses
" Whitespace Errors {{{1
if exists("ruby_space_errors")
@@ -59,427 +79,400 @@ if exists("ruby_space_errors")
endif
" Operators {{{1
-if exists("ruby_operators")
- syn match rubyOperator "[~!^|*/%+-]\|&\.\@!\|\%(class\s*\)\@<!<<\|<=>\|<=\|\%(<\|\<class\s\+\u\w*\s*\)\@<!<[^<]\@=\|===\|==\|=\~\|>>\|>=\|=\@1<!>\|\*\*\|\.\.\.\|\.\.\|::"
- syn match rubyOperator "->\|-=\|/=\|\*\*=\|\*=\|&&=\|&=\|&&\|||=\||=\|||\|%=\|+=\|!\~\|!="
- syn region rubyBracketOperator matchgroup=rubyOperator start="\%(\w[?!]\=\|[]})]\)\@2<=\[\s*" end="\s*]" contains=ALLBUT,@rubyNotTop
-endif
-" Expression Substitution and Backslash Notation {{{1
-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 match rubyEnglishBooleanOperator "\<\%(and\|or\|not\)\>"
+
+if exists("ruby_operators") || exists("ruby_pseudo_operators")
+ syn match rubyDotOperator "\.\|&\."
+
+ syn match rubyTernaryOperator "\%(\w\|[^\x00-\x7F]\)\@1<!?\|:"
+ syn match rubyArithmeticOperator "\*\*\|[*/%+]\|->\@!"
+ syn match rubyComparisonOperator "<=>\|<=\|<\|>=\|[-=]\@1<!>"
+ syn match rubyBitwiseOperator "[~^|]\|&\.\@!\|<<\|>>"
+ syn match rubyBooleanOperator "\%(\w\|[^\x00-\x7F]\)\@1<!!\|&&\|||"
+ syn match rubyRangeOperator "\.\.\.\="
+ syn match rubyAssignmentOperator "=>\@!\|-=\|/=\|\*\*=\|\*=\|&&=\|&=\|||=\||=\|%=\|+=\|>>=\|<<=\|\^="
+ syn match rubyAssignmentOperator "=>\@!" containedin=rubyBlockParameterList " TODO: this is inelegant
+ syn match rubyEqualityOperator "===\|==\|!=\|!\~\|=\~"
+
+ syn region rubyBracketOperator matchgroup=rubyOperator start="\%(\%(\w\|[^\x00-\x7F]\)[?!]\=\|[]})]\)\@2<=\[" end="]" contains=ALLBUT,@rubyNotTop
+
+ syn match rubyScopeOperator "::"
+ syn match rubySuperClassOperator "<" contained
+ syn match rubyEigenClassOperator "<<" contained
+ syn match rubyLambdaOperator "->"
+ syn match rubySplatOperator "\%([[{(|,=]\_s*\)\@<=\*"
+ syn match rubySplatOperator "\%(^\|\s\)\@1<=\*\%(\h\|[^\x00-\x7F]\|[:$@[]\)\@="
+ syn match rubyDoubleSplatOperator "\%([{(|,]\_s*\)\@<=\*\*"
+ syn match rubyDoubleSplatOperator "\s\@1<=\*\*\%(\h\|[^\x00-\x7F]\|[:$@{]\)\@="
+ syn match rubyProcOperator "\%([[(|,]\_s*\)\@<=&"
+ syn match rubyProcOperator "\s\@1<=&\%(\h\|[^\x00-\x7F]\|[:$@]\|->\)\@="
+
+ syn cluster rubyProperOperator contains=rubyTernaryOperator,rubyArithmeticOperator,rubyComparisonOperator,rubyBitwiseOperator,rubyBooleanOperator,rubyRangeOperator,rubyAssignmentOperator,rubyEqualityOperator,rubyDefinedOperator,rubyEnglishBooleanOperator
+ syn cluster rubyClassOperator contains=rubyEigenClassOperator,rubySuperClassOperator
+ syn cluster rubyPseudoOperator contains=rubyDotOperator,rubyScopeOperator,rubyEigenClassOperator,rubySuperClassOperator,rubyLambdaOperator,rubySplatOperator,rubyDoubleSplatOperator,rubyProcOperator
+ syn cluster rubyOperator contains=ruby.*Operator
+endif
+" String Interpolation and Backslash Notation {{{1
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 rubyInterpolation "#\$\%(-\w\|[!$&"'*+,./0:;<>?@\`~_]\|\w\+\)" display contained contains=rubyInterpolationDelimiter,@rubyGlobalVariable
+syn match rubyInterpolation "#@@\=\w\+" display contained contains=rubyInterpolationDelimiter,rubyInstanceVariable,rubyClassVariable
+syn match rubyInterpolationDelimiter "#\ze[$@]" display contained
+
+syn match rubyStringEscape "\\\_." contained display
+syn match rubyStringEscape "\\\o\{1,3}\|\\x\x\{1,2}" contained display
+syn match rubyStringEscape "\\u\%(\x\{4}\|{\x\{1,6}\%(\s\+\x\{1,6}\)*}\)" contained display
+syn match rubyStringEscape "\%(\\M-\\C-\|\\C-\\M-\|\\M-\\c\|\\c\\M-\|\\c\|\\C-\|\\M-\)\%(\\\o\{1,3}\|\\x\x\{1,2}\|\\\=.\)" contained display
+
+syn match rubyBackslashEscape "\\\\" contained display
+syn match rubyQuoteEscape "\\'" contained display
+syn match rubySpaceEscape "\\ " contained display
-syn match rubyDelimiterEscape "\\[(<{\[)>}\]]" transparent display contained contains=NONE
+syn match rubyParenthesisEscape "\\[()]" contained display
+syn match rubyCurlyBraceEscape "\\[{}]" contained display
+syn match rubyAngleBracketEscape "\\[<>]" contained display
+syn match rubySquareBracketEscape "\\[[\]]" contained display
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 cluster rubySingleCharEscape contains=rubyBackslashEscape,rubyQuoteEscape,rubySpaceEscape,rubyParenthesisEscape,rubyCurlyBraceEscape,rubyAngleBracketEscape,rubySquareBracketEscape
+syn cluster rubyNestedBrackets contains=rubyNested.\+
+syn cluster rubyStringSpecial contains=rubyInterpolation,rubyStringEscape
+syn cluster rubyStringNotTop contains=@rubyStringSpecial,@rubyNestedBrackets,@rubySingleCharEscape
+
" Regular Expression Metacharacters {{{1
-" 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 {{{1
-syn match rubyASCIICode "\%(\w\|[]})\"'/]\)\@1<!\%(?\%(\\M-\\C-\|\\C-\\M-\|\\M-\\c\|\\c\\M-\|\\c\|\\C-\|\\M-\)\=\%(\\\o\{1,3}\|\\x\x\{1,2}\|\\\=\S\)\)"
-syn match rubyInteger "\%(\%(\w\|[]})\"']\s*\)\@<!-\)\=\<0[xX]\x\+\%(_\x\+\)*r\=i\=\>" display
-syn match rubyInteger "\%(\%(\w\|[]})\"']\s*\)\@<!-\)\=\<\%(0[dD]\)\=\%(0\|[1-9]\d*\%(_\d\+\)*\)r\=i\=\>" display
-syn match rubyInteger "\%(\%(\w\|[]})\"']\s*\)\@<!-\)\=\<0[oO]\=\o\+\%(_\o\+\)*r\=i\=\>" display
-syn match rubyInteger "\%(\%(\w\|[]})\"']\s*\)\@<!-\)\=\<0[bB][01]\+\%(_[01]\+\)*r\=i\=\>" display
-syn match rubyFloat "\%(\%(\w\|[]})\"']\s*\)\@<!-\)\=\<\%(0\|[1-9]\d*\%(_\d\+\)*\)\.\d\+\%(_\d\+\)*r\=i\=\>" display
-syn match rubyFloat "\%(\%(\w\|[]})\"']\s*\)\@<!-\)\=\<\%(0\|[1-9]\d*\%(_\d\+\)*\)\%(\.\d\+\%(_\d\+\)*\)\=\%([eE][-+]\=\d\+\%(_\d\+\)*\)r\=i\=\>" 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=rubyRegexpBrackets,rubyStringEscape,rubyRegexpEscape,rubyRegexpCharClass,rubyRegexpIntersection oneline
+syn match rubyRegexpCharClass "\\[DdHhRSsWw]" contained display
+syn match rubyRegexpCharClass "\[:\^\=\%(alnum\|alpha\|ascii\|blank\|cntrl\|digit\|graph\|lower\|print\|punct\|space\|upper\|word\|xdigit\):\]" contained
+syn match rubyRegexpCharClass "\\[pP]{^\=.\{-}}" contained display
+syn match rubyRegexpEscape "\\[].*?+^$|\\/(){}[]" contained " see commit e477f10
+syn match rubyRegexpQuantifier "[*?+][?+]\=" contained display
+syn match rubyRegexpQuantifier "{\d\+\%(,\d*\)\=}?\=" contained display
+syn match rubyRegexpAnchor "[$^]\|\\[ABbGZz]" contained display
+syn match rubyRegexpDot "\.\|\\X" contained display
+syn match rubyRegexpIntersection "&&" contained display
+syn match rubyRegexpSpecial "\\K" 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 rubyRegexpSpecial contains=@rubyStringSpecial,rubyRegexpSpecial,rubyRegexpEscape,rubyRegexpBrackets,rubyRegexpCharClass,rubyRegexpDot,rubyRegexpQuantifier,rubyRegexpAnchor,rubyRegexpParens,rubyRegexpComment,rubyRegexpIntersection
+
+" Numbers {{{1
+syn match rubyInteger "\%(\%(\w\|[^\x00-\x7F]\|[]})\"']\s*\)\@<!-\)\=\<0[xX]\x\+\%(_\x\+\)*r\=i\=\>" display
+syn match rubyInteger "\%(\%(\w\|[^\x00-\x7F]\|[]})\"']\s*\)\@<!-\)\=\<\%(0[dD]\)\=\%(0\|[1-9]\d*\%(_\d\+\)*\)r\=i\=\>" display
+syn match rubyInteger "\%(\%(\w\|[^\x00-\x7F]\|[]})\"']\s*\)\@<!-\)\=\<0[oO]\=\o\+\%(_\o\+\)*r\=i\=\>" display
+syn match rubyInteger "\%(\%(\w\|[^\x00-\x7F]\|[]})\"']\s*\)\@<!-\)\=\<0[bB][01]\+\%(_[01]\+\)*r\=i\=\>" display
+syn match rubyFloat "\%(\%(\w\|[^\x00-\x7F]\|[]})\"']\s*\)\@<!-\)\=\<\%(0\|[1-9]\d*\%(_\d\+\)*\)\.\d\+\%(_\d\+\)*r\=i\=\>" display
+syn match rubyFloat "\%(\%(\w\|[^\x00-\x7F]\|[]})\"']\s*\)\@<!-\)\=\<\%(0\|[1-9]\d*\%(_\d\+\)*\)\%(\.\d\+\%(_\d\+\)*\)\=\%([eE][-+]\=\d\+\%(_\d\+\)*\)i\=\>" display
" Identifiers {{{1
-syn match rubyLocalVariableOrMethod "\<[_[:lower:]][_[:alnum:]]*[?!=]\=" contains=NONE display transparent
-syn match rubyBlockArgument "&[_[:lower:]][_[:alnum:]]" contains=NONE display transparent
-
-syn match rubyClassName "\%(\%(^\|[^.]\)\.\s*\)\@<!\<\u\%(\w\|[^\x00-\x7F]\)*\>\%(\s*(\)\@!" contained
-syn match rubyModuleName "\%(\%(^\|[^.]\)\.\s*\)\@<!\<\u\%(\w\|[^\x00-\x7F]\)*\>\%(\s*(\)\@!" contained
-syn match rubyConstant "\%(\%(^\|[^.]\)\.\s*\)\@<!\<\u\%(\w\|[^\x00-\x7F]\)*\>\%(\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 rubySymbolDelimiter ":" contained
-syn match rubySymbol "[]})\"':]\@1<!:\%(\^\|\~@\|\~\|<<\|<=>\|<=\|<\|===\|[=!]=\|[=!]\~\|!@\|!\|>>\|>=\|>\||\|-@\|-\|/\|\[]=\|\[]\|\*\*\|\*\|&\|%\|+@\|+\|`\)" contains=rubySymbolDelimiter
-syn match rubySymbol "[]})\"':]\@1<!:\$\%(-.\|[`~<=>_,;:!?/.'"@$*\&+0]\)" contains=rubySymbolDelimiter
-syn match rubySymbol "[]})\"':]\@1<!:\%(\$\|@@\=\)\=\%(\h\|[^\x00-\x7F]\)\%(\w\|[^\x00-\x7F]\)*" contains=rubySymbolDelimiter
-syn match rubySymbol "[]})\"':]\@1<!:\%(\h\|[^\x00-\x7F]\)\%(\w\|[^\x00-\x7F]\)*\%([?!=]>\@!\)\=" contains=rubySymbolDelimiter
-
-if s:foldable(':')
- syn region rubySymbol matchgroup=rubySymbolDelimiter start="[]})\"':]\@1<!:'" end="'" skip="\\\\\|\\'" contains=rubyQuoteEscape fold
- syn region rubySymbol matchgroup=rubySymbolDelimiter start="[]})\"':]\@1<!:\"" end="\"" skip="\\\\\|\\\"" contains=@rubyStringSpecial fold
-else
- syn region rubySymbol matchgroup=rubySymbolDelimiter start="[]})\"':]\@1<!:'" end="'" skip="\\\\\|\\'" contains=rubyQuoteEscape
- syn region rubySymbol matchgroup=rubySymbolDelimiter start="[]})\"':]\@1<!:\"" end="\"" skip="\\\\\|\\\"" contains=@rubyStringSpecial
+syn match rubyClassName "\%(\%(^\|[^.]\)\.\s*\)\@<!\<[[:upper:]]\%(\w\|[^\x00-\x7F]\)*\>\%(\s*(\)\@!" contained
+syn match rubyModuleName "\%(\%(^\|[^.]\)\.\s*\)\@<!\<[[:upper:]]\%(\w\|[^\x00-\x7F]\)*\>\%(\s*(\)\@!" contained
+syn match rubyConstant "\%(\%(^\|[^.]\)\.\s*\)\@<!\<[[:upper:]]\%(\w\|[^\x00-\x7F]\)*\>\%(\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 rubySymbolDelimiter ":" contained
+syn match rubySymbol "[]})\"':]\@1<!:\%(\^\|\~@\|\~\|<<\|<=>\|<=\|<\|===\|[=!]=\|[=!]\~\|!@\|!\|>>\|>=\|>\||\|-@\|-\|/\|\[]=\|\[]\|\*\*\|\*\|&\|%\|+@\|+\|`\)" contains=rubySymbolDelimiter
+syn match rubySymbol "[]})\"':]\@1<!:\$\%(-.\|[`~<=>_,;:!?/.'"@$*\&+0]\)" contains=rubySymbolDelimiter
+syn match rubySymbol "[]})\"':]\@1<!:\%(\$\|@@\=\)\=\%(\h\|[^\x00-\x7F]\)\%(\w\|[^\x00-\x7F]\)*" contains=rubySymbolDelimiter
+syn match rubySymbol "[]})\"':]\@1<!:\%(\h\|[^\x00-\x7F]\)\%(\w\|[^\x00-\x7F]\)*\%([?!=]>\@!\)\=" contains=rubySymbolDelimiter
+
+SynFold ':' syn region rubySymbol matchgroup=rubySymbolDelimiter start="[]})\"':]\@1<!:'" end="'" skip="\\\\\|\\'" contains=rubyQuoteEscape,rubyBackslashEscape
+SynFold ':' syn region rubySymbol matchgroup=rubySymbolDelimiter start="[]})\"':]\@1<!:\"" end="\"" skip="\\\\\|\\\"" contains=@rubyStringSpecial
+
+syn match rubyCapitalizedMethod "\%(\%(^\|[^.]\)\.\s*\)\@<!\<\u\%(\w\|[^\x00-\x7F]\)*\>\%(\s*(\)\@="
+
+syn region rubyParentheses start="(" end=")" contains=ALLBUT,@rubyNotTop containedin=rubyBlockParameterList
+syn region rubyBlockParameterList start="\%(\%(\<do\>\|{\)\_s*\)\@32<=|" end="|" contains=ALLBUT,@rubyNotTop,@rubyProperOperator
+
+if exists('ruby_global_variable_error')
+ syn match rubyGlobalVariableError "$[^A-Za-z_]" display
+ syn match rubyGlobalVariableError "$-[^0FIKWadilpvw]" display
endif
-syn match rubyCapitalizedMethod "\%(\%(^\|[^.]\)\.\s*\)\@<!\<\u\%(\w\|[^\x00-\x7F]\)*\>\%(\s*(\)*\s*(\@="
-
-syn match rubyBlockParameter "\%(\h\|[^\x00-\x7F]\)\%(\w\|[^\x00-\x7F]\)*" contained
-syn region rubyBlockParameterList start="\%(\%(\<do\>\|{\)\_s*\)\@32<=|" 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*\)\@<!\<\%(ARGF\|ARGV\|ENV\|DATA\|FALSE\|NIL\|STDERR\|STDIN\|STDOUT\|TOPLEVEL_BINDING\|TRUE\)\>\%(\s*(\)\@!"
+syn match rubyPredefinedVariable #$[!$&"'*+,./0:;<>?@\`~]#
+syn match rubyPredefinedVariable "$\d\+" display
+syn match rubyPredefinedVariable "$_\>" display
+syn match rubyPredefinedVariable "$-[0FIWadilpvw]\>" display
+syn match rubyPredefinedVariable "$\%(stderr\|stdin\|stdout\)\>" display
+syn match rubyPredefinedVariable "$\%(DEBUG\|FILENAME\|LOADED_FEATURES\|LOAD_PATH\|PROGRAM_NAME\|SAFE\|VERBOSE\)\>" display
+syn match rubyPredefinedConstant "\%(\%(^\|[^.]\)\.\s*\)\@<!\<\%(ARGF\|ARGV\|ENV\|DATA\|STDERR\|STDIN\|STDOUT\|TOPLEVEL_BINDING\)\>\%(\s*(\)\@!"
syn match rubyPredefinedConstant "\%(\%(^\|[^.]\)\.\s*\)\@<!\<\%(RUBY_\%(VERSION\|RELEASE_DATE\|PLATFORM\|PATCHLEVEL\|REVISION\|DESCRIPTION\|COPYRIGHT\|ENGINE\)\)\>\%(\s*(\)\@!"
-" Normal Regular Expressio