updated for version 7.1b
diff --git a/runtime/syntax/framescript.vim b/runtime/syntax/framescript.vim
new file mode 100644
index 0000000..39d75e8
--- /dev/null
+++ b/runtime/syntax/framescript.vim
@@ -0,0 +1,491 @@
+" Vim syntax file
+" Language:         FrameScript v4.0
+" Maintainer:       Nikolai Weibull <now@bitwi.se>
+" Latest Revision:  2007-02-22
+
+if exists("b:current_syntax")
+  finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+syn match   framescriptOperator
+      \ '[+*/%=-]\|[><]=\=\|#[&|]'
+
+syn keyword framescriptTodo
+      \ contained
+      \ TODO FIXME XXX NOTE
+
+syn cluster framescriptCommentGroup
+      \ contains=
+      \   framescriptTodo,
+      \   @Spell
+
+syn match   framescriptComment
+      \ display
+      \ contains=@framescriptCommentGroup
+      \ '//.*$'
+
+syn region  framescriptComment
+      \ contains=@framescriptCommentGroup
+      \ matchgroup=framescriptCommentStart
+      \ start='/\*'
+      \ end='\*/'
+
+syn case ignore
+
+syn match   framescriptInclude
+      \ display
+      \ contains=framescriptIncluded
+      \ "^\s*<#Include\>\s*'"
+
+syn region  framescriptIncluded
+      \ contained
+      \ display
+      \ start=+'+
+      \ skip=+\\\\\|\\'+
+      \ end=+'+
+
+syn match   framescriptNumbers
+      \ display
+      \ transparent
+      \ contains=
+      \   framescriptInteger,
+      \   framescriptReal,
+      \   framescriptMetric,
+      \   framescriptCharacter
+      \ '\<\d\|\.\d'
+
+syn keyword framescriptBoolean
+      \ True False
+
+syn match   framescriptInteger
+      \ contained
+      \ display
+      \ '\d\+\>'
+
+syn match   framescriptInteger
+      \ contained
+      \ display
+      \ '\x\+H\>'
+
+syn match   framescriptInteger
+      \ contained
+      \ display
+      \ '[01]\+B\>'
+
+syn match   framescriptReal
+      \ contained
+      \ display
+      \ '\d\+\.\d*\|\.\d\+\>'
+
+syn match   framescriptMetric
+      \ contained
+      \ display
+      \ '\%(\d\+\%(\.\d*\)\=\|\.\d\+\)\%(pts\|in\|"\|cm\|mm\|pica\)\>'
+
+syn match   framescriptCharacter
+      \ contained
+      \ display
+      \ '\d\+S\>'
+
+syn region  framescriptString
+      \ contains=framescriptStringSpecialChar,@Spell
+      \ start=+'+
+      \ skip=+\\\\\|\\'+
+      \ end=+'+
+
+syn match   framescriptStringSpecialChar
+      \ contained
+      \ display
+      \ "\\[\\']"
+
+syn keyword framescriptConstant
+      \ BackSlash
+      \ CharCR
+      \ CharLF
+      \ CharTAB
+      \ ClientDir
+      \ ClientName
+      \ FslVersionMajor
+      \ FslVersionMinor
+      \ InstallName
+      \ InstalledScriptList
+      \ MainScript
+      \ NULL
+      \ ObjEndOffset
+      \ ProductRevision
+      \ Quote
+      \ ThisScript
+
+syn keyword framescriptOperator
+      \ not
+      \ and
+      \ or
+
+syn keyword framescriptSessionVariables
+      \ ErrorCode
+      \ ErrorMsg
+      \ DeclareVarMode
+      \ PlatformEncodingMode
+
+syn keyword framescriptStructure
+      \ Event
+      \ EndEvent
+
+syn keyword framescriptStatement
+      \ Sub
+      \ EndSub
+      \ Run
+      \ Function
+      \ EndFunction
+      \ Set
+      \ Add
+      \ Apply
+      \ CallClient
+      \ Close
+      \ Copy
+      \ Cut
+      \ DialogBox
+      \ Delete
+      \ Demote
+      \ Display
+      \ DocCompare
+      \ Export
+      \ Find
+      \ LeaveLoop
+      \ LeaveScript
+      \ LeaveSub
+      \ LoopNext
+      \ Merge
+      \ MsgBox
+      \ Paste
+      \ PopClipboard
+      \ PushClipboard
+      \ Read
+      \ Replace
+      \ Return
+      \ Sort
+      \ Split
+
+syn keyword framescriptStatement
+      \ nextgroup=framescriptApplySubStatement skipwhite skipempty
+      \ Apply
+
+syn keyword framescriptApplySubStatement
+      \ contained
+      \ Pagelayout
+      \ TextProperties
+
+syn keyword framescriptStatement
+      \ nextgroup=framescriptClearSubStatement skipwhite skipempty
+      \ Clear
+
+syn keyword framescriptClearSubStatement
+      \ contained
+      \ ChangeBars
+      \ Text
+
+syn keyword framescriptStatement
+      \ nextgroup=framescriptCloseSubStatement skipwhite skipempty
+      \ Close
+
+syn keyword framescriptCloseSubStatement
+      \ contained
+      \ Book
+      \ Document
+      \ TextFile
+
+syn keyword framescriptStatement
+      \ nextgroup=framescriptExecSubStatement skipwhite skipempty
+      \ Exec
+
+syn keyword framescriptExecSubStatement
+      \ contained
+      \ Compile
+      \ Script
+      \ Wait
+
+syn keyword framescriptStatement
+      \ nextgroup=framescriptExecuteSubStatement skipwhite skipempty
+      \ Execute
+
+syn keyword framescriptExecuteSubStatement
+      \ contained
+      \ FrameCommand
+      \ Hypertext
+      \ StartUndoCheckPoint
+      \ EndUndoCheckPoint
+      \ ClearUndoHistory
+
+syn keyword framescriptStatement
+      \ nextgroup=framescriptGenerateSubStatement skipwhite skipempty
+      \ Generate
+
+syn keyword framescriptGenerateSubStatement
+      \ contained
+      \ Bookfile
+
+syn keyword framescriptStatement
+      \ nextgroup=framescriptGetSubStatement skipwhite skipempty
+      \ Get
+
+syn keyword framescriptGetSubStatement
+      \ contained
+      \ Member
+      \ Object
+      \ String
+      \ TextList
+      \ TextProperties
+
+syn keyword framescriptStatement
+      \ nextgroup=framescriptImportSubStatement skipwhite skipempty
+      \ Import
+
+syn keyword framescriptImportSubStatement
+      \ contained
+      \ File
+      \ Formats
+      \ ElementDefs
+
+syn keyword framescriptStatement
+      \ nextgroup=framescriptInstallSubStatement skipwhite skipempty
+      \ Install
+      \ Uninstall
+
+syn keyword framescriptInstallSubStatement
+      \ contained
+      \ ChangeBars
+      \ Text
+
+syn keyword framescriptStatement
+      \ nextgroup=framescriptNewSubStatement skipwhite skipempty
+      \ New
+
+syn keyword framescriptNewSubStatement
+      \ contained
+      \ AFrame
+      \ Footnote
+      \ Marker
+      \ TiApiClient
+      \ Variable
+      \ XRef
+      \ FormatChangeList
+      \ FormatRule
+      \ FmtRuleClause
+      \ Arc
+      \ Ellipse
+      \ Flow
+      \ Group
+      \ Inset
+      \ Line
+      \ Math
+      \ Polygon
+      \ Polyline
+      \ Rectangle
+      \ RoundRect
+      \ TextFrame
+      \ Textline
+      \ UnanchoredFrame
+      \ Command
+      \ Menu
+      \ MenuItemSeparator
+      \ Book
+      \ CharacterFormat
+      \ Color
+      \ ConditionFormat
+      \ ElementDef
+      \ FormatChangeList
+      \ MarkerType
+      \ MasterPage
+      \ ParagraphFormat
+      \ PgfFmt
+      \ ReferencePAge
+      \ RulingFormat
+      \ TableFormat
+      \ VariableFormat
+      \ XRefFormat
+      \ BodyPage
+      \ BookComponent
+      \ Paragraph
+      \ Element
+      \ Attribute
+      \ AttributeDef
+      \ AttributeList
+      \ AttributeDefList
+      \ ElementLoc
+      \ ElementRange
+      \ Table
+      \ TableRows
+      \ TableCols
+      \ Text
+      \ Integer
+      \ Real
+      \ Metric
+      \ String
+      \ Object
+      \ TextLoc
+      \ TextRange
+      \ IntList
+      \ UIntList
+      \ MetricList
+      \ StringList
+      \ PointList
+      \ TabList
+      \ PropertyList
+      \ LibVar
+      \ ScriptVar
+      \ SubVar
+      \ TextFile
+
+syn keyword framescriptStatement
+      \ nextgroup=framescriptOpenSubStatement skipwhite skipempty
+      \ Open
+
+syn keyword framescriptOpenSubStatement
+      \ contained
+      \ Document
+      \ Book
+      \ TextFile
+
+syn keyword framescriptStatement
+      \ nextgroup=framescriptPrintSubStatement skipwhite skipempty
+      \ Print
+
+syn keyword framescriptPrintSubStatement
+      \ contained
+      \ Document
+      \ Book
+
+syn keyword framescriptStatement
+      \ nextgroup=framescriptQuitSubStatement skipwhite skipempty
+      \ Quit
+
+syn keyword framescriptQuitSubStatement
+      \ contained
+      \ Session
+
+syn keyword framescriptStatement
+      \ nextgroup=framescriptRemoveSubStatement skipwhite skipempty
+      \ Remove
+
+syn keyword framescriptRemoveSubStatement
+      \ contained
+      \ Attribute
+      \ CommandObject
+
+syn keyword framescriptStatement
+      \ nextgroup=framescriptSaveSubStatement skipwhite skipempty
+      \ Save
+
+syn keyword framescriptSaveSubStatement
+      \ contained
+      \ Document
+      \ Book
+
+syn keyword framescriptStatement
+      \ nextgroup=framescriptSelectSubStatement skipwhite skipempty
+      \ Select
+
+syn keyword framescriptSelectSubStatement
+      \ contained
+      \ TableCells
+
+syn keyword framescriptStatement
+      \ nextgroup=framescriptStraddleSubStatement skipwhite skipempty
+      \ Straddle
+
+syn keyword framescriptStraddleSubStatement
+      \ contained
+      \ TableCells
+
+syn keyword framescriptStatement
+      \ nextgroup=framescriptUpdateSubStatement skipwhite skipempty
+      \ Update
+
+syn keyword framescriptUpdateSubStatement
+      \ contained
+      \ ReDisplay
+      \ Formatting
+      \ Hyphenating
+      \ ResetEquationsSettings
+      \ ResetRefFrames
+      \ RestartPgfNums
+      \ TextInset
+      \ Variables
+      \ XRefs
+      \ Book
+
+syn keyword framescriptStatement
+      \ nextgroup=framescriptWriteSubStatement skipwhite skipempty
+      \ Write
+
+syn keyword framescriptUpdateSubStatement
+      \ contained
+      \ Console
+      \ Display
+
+syn keyword framescriptRepeat
+      \ Loop
+      \ EndLoop
+
+syn keyword framescriptConditional
+      \ If
+      \ ElseIf
+      \ Else
+      \ EndIf
+
+syn keyword framescriptType
+      \ Local
+      \ GlobalVar
+
+let b:framescript_minlines = exists("framescript_minlines")
+                         \ ? framescript_minlines : 15
+exec "syn sync ccomment framescriptComment minlines=" . b:framescript_minlines
+
+hi def link framescriptTodo                 Todo
+hi def link framescriptComment              Comment
+hi def link framescriptCommentStart         framescriptComment
+hi def link framescriptInclude              Include
+hi def link framescriptIncluded             String
+hi def link framescriptBoolean              Boolean
+hi def link framescriptNumber               Number
+hi def link framescriptInteger              framescriptNumber
+hi def link framescriptReal                 framescriptNumber
+hi def link framescriptMetric               framescriptNumber
+hi def link framescriptCharacter            framescriptNumber
+hi def link framescriptString               String
+hi def link framescriptStringSpecialChar    SpecialChar
+hi def link framescriptConstant             Constant
+hi def link framescriptOperator             None
+hi def link framescriptSessionVariables     PreProc
+hi def link framescriptStructure            Structure
+hi def link framescriptStatement            Statement
+hi def link framescriptSubStatement         Type
+hi def link framescriptApplySubStatement    framescriptSubStatement
+hi def link framescriptClearSubStatement    framescriptSubStatement
+hi def link framescriptCloseSubStatement    framescriptSubStatement
+hi def link framescriptExecSubStatement     framescriptSubStatement
+hi def link framescriptExecuteSubStatement  framescriptSubStatement
+hi def link framescriptGenerateSubStatement framescriptSubStatement
+hi def link framescriptGetSubStatement      framescriptSubStatement
+hi def link framescriptImportSubStatement   framescriptSubStatement
+hi def link framescriptInstallSubStatement  framescriptSubStatement
+hi def link framescriptNewSubStatement      framescriptSubStatement
+hi def link framescriptOpenSubStatement     framescriptSubStatement
+hi def link framescriptPrintSubStatement    framescriptSubStatement
+hi def link framescriptQuitSubStatement     framescriptSubStatement
+hi def link framescriptRemoveSubStatement   framescriptSubStatement
+hi def link framescriptSaveSubStatement     framescriptSubStatement
+hi def link framescriptSelectSubStatement   framescriptSubStatement
+hi def link framescriptStraddleSubStatement framescriptSubStatement
+hi def link framescriptUpdateSubStatement   framescriptSubStatement
+hi def link framescriptRepeat               Repeat
+hi def link framescriptConditional          Conditional
+hi def link framescriptType                 Type
+
+let b:current_syntax = "framescript"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/syntax/indent.vim b/runtime/syntax/indent.vim
index ef4df5f..359a724 100644
--- a/runtime/syntax/indent.vim
+++ b/runtime/syntax/indent.vim
@@ -1,7 +1,7 @@
 " Vim syntax file
 " Language:         indent(1) configuration file
 " Maintainer:       Nikolai Weibull <now@bitwi.se>
