updated for version 7.1a
diff --git a/runtime/syntax/zsh.vim b/runtime/syntax/zsh.vim
index 83763a6..761e3ac 100644
--- a/runtime/syntax/zsh.vim
+++ b/runtime/syntax/zsh.vim
@@ -1,118 +1,194 @@
 " Vim syntax file
-" Language:	Z shell (zsh)
-" Maintainer:	Felix von Leitner <leitner@math.fu-berlin.de>
-" Heavily based on sh.vim by Lennart Schultz
-" Last Change:	2003 May 11
+" Language:         Zsh shell script
+" Maintainer:       Nikolai Weibull <now@bitwi.se>
+" Latest Revision:  2006-08-06
 
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
-  syntax clear
-elseif exists("b:current_syntax")
+if exists("b:current_syntax")
   finish
 endif
 
-" String and Character contstants
-" Highlight special characters (those which have a backslash) differently
-syn match   zshSpecial	"\\\d\d\d\|\\[abcfnrtv\\']"
-syn region	zshSinglequote	start=+'+ skip=+\\'+ end=+'+
-" A bunch of useful zsh keywords
-" syn keyword	zshFunction	function
-syn keyword	zshStatement	bg break cd chdir continue echo eval exec
-syn keyword	zshStatement	exit export fg getopts hash jobs kill
-syn keyword	zshStatement	pwd read readonly return set zshift function
-syn keyword	zshStatement	stop suspend test times trap type ulimit
-syn keyword	zshStatement	umask unset wait setopt compctl source
-syn keyword	zshStatement	whence disown shift which unhash unalias
-syn keyword	zshStatement	alias functions unfunction getln disable
-syn keyword	zshStatement	vared getopt enable unsetopt autoload
-syn keyword	zshStatement	bindkey pushln command limit unlimit fc
-syn keyword	zshStatement	print builtin noglob sched r time
-syn keyword	zshStatement	typeset declare local integer
+let s:cpo_save = &cpo
+set cpo&vim
 
-syn keyword	zshConditional	if else esac case then elif fi in
-syn keyword	zshRepeat	while for do done
+setlocal iskeyword=@,48-57,_,-
 
