PATCH: prevent the optional 'do' in loop constructs from matching a do/end code block

Doug Kearns djkea2 at
Tue Sep 2 20:33:42 EDT 2003

This prevents the optional 'do' in loop constructs from matching the
start of a do/end code block, it also adds support for matching the new
optional ':'.

Code like,

    def join_nowait(*threads)
            @threads.concat threads
            for th in threads do
                    Thread.start(th) do |t|
                            @wait_queue.push t

should now be highlighted and fold properly.

BTW, does anyone know why the optional ':' was introduced?


Index: syntax/ruby.vim
RCS file: /var/cvs/vim-ruby/vim-ruby/syntax/ruby.vim,v
retrieving revision 1.13
diff -u -r1.13 ruby.vim
--- syntax/ruby.vim	28 Aug 2003 14:36:01 -0000	1.13
+++ syntax/ruby.vim	2 Sep 2003 09:40:16 -0000
@@ -184,11 +184,11 @@
   syn region rubyBlock start="^\s*def\s\+"rs=s		   matchgroup=rubyDefine end="\<end\>" contains=ALLBUT,rubyExprSubst,rubyTodo nextgroup=rubyFunction fold
   syn region rubyBlock start="^\s*\(class\|module\)\>"rs=s matchgroup=rubyDefine end="\<end\>" contains=ALLBUT,rubyExprSubst,rubyTodo nextgroup=rubyClassOrModule fold
-  " modifiers + redundant *do*
-  syn match  rubyControl "\<\(if\|unless\|while\|until\|do\)\>"
+  " modifiers
+  syn match  rubyControl "\<\(if\|unless\|while\|until\)\>"
   " *do* requiring *end*
-  syn region rubyDoBlock matchgroup=rubyControl start="\<do\>" end="\<end\>" contains=ALLBUT,rubyExprSubst,rubyTodo fold
+  syn region rubyDoBlock matchgroup=rubyControl start="\(\<\(for\|until\|while\)\s.*\s\)\@<!do\>" end="\<end\>" contains=ALLBUT,rubyExprSubst,rubyTodo fold
   " *{* requiring *}*
   syn region rubyCurlyBlock start="{" end="}" contains=ALLBUT,rubyExprSubst,rubyTodo fold
@@ -198,6 +198,9 @@
   " statement with optional *do*
   syn region rubyOptDoBlock matchgroup=rubyControl start="\<for\>" start="^\s*\(while\|until\)\>" start=";\s*\(while\|until\)\>"hs=s+1 end="\<end\>" contains=ALLBUT,rubyExprSubst,rubyTodo fold
+  " optional *do*
+  syn match  rubyControl "\(\<\(for\|until\|while\)\s.*\s\)\@<=\(do\|:\)\>"
   if !exists("ruby_minlines")
     let ruby_minlines = 50

More information about the vim-ruby-devel mailing list