-" Latest Revision:  2006-04-19
+" Latest Revision:  2007-05-07
 "   indent_is_bsd:  If exists, will change somewhat to match BSD implementation
 "
 " TODO: is the deny-all (a la lilo.vim nice or no?)...
@@ -26,6 +26,20 @@
 syn region  indentComment start='//' skip='\\$' end='$'
                           \ contains=indentTodo,@Spell
 
+syn match   indentOptions '-\%(bli\|c\%([bl]i\|[dip]\)\=\|di\=\|ip\=\|lc\=\|pp\=i\|sbi\|ts\|-\%(brace-indent\|comment-indentation\|case-brace-indentation\|declaration-comment-column\|continuation-indentation\|case-indentation\|else-endif-column\|line-comments-indentation\|declaration-indentation\|indent-level\|parameter-indentation\|line-length\|comment-line-length\|paren-indentation\|preprocessor-indentation\|struct-brace-indentation\|tab-size\)\)'
+                        \ nextgroup=indentNumber skipwhite skipnl
+if !exists("indent_is_bsd")
+  syn match indentOptions '-i\|--indentation-level'
+                        \ nextgroup=indentNumber skipwhite skipnl
+endif
+
+syn match   indentNumber  display contained '\d\+\>'
+
+syn match   indentOptions '-T'
+                        \ nextgroup=indentIdent skipwhite skipnl
+
+syn match   indentIdent   display contained '\h\w*\>'
+
 syn keyword indentOptions -bacc --blank-lines-after-ifdefs
                         \ -bad --blank-lines-after-declarations
                         \ -badp --blank-lines-after-procedure-declarations