-" Following is worth to notice: command substitution, file redirection and functions (so these features turns red)
-syn match	zshFunctionName	"\h\w*\s*()"
-syn region	zshCommandSub	start=+`+ skip=+\\`+ end=+`+
-" contains=ALLBUT,zshFunction
-syn match	zshRedir	"\d\=\(<\|<<\|>\|>>\)\(|\|&\d\)\="
+syn keyword zshTodo             contained TODO FIXME XXX NOTE
 
-syn keyword	zshTodo contained TODO
+syn region  zshComment          display oneline start='\%(^\|\s\)#' end='$'
+                                \ contains=zshTodo,@Spell
 
-syn keyword	zshShellVariables	USER LOGNAME HOME PATH CDPATH SHELL
-syn keyword	zshShellVariables	LC_TYPE LC_MESSAGE MAIL MAILCHECK
-syn keyword	zshShellVariables	PS1 PS2 IFS EGID EUID ERRNO GID UID
-syn keyword	zshShellVariables	HOST LINENO MACHTYPE OLDPWD OPTARG
-syn keyword	zshShellVariables	OPTIND OSTYPE PPID PWD RANDOM SECONDS
-syn keyword	zshShellVariables	SHLVL TTY signals TTYIDLE USERNAME
-syn keyword	zshShellVariables	VENDOR ZSH_NAME ZSH_VERSION ARGV0
-syn keyword	zshShellVariables	BAUD COLUMNS cdpath DIRSTACKSIZE
-syn keyword	zshShellVariables	FCEDIT fignore fpath histchars HISTCHARS
-syn keyword	zshShellVariables	HISTFILE HISTSIZE KEYTIMEOUT LANG
-syn keyword	zshShellVariables	LC_ALL LC_COLLATE LC_CTYPE LC_MESSAGES
-syn keyword	zshShellVariables	LC_TIME LINES LISTMAX LOGCHECK mailpath
-syn keyword	zshShellVariables	MAILPATH MANPATH manpath module_path
-syn keyword	zshShellVariables	MODULE_PATH NULLCMD path POSTEDIT
-syn keyword	zshShellVariables	PS3 PS4 PROMPT PROMPT2 PROMPT3 PROMPT4
-syn keyword	zshShellVariables	psvar PSVAR prompt READNULLCMD
-syn keyword	zshShellVariables	REPORTTIME RPROMPT RPS1 SAVEHIST
-syn keyword	zshShellVariables	SPROMPT STTY TIMEFMT TMOUT TMPPREFIX
-syn keyword	zshShellVariables	watch WATCH WATCHFMT WORDCHARS ZDOTDIR
-syn match	zshSpecialShellVar	"\$[-#@*$?!0-9]"
-syn keyword	zshSetVariables		ignoreeof noclobber
-syn region	zshDerefOpr	start="\${" end="}" contains=zshShellVariables
-syn match	zshDerefIdentifier	"\$[a-zA-Z_][a-zA-Z0-9_]*\>"
-syn match	zshOperator		"[][}{&;|)(]"
+syn match   zshPreProc          '^\%1l#\%(!\|compdef\|autoload\).*$'
 
+syn match   zshQuoted           '\\.'
+syn region  zshString           matchgroup=zshStringDelimiter start=+"+ end=+"+
+                                \ contains=zshQuoted,@zshDerefs,@zshSubst
+syn region  zshString           matchgroup=zshStringDelimiter start=+'+ end=+'+
+" XXX: This should probably be more precise, but Zsh seems a bit confused about it itself
+syn region  zshPOSIXString      matchgroup=zshStringDelimiter start=+\$'+
+                                \ end=+'+ contains=zshQuoted
+syn match   zshJobSpec          '%\(\d\+\|?\=\w\+\|[%+-]\)'
 
+syn keyword zshPrecommand       noglob nocorrect exec command builtin - time
 
-syn match  zshNumber		"-\=\<\d\+\>"
-syn match  zshComment	"#.*$" contains=zshNumber,zshTodo
+syn keyword zshDelimiter        do done
 
+syn keyword zshConditional      if then elif else fi case in esac select
 
-syn match zshTestOpr	"-\<[oeaznlg][tfqet]\=\>\|!\==\|-\<[b-gkLprsStuwjxOG]\>"
-"syn region zshTest	      start="\[" skip="\\$" end="\]" contains=zshString,zshTestOpr,zshDerefIdentifier,zshDerefOpr
-syn region  zshString	start=+"+  skip=+\\"+  end=+"+  contains=zshSpecial,zshOperator,zshDerefIdentifier,zshDerefOpr,zshSpecialShellVar,zshSinglequote,zshCommandSub
+syn keyword zshRepeat           for while until repeat foreach
 
-" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_zsh_syntax_inits")
-  if version < 508
-    let did_zsh_syntax_inits = 1
-    command -nargs=+ HiLink hi link <args>
-  else
-    command -nargs=+ HiLink hi def link <args>
-  endif
+syn keyword zshException        always
 
-  HiLink zshSinglequote		zshString
-  HiLink zshConditional		zshStatement
-  HiLink zshRepeat		zshStatement
-  HiLink zshFunctionName	zshFunction
-  HiLink zshCommandSub		zshOperator
-  HiLink zshRedir		zshOperator
-  HiLink zshSetVariables	zshShellVariables
-  HiLink zshSpecialShellVar	zshShellVariables
-  HiLink zshTestOpr		zshOperator
-  HiLink zshDerefOpr		zshSpecial
-  HiLink zshDerefIdentifier	zshShellVariables
-  HiLink zshOperator		Operator
-  HiLink zshStatement		Statement
-  HiLink zshNumber		Number
-  HiLink zshString		String
-  HiLink zshComment		Comment
-  HiLink zshSpecial		Special
-  HiLink zshTodo		Todo
-  HiLink zshShellVariables	Special
-"  hi zshOperator		term=underline ctermfg=6 guifg=Purple gui=bold
-"  hi zshShellVariables	term=underline ctermfg=2 guifg=SeaGreen gui=bold
-"  hi zshFunction		term=bold ctermbg=1 guifg=Red
+syn keyword zshKeyword          function nextgroup=zshKSHFunction skipwhite
 
-  delcommand HiLink
+syn match   zshKSHFunction      contained '\k\+'
+syn match   zshFunction         '^\s*\k\+\ze\s*()'
+
+syn match   zshOperator         '||\|&&\|;\|&!\='
+
+syn match   zshRedir            '\d\=\(<\|<>\|<<<\|<&\s*[0-9p-]\=\)'
+syn match   zshRedir            '\d\=\(>\|>>\|>&\s*[0-9p-]\=\|&>\|>>&\|&>>\)[|!]\='
+syn match   zshRedir            '|&\='
+
+syn region  zshHereDoc          matchgroup=zshRedir start='<<\s*\z(\S*\)'
+                                \ end='^\z1\>' contains=@zshSubst
+syn region  zshHereDoc          matchgroup=zshRedir start='<<-\s*\z(\S*\)'
+                                \ end='^\s*\z1\>' contains=@zshSubst
+syn region  zshHereDoc          matchgroup=zshRedir
+                                \ start=+<<\s*\(["']\)\z(\S*\)\1+  end='^\z1\>'
+syn region  zshHereDoc          matchgroup=zshRedir
+                                \ start=+<<-\s*\(["']\)\z(\S*\)\1+
+                                \ end='^\s*\z1\>'
+
+syn match   zshVariable         '\<\h\w*\ze+\=='
+" XXX: how safe is this?
+syn region  zshVariable         oneline
+                                \ start='\$\@<!\<\h\w*\[' end='\]\ze+\=='
+                                \ contains=@zshSubst
+
+syn cluster zshDerefs           contains=zshShortDeref,zshLongDeref,zshDeref
+
+if !exists("g:zsh_syntax_variables")
+  let s:zsh_syntax_variables = 'all'
+else
+  let s:zsh_syntax_variables = g:zsh_syntax_variables
 endif
 
+if s:zsh_syntax_variables =~ 'short\|all'
+  syn match zshShortDeref       '\$[!#$*@?_-]\w\@!'
+  syn match zshShortDeref       '\$[=^~]*[#+]*\d\+\>'
+endif
+
+if s:zsh_syntax_variables =~ 'long\|all'
+  syn match zshLongDeref        '\$\%(ARGC\|argv\|status\|pipestatus\|CPUTYPE\|EGID\|EUID\|ERRNO\|GID\|HOST\|LINENO\|LOGNAME\)'
+  syn match zshLongDeref        '\$\%(MACHTYPE\|OLDPWD OPTARG\|OPTIND\|OSTYPE\|PPID\|PWD\|RANDOM\|SECONDS\|SHLVL\|signals\)'
+  syn match zshLongDeref        '\$\%(TRY_BLOCK_ERROR\|TTY\|TTYIDLE\|UID\|USERNAME\|VENDOR\|ZSH_NAME\|ZSH_VERSION\|REPLY\|reply\|TERM\)'
+endif
+
+if s:zsh_syntax_variables =~ 'all'
+  syn match zshDeref            '\$[=^~]*[#+]*\h\w*\>'
+else
+  syn match zshDeref            transparent '\$[=^~]*[#+]*\h\w*\>'
+endif
+
+syn match   zshCommands         '\%(^\|\s\)[.:]\ze\s'
+syn keyword zshCommands         alias autoload bg bindkey break bye cap cd
+                                \ chdir clone comparguments compcall compctl
+                                \ compdescribe compfiles compgroups compquote
+                                \ comptags comptry compvalues continue dirs
+                                \ disable disown echo echotc echoti emulate
+                                \ enable eval exec exit export false fc fg
+                                \ functions getcap getln getopts hash history
+                                \ jobs kill let limit log logout popd print
+                                \ printf pushd pushln pwd r read readonly
+                                \ rehash return sched set setcap setopt shift
+                                \ source stat suspend test times trap true
+                                \ ttyctl type ulimit umask unalias unfunction
+                                \ unhash unlimit unset unsetopt vared wait
+                                \ whence where which zcompile zformat zftp zle
+                                \ zmodload zparseopts zprof zpty zregexparse
+                                \ zsocket zstyle ztcp
+
+syn keyword zshTypes            float integer local typeset declare
+
+" XXX: this may be too much
+" syn match   zshSwitches         '\s\zs--\=[a-zA-Z0-9-]\+'
+
+syn match   zshNumber           '[+-]\=\<\d\+\>'
+syn match   zshNumber           '[+-]\=\<0x\x\+\>'
+syn match   zshNumber           '[+-]\=\<0\o\+\>'
+syn match   zshNumber           '[+-]\=\d\+#[-+]\=\w\+\>'
+syn match   zshNumber           '[+-]\=\d\+\.\d\+\>'
+
+syn cluster zshSubst            contains=zshSubst,zshOldSubst,zshMathSubst
+syn region  zshSubst            matchgroup=zshSubstDelim transparent
+                                \ start='\$(' skip='\\)' end=')' contains=TOP
+syn region  zshParentheses      transparent start='(' skip='\\)' end=')'
+syn region  zshMathSubst        matchgroup=zshSubstDelim transparent
+                                \ start='\$((' skip='\\)'
+                                \ matchgroup=zshSubstDelim end='))'
+                                \ contains=zshParentheses,@zshSubst,zshNumber,
+                                \ @zshDerefs,zshString
+syn region  zshBrackets         contained transparent start='{' skip='\\}'
+                                \ end='}'
+syn region  zshSubst            matchgroup=zshSubstDelim start='\${' skip='\\}'
+                                \ end='}' contains=@zshSubst,zshBrackets,zshQuoted
+syn region  zshOldSubst         matchgroup=zshSubstDelim start=+`+ skip=+\\`+
+                                \ end=+`+ contains=TOP,zshOldSubst
+
+hi def link zshTodo             Todo
+hi def link zshComment          Comment
+hi def link zshPreProc          PreProc
+hi def link zshQuoted           SpecialChar
+hi def link zshString           String
+hi def link zshStringDelimiter  zshString
+hi def link zshPOSIXString      zshString
+hi def link zshJobSpec          Special
+hi def link zshPrecommand       Special
+hi def link zshDelimiter        Keyword
+hi def link zshConditional      Conditional
+hi def link zshException        Exception
+hi def link zshRepeat           Repeat
+hi def link zshKeyword          Keyword
+hi def link zshFunction         None
+hi def link zshKSHFunction      zshFunction
+hi def link zshHereDoc          String
+if 0
+  hi def link zshOperator         Operator
+else
+  hi def link zshOperator         None
+endif
+if 1
+  hi def link zshRedir            Operator
+else
+  hi def link zshRedir            None
+endif
+hi def link zshVariable         None
+hi def link zshDereferencing    PreProc
+if s:zsh_syntax_variables =~ 'short\|all'
+  hi def link zshShortDeref     zshDereferencing
+else
+  hi def link zshShortDeref     None
+endif
+if s:zsh_syntax_variables =~ 'long\|all'
+  hi def link zshLongDeref      zshDereferencing
+else
+  hi def link zshLongDeref      None
+endif
+if s:zsh_syntax_variables =~ 'all'
+  hi def link zshDeref          zshDereferencing
+else
+  hi def link zshDeref          None
+endif
+hi def link zshCommands         Keyword
+hi def link zshTypes            Type
+hi def link zshSwitches         Special
+hi def link zshNumber           Number
+hi def link zshSubst            PreProc
+hi def link zshMathSubst        zshSubst
+hi def link zshOldSubst         zshSubst
+hi def link zshSubstDelim       zshSubst
+
 let b:current_syntax = "zsh"
 
-" vim: ts=8
+let &cpo = s:cpo_save
+unlet s:cpo_save