From 55de232426b3861d1cc2385888a6104063318dce Mon Sep 17 00:00:00 2001
From: Tycho Sci <tychosci@gmail.com>
Date: Thu, 3 May 2012 16:48:03 +0900
Subject: [PATCH 1/5] vim: Highlight identifiers

---
 src/etc/vim/syntax/rust.vim | 14 +++++++++++---
 1 file changed, 11 insertions(+), 3 deletions(-)

diff --git a/src/etc/vim/syntax/rust.vim b/src/etc/vim/syntax/rust.vim
index 26bb0d704173b..3e248f4c983d4 100644
--- a/src/etc/vim/syntax/rust.vim
+++ b/src/etc/vim/syntax/rust.vim
@@ -15,11 +15,17 @@ if !exists("main_syntax")
 endif
 
 syn keyword   rustKeyword     alt as assert be bind break
-syn keyword   rustKeyword     check claim cont const copy do else enum export fail
-syn keyword   rustKeyword     fn for if iface impl import in inline lambda let log
+syn keyword   rustKeyword     check claim cont const copy do else export fail
+syn keyword   rustKeyword     for if impl import in inline lambda let log
 syn keyword   rustKeyword     loop mod mut mutable native note of prove pure
-syn keyword   rustKeyword     resource ret self syntax to type unchecked
+syn keyword   rustKeyword     ret self syntax to unchecked
 syn keyword   rustKeyword     unsafe use while with
+" FIXME: Scoped impl's name is also fallen in this category
+syn keyword   rustKeyword     mod iface resource class enum type nextgroup=rustIdentifier skipwhite
+syn keyword   rustKeyword     fn nextgroup=rustFuncName skipwhite
+
+syn match     rustIdentifier  "\%([^[:cntrl:][:space:][:punct:][:digit:]]\|_\)\%([^[:cntrl:][:punct:][:space:]]\|_\)*" display contained
+syn match     rustFuncName    "\%([^[:cntrl:][:space:][:punct:][:digit:]]\|_\)\%([^[:cntrl:][:punct:][:space:]]\|_\)*" display contained
 
 " Reserved words
 syn keyword   rustKeyword     m32 m64 m128 f80 f16 f128 class trait
@@ -59,6 +65,8 @@ hi def link rustNumber        Number
 hi def link rustBoolean       Boolean
 hi def link rustFloat         Float
 hi def link rustKeyword       Keyword
+hi def link rustIdentifier    Identifier
+hi def link rustFuncName      Function
 hi def link rustComment       Comment
 hi def link rustMacro         Macro
 hi def link rustType          Type

From 94b0edc606112ddc71283bdcb5cb826dcbc3d167 Mon Sep 17 00:00:00 2001
From: Tycho Sci <tychosci@gmail.com>
Date: Thu, 3 May 2012 17:02:41 +0900
Subject: [PATCH 2/5] vim: Highlight Todo in comments

---
 src/etc/vim/syntax/rust.vim | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/src/etc/vim/syntax/rust.vim b/src/etc/vim/syntax/rust.vim
index 3e248f4c983d4..e89ad554c9975 100644
--- a/src/etc/vim/syntax/rust.vim
+++ b/src/etc/vim/syntax/rust.vim
@@ -56,8 +56,10 @@ syn case match
 
 syn match   rustCharacter   "'\([^'\\]\|\\\(['nrt\\\"]\|x\x\{2}\|u\x\{4}\|U\x\{8}\)\)'"
 
-syn region    rustComment     start="/\*" end="\*/" contains=rustComment
-syn region    rustComment     start="//" skip="\\$" end="$" keepend
+syn region    rustComment     start="/\*" end="\*/" contains=rustComment,rustTodo
+syn region    rustComment     start="//" skip="\\$" end="$" contains=rustTodo keepend
+
+syn keyword   rustTodo        TODO FIXME XXX NB
 
 hi def link rustString        String
 hi def link rustCharacter     Character

From 1e44e04a9dc0f801492ea1630d6a42e9df07af99 Mon Sep 17 00:00:00 2001
From: Tycho Sci <tychosci@gmail.com>
Date: Thu, 3 May 2012 17:12:46 +0900
Subject: [PATCH 3/5] vim: Update syntax for number/float literals

---
 src/etc/vim/syntax/rust.vim | 37 +++++++++++++++++++++++--------------
 1 file changed, 23 insertions(+), 14 deletions(-)

diff --git a/src/etc/vim/syntax/rust.vim b/src/etc/vim/syntax/rust.vim
index e89ad554c9975..81936b29d08e4 100644
--- a/src/etc/vim/syntax/rust.vim
+++ b/src/etc/vim/syntax/rust.vim
@@ -39,20 +39,25 @@ syn match     rustItemPath    "\(\w\|::\)\+"
 
 syn region	  rustString      start=+L\="+ skip=+\\\\\|\\"+ end=+"+
 