@@ -41,8 +55,7 @@
                         \ -br --braces-on-if-line
                         \ -brf --braces-on-func-def-line
                         \ -brs --braces-on-struct-decl-line
-                        \ -bs --Bill-Shannon
-                        \ -bs --blank-before-sizeof
+                        \ -bs --Bill-Shannon --blank-before-sizeof
                         \ -c++ --c-plus-plus
                         \ -cdb --comment-delimiters-on-blank-lines
                         \ -cdw --cuddle-do-while
@@ -53,12 +66,9 @@
                         \ -fc1 --format-first-column-comments
                         \ -fca --format-all-comments
                         \ -gnu --gnu-style
-                        \ -h --help
-                        \ -h --usage
+                        \ -h --help --usage
                         \ -hnl --honour-newlines
-                        \ -kr --k-and-r-style
-                        \ -kr --kernighan-and-ritchie
-                        \ -kr --kernighan-and-ritchie-style
+                        \ -kr --k-and-r-style --kernighan-and-ritchie --kernighan-and-ritchie-style
                         \ -lp --continue-at-parentheses
                         \ -lps --leave-preprocessor-space
                         \ -nbacc --no-blank-lines-after-ifdefs
@@ -70,8 +80,7 @@
                         \ -nbc --no-blank-lines-after-commas
                         \ -nbfda --dont-break-function-decl-args
                         \ -nbfde --dont-break-function-decl-args-end
-                        \ -nbs --no-Bill-Shannon
-                        \ -nbs --no-blank-before-sizeof
+                        \ -nbs --no-Bill-Shannon --no-blank-before-sizeof
                         \ -ncdb --no-comment-delimiters-on-blank-lines
                         \ -ncdw --dont-cuddle-do-while
                         \ -nce --dont-cuddle-else
@@ -81,11 +90,11 @@
                         \ -nfc1 --dont-format-first-column-comments
                         \ -nfca --dont-format-comments
                         \ -nhnl --ignore-newlines
-                        \ -nip --dont-indent-parameters
-                        \ -nip --no-parameter-indentation
+                        \ -nip --dont-indent-parameters --no-parameter-indentation
                         \ -nlp --dont-line-up-parentheses
                         \ -nlps --remove-preprocessor-space
                         \ -npcs --no-space-after-function-call-names
+                        \ -npmt
                         \ -npro --ignore-profile
                         \ -nprs --no-space-after-parentheses
                         \ -npsl --dont-break-procedure-type
@@ -99,10 +108,7 @@
                         \ -nv --no-verbosity
                         \ -o --output
                         \ -o --output-file
-                        \ -orig --berkeley
-                        \ -orig --berkeley-style
-                        \ -orig --original
-                        \ -orig --original-style
+                        \ -orig --berkeley --berkeley-style --original --original-style
                         \ -pcs --space-after-procedure-calls
                         \ -pmt --preserve-mtime
                         \ -prs --space-after-parentheses