-"integer number, or floating point number without a dot and with "f".
-syn case ignore
-syn match	  rustNumber		display contained "\d\+\(u\=l\{0,2}\|ll\=u\)\>"
-"hex number
-syn match	  rustNumber		display contained "0x\x\+\(u\=l\{0,2}\|ll\=u\)\>"
-syn match	rustFloat		display contained "\d\+f"
-"floating point number, with dot, optional exponent
-syn match	rustFloat		display contained "\d\+\.\d*\(e[-+]\=\d\+\)\=[fl]\="
-"floating point number, starting with a dot, optional exponent
-syn match	rustFloat		display contained "\.\d\+\(e[-+]\=\d\+\)\=[fl]\=\>"
-"floating point number, without dot, with exponent
-syn match	rustFloat		display contained "\d\+e[-+]\=\d\+[fl]\=\>"
-
-syn case match
+" Number/Float literals
+syn match     rustNumber      display "\<\d\>"
+syn match     rustNumber      display "\<[1-9]\d\+\>"
+syn match     rustNumber      display "\<\d\+\(u\|u8\|u16\|u32\|u64\)\>"
+syn match     rustNumber      display "\<\d\+\(i8\|i16\|i32\|i64\)\>"
+
+syn match     rustHexNumber   display "\<0[xX]\x\+\>"
+syn match     rustHexNumber   display "\<0[xX]\x\+_\(u\|u8\|u16\|u32\|u64\)\>"
+syn match     rustHexNumber   display "\<0[xX]\x\+_\(i8\|i16\|i32\|i64\)\>"
+syn match     rustOctNumber   display "\<0\o\+\>"
+syn match     rustOctNumber   display "\<0\o\+_\(u\|u8\|u16\|u32\|u64\)\>"
+syn match     rustOctNumber   display "\<0\o\+_\(i8\|i16\|i32\|i64\)\>"
+syn match     rustBinNumber   display "\<0[bB][01]\+\>"
+syn match     rustBinNumber   display "\<0[bB][01]\+_\(u\|u8\|u16\|u32\|u64\)\>"
+syn match     rustBinNumber   display "\<0[bB][01]\+_\(i8\|i16\|i32\|i64\)\>"
+
+syn match     rustFloat       display "\.\d\+\%([eE][+-]\=\d\+\)\=\>"
+syn match     rustFloat       display "\<\d\+[eE][+-]\=\d\+\>"
+syn match     rustFloat       display "\<\d\+\.\d*\%([eE][+-]\=\d\+\)\="
 
 syn match   rustCharacter   "'\([^'\\]\|\\\(['nrt\\\"]\|x\x\{2}\|u\x\{4}\|U\x\{8}\)\)'"
 
@@ -61,6 +66,10 @@ syn region    rustComment     start="//" skip="\\$" end="$" contains=rustTodo ke
 
 syn keyword   rustTodo        TODO FIXME XXX NB
 
+hi def link rustHexNumber     rustNumber
+hi def link rustOctNumber     rustNumber
+hi def link rustBinNumber     rustNumber
+
 hi def link rustString        String
 hi def link rustCharacter     Character
 hi def link rustNumber        Number

From bbf73bdfc682dd778cd0827540026477dd073c3f Mon Sep 17 00:00:00 2001
From: Tycho Sci <tychosci@gmail.com>
Date: Sat, 5 May 2012 10:20:27 +0900
Subject: [PATCH 4/5] vim: Link rustTodo to Todo for highlighting

---
 src/etc/vim/syntax/rust.vim | 1 +
 1 file changed, 1 insertion(+)

diff --git a/src/etc/vim/syntax/rust.vim b/src/etc/vim/syntax/rust.vim
index 81936b29d08e4..ef70383ddacaf 100644
--- a/src/etc/vim/syntax/rust.vim
+++ b/src/etc/vim/syntax/rust.vim
@@ -81,6 +81,7 @@ hi def link rustFuncName      Function
 hi def link rustComment       Comment
 hi def link rustMacro         Macro
 hi def link rustType          Type
+hi def link rustTodo          Todo
 
 syn sync minlines=200
 syn sync maxlines=500

From 16848becaa8a1f812ba5e131cd6d4d4601f63979 Mon Sep 17 00:00:00 2001
From: Tycho Sci <tychosci@gmail.com>
Date: Sat, 5 May 2012 11:43:07 +0900
Subject: [PATCH 5/5] vim: Fix syntax of number literals

To follow [3.5.2.2 Number literals] in the reference manual.
---
 src/etc/vim/syntax/rust.vim | 39 ++++++++++++++++++-------------------
 1 file changed, 19 insertions(+), 20 deletions(-)

diff --git a/src/etc/vim/syntax/rust.vim b/src/etc/vim/syntax/rust.vim
index ef70383ddacaf..320f04bb56d76 100644
--- a/src/etc/vim/syntax/rust.vim
+++ b/src/etc/vim/syntax/rust.vim
@@ -39,25 +39,25 @@ syn match     rustItemPath    "\(\w\|::\)\+"
 
 syn region	  rustString      start=+L\="+ skip=+\\\\\|\\"+ end=+"+
 
-" Number/Float literals
-syn match     rustNumber      display "\<\d\>"
-syn match     rustNumber      display "\<[1-9]\d\+\>"
-syn match     rustNumber      display "\<\d\+\(u\|u8\|u16\|u32\|u64\)\>"
-syn match     rustNumber      display "\<\d\+\(i8\|i16\|i32\|i64\)\>"
-
-syn match     rustHexNumber   display "\<0[xX]\x\+\>"
-syn match     rustHexNumber   display "\<0[xX]\x\+_\(u\|u8\|u16\|u32\|u64\)\>"
-syn match     rustHexNumber   display "\<0[xX]\x\+_\(i8\|i16\|i32\|i64\)\>"
-syn match     rustOctNumber   display "\<0\o\+\>"
-syn match     rustOctNumber   display "\<0\o\+_\(u\|u8\|u16\|u32\|u64\)\>"
-syn match     rustOctNumber   display "\<0\o\+_\(i8\|i16\|i32\|i64\)\>"
-syn match     rustBinNumber   display "\<0[bB][01]\+\>"
-syn match     rustBinNumber   display "\<0[bB][01]\+_\(u\|u8\|u16\|u32\|u64\)\>"
-syn match     rustBinNumber   display "\<0[bB][01]\+_\(i8\|i16\|i32\|i64\)\>"
-
-syn match     rustFloat       display "\.\d\+\%([eE][+-]\=\d\+\)\=\>"
-syn match     rustFloat       display "\<\d\+[eE][+-]\=\d\+\>"
-syn match     rustFloat       display "\<\d\+\.\d*\%([eE][+-]\=\d\+\)\="
+" Number literals
+syn match     rustNumber      display "\<[0-9][0-9_]*\>"
+syn match     rustNumber      display "\<[0-9][0-9_]*\(u\|u8\|u16\|u32\|u64\)\>"
+syn match     rustNumber      display "\<[0-9][0-9_]*\(i8\|i16\|i32\|i64\)\>"
+
+syn match     rustHexNumber   display "\<0x[a-fA-F0-9_]\+\>"
+syn match     rustHexNumber   display "\<0x[a-fA-F0-9_]\+\(u\|u8\|u16\|u32\|u64\)\>"
+syn match     rustHexNumber   display "\<0x[a-fA-F0-9_]\+\(i8\|i16\|i32\|i64\)\>"
+syn match     rustBinNumber   display "\<0b[01_]\+\>"
+syn match     rustBinNumber   display "\<0b[01_]\+\(u\|u8\|u16\|u32\|u64\)\>"
+syn match     rustBinNumber   display "\<0b[01_]\+\(i8\|i16\|i32\|i64\)\>"
+
+syn match     rustFloat       display "\<[0-9][0-9_]*\(f\|f32\|f64\)\>"
+syn match     rustFloat       display "\<[0-9][0-9_]*\([eE][+-]\=[0-9_]\+\)\>"
+syn match     rustFloat       display "\<[0-9][0-9_]*\([eE][+-]\=[0-9_]\+\)\(f\|f32\|f64\)\>"
+syn match     rustFloat       display "\<[0-9][0-9_]*\.[0-9_]\+\>"
+syn match     rustFloat       display "\<[0-9][0-9_]*\.[0-9_]\+\(f\|f32\|f64\)\>"
+syn match     rustFloat       display "\<[0-9][0-9_]*\.[0-9_]\+\%([eE][+-]\=[0-9_]\+\)\>"
+syn match     rustFloat       display "\<[0-9][0-9_]*\.[0-9_]\+\%([eE][+-]\=[0-9_]\+\)\(f\|f32\|f64\)\>"
 
 syn match   rustCharacter   "'\([^'\\]\|\\\(['nrt\\\"]\|x\x\{2}\|u\x\{4}\|U\x\{8}\)\)'"
 
@@ -67,7 +67,6 @@ syn region    rustComment     start="//" skip="\\$" end="$" contains=rustTodo ke
 syn keyword   rustTodo        TODO FIXME XXX NB
 
 hi def link rustHexNumber     rustNumber
-hi def link rustOctNumber     rustNumber
 hi def link rustBinNumber     rustNumber
 
 hi def link rustString        String