@@ -118,37 +124,6 @@
                         \ -v --verbose
                         \ -version --version
 
-syn keyword indentOptions -bli --brace-indent
-                        \ -c --comment-indentation
-                        \ -bli --brace-indent
-                        \ -c --comment-indentation
-                        \ -cbi --case-brace-indentation
-                        \ -cd --declaration-comment-column
-                        \ -ci --continuation-indentation
-                        \ -cli --case-indentation
-                        \ -cp --else-endif-column
-                        \ -d --line-comments-indentation
-                        \ -di --declaration-indentation
-                        \ -i --indent-level
-                        \ -ip --parameter-indentation
-                        \ -l --line-length
-                        \ -lc --comment-line-length
-                        \ -pi --paren-indentation
-                        \ -ppi --preprocessor-indentation
-                        \ -sbi --struct-brace-indentation
-                        \ -ts --tab-size
-                        \ nextgroup=indenNumber skipwhite
-if !exists("indent_is_bsd")
-  syn keyword indentOptions -i --indentation-level
-                          \ nextgroup=indentNumber skipwhite
-endif
-
-syn match   indentNumber  display '\<\d\+\>'
-
-syn keyword indentOptions -T nextgroup=indentIdent skipwhite
-
-syn match   indentIdent   display '\<\h\w*\>'
-
 if exists("indent_is_bsd")
   syn keyword indentOptions -ip -nip -dj -ndj -ei -nei
 endif
diff --git a/runtime/syntax/udevrules.vim b/runtime/syntax/udevrules.vim
index 2dca878..b04d728 100644
--- a/runtime/syntax/udevrules.vim
+++ b/runtime/syntax/udevrules.vim
@@ -1,7 +1,7 @@
 " Vim syntax file
 " Language:         udev(8) rules file
 " Maintainer:       Nikolai Weibull <now@bitwi.se>
-" Latest Revision:  2006-04-19
+" Latest Revision:  2006-12-18
 
 if exists("b:current_syntax")
   finish
@@ -10,21 +10,26 @@
 let s:cpo_save = &cpo
 set cpo&vim
 
+" TODO: Line continuations.
+
 syn keyword udevrulesTodo       contained TODO FIXME XXX NOTE
 
 syn region  udevrulesComment    display oneline start='^\s*#' end='$'
                                 \ contains=udevrulesTodo,@Spell
 
-syn keyword udevrulesRuleKey    BUS KERNEL SUBSYSTEM DRIVER ID RESULT
-                                \ nextgroup=udevrulesRuleEq
+syn keyword udevrulesRuleKey    ACTION DEVPATH KERNEL SUBSYSTEM KERNELS
+                                \ SUBSYSTEMS DRIVERS RESULT
+                                \ nextgroup=udevrulesRuleTest
+                                \ skipwhite
 
-syn keyword udevrulesRuleKey    SYSFS nextgroup=udevrulesSysFSPath
+syn keyword udevrulesRuleKey    ATTRS nextgroup=udevrulesAttrsPath
 
-syn region  udevrulesSysFSPath  display transparent
+syn region  udevrulesAttrsPath  display transparent
                                 \ matchgroup=udevrulesDelimiter start='{'
                                 \ matchgroup=udevrulesDelimiter end='}'
                                 \ contains=udevrulesPath
-                                \ nextgroup=udevrulesRuleEq
+                                \ nextgroup=udevrulesRuleTest
+                                \ skipwhite
 
 syn keyword udevrulesRuleKey    ENV nextgroup=udevrulesEnvVar
 
@@ -32,16 +37,42 @@
                                 \ matchgroup=udevrulesDelimiter start='{'
                                 \ matchgroup=udevrulesDelimiter end='}'
                                 \ contains=udevrulesVariable
-                                \ nextgroup=udevrulesRuleEq
+                                \ nextgroup=udevrulesRuleTest,udevrulesRuleEq
+                                \ skipwhite
 
-syn keyword udevrulesRuleKey    PROGRAM
+syn keyword udevrulesRuleKey    PROGRAM RESULT
+                                \ nextgroup=udevrulesEStringTest,udevrulesEStringEq
+                                \ skipwhite
+
+syn keyword udevrulesAssignKey  NAME SYMLINK OWNER GROUP RUN
                                 \ nextgroup=udevrulesEStringEq
+                                \ skipwhite
 
-syn keyword udevrulesAssignKey  NAME SYMLINK OWNER GROUP
-                                \ nextgroup=udevrulesEStringEq
-
-syn keyword udevrulesAssignKey  MODE
+syn keyword udevrulesAssignKey  MODE LABEL GOTO WAIT_FOR_SYSFS
                                 \ nextgroup=udevrulesRuleEq
+                                \ skipwhite
+
+syn keyword udevrulesAssignKey  ATTR nextgroup=udevrulesAttrsPath
+
+syn region  udevrulesAttrKey    display transparent
+                                \ matchgroup=udevrulesDelimiter start='{'
+                                \ matchgroup=udevrulesDelimiter end='}'
+                                \ contains=udevrulesKey
+                                \ nextgroup=udevrulesRuleEq
+                                \ skipwhite
+
+syn keyword udevrulesAssignKey  IMPORT nextgroup=udevrulesImport,
+                                \ udevrulesEStringEq
+                                \ skipwhite
+
+syn region  udevrulesImport     display transparent
+                                \ matchgroup=udevrulesDelimiter start='{'
+                                \ matchgroup=udevrulesDelimiter end='}'
+                                \ contains=udevrulesImportType
+                                \ nextgroup=udevrulesEStringEq
+                                \ skipwhite
+
+syn keyword udevrulesImportType program file parent
 
 syn keyword udevrulesAssignKey  OPTIONS
                                 \ nextgroup=udevrulesOptionsEq
@@ -50,28 +81,48 @@
 
 syn match   udevrulesVariable   contained display '[^}]\+'
 
-syn match   udevrulesRuleEq     contained '[[:space:]=]'
+syn match   udevrulesRuleTest   contained display '[=!:]='
                                 \ nextgroup=udevrulesString skipwhite
 
-syn match   udevrulesEStringEq  contained '[[:space:]=]'
+syn match   udevrulesEStringTest contained display '[=!+:]='
                                 \ nextgroup=udevrulesEString skipwhite
 
-syn match   udevrulesOptionsEq  contained '[[:space:]=]'
+syn match   udevrulesRuleEq     contained display '+=\|=\ze[^=]'
+                                \ nextgroup=udevrulesString skipwhite
+
+syn match   udevrulesEStringEq  contained '+=\|=\ze[^=]'
+                                \ nextgroup=udevrulesEString skipwhite
+
+syn match   udevrulesOptionsEq  contained '+=\|=\ze[^=]'
                                 \ nextgroup=udevrulesOptions skipwhite
 
 syn region  udevrulesEString    contained display oneline start=+"+ end=+"+
-                                \ contains=udevrulesStrEscapes
+                                \ contains=udevrulesStrEscapes,udevrulesStrVars
 
-syn match   udevrulesStrEscapes contained '%[nkpMmbcNPe%]'
+syn match   udevrulesStrEscapes contained '%[knpbMmcPrN%]'
 
+" TODO: This can actually stand alone (without {…}), so add a nextgroup here.
 syn region  udevrulesStrEscapes contained start='%c{' end='}'
                                 \ contains=udevrulesStrNumber
 
 syn region  udevrulesStrEscapes contained start='%s{' end='}'
                                 \ contains=udevrulesPath
 
+syn region  udevrulesStrEscapes contained start='%E{' end='}'
+                                \ contains=udevrulesVariable
+
 syn match   udevrulesStrNumber  contained '\d\++\='
 
+syn match   udevrulesStrVars    contained display '$\%(kernel\|number\|devpath\|id\|major\|minor\|result\|parent\|root\|tempnode\)\>'
+
+syn region  udevrulesStrVars    contained start='$attr{' end='}'
+                                \ contains=udevrulesPath
+
+syn region  udevrulesStrVars    contained start='$env{' end='}'
+                                \ contains=udevrulesVariable
+
+syn match   udevrulesStrVars    contained display '\$\$'
+
 syn region  udevrulesString     contained display oneline start=+"+ end=+"+
                                 \ contains=udevrulesPattern
 
@@ -96,6 +147,7 @@
 hi def link udevrulesAssignKey  Identifier
 hi def link udevrulesPath       Identifier
 hi def link udevrulesVariable   Identifier
+hi def link udevrulesAttrKey    Identifier
 " XXX: setting this to Operator makes for extremely intense highlighting.
 hi def link udevrulesEq         Normal
 hi def link udevrulesRuleEq     udevrulesEq
@@ -104,12 +156,14 @@
 hi def link udevrulesEString    udevrulesString
 hi def link udevrulesStrEscapes SpecialChar
 hi def link udevrulesStrNumber  Number
+hi def link udevrulesStrVars    Identifier
 hi def link udevrulesString     String
 hi def link udevrulesPattern    SpecialChar
 hi def link udevrulesPatRange   SpecialChar
 hi def link udevrulesOptions    udevrulesString
 hi def link udevrulesOption     Type
 hi def link udevrulesOptionSep  Delimiter
+hi def link udevrulesImportType Type
 
 let b:current_syntax = "udevrules"