2 " Language: Zsh shell script
3 " Maintainer: Nikolai Weibull <now@bitwi.se>
4 " Latest Revision: 2008-07-17
6 if exists("b:current_syntax")
15 syn keyword zshTodo contained TODO FIXME XXX NOTE
17 syn region zshComment display oneline start='\%(^\|\s\)#' end='$'
18 \ contains=zshTodo,@Spell
20 syn match zshPreProc '^\%1l#\%(!\|compdef\|autoload\).*$'
22 syn match zshQuoted '\\.'
23 syn region zshString matchgroup=zshStringDelimiter start=+"+ end=+"+
24 \ contains=zshQuoted,@zshDerefs,@zshSubst
25 syn region zshString matchgroup=zshStringDelimiter start=+'+ end=+'+
26 " XXX: This should probably be more precise, but Zsh seems a bit confused about it itself
27 syn region zshPOSIXString matchgroup=zshStringDelimiter start=+\$'+
28 \ end=+'+ contains=zshQuoted
29 syn match zshJobSpec '%\(\d\+\|?\=\w\+\|[%+-]\)'
31 syn keyword zshPrecommand noglob nocorrect exec command builtin - time
33 syn keyword zshDelimiter do done
35 syn keyword zshConditional if then elif else fi case in esac select
37 syn keyword zshRepeat while until repeat
39 syn keyword zshRepeat for foreach nextgroup=zshVariable skipwhite
41 syn keyword zshException always
43 syn keyword zshKeyword function nextgroup=zshKSHFunction skipwhite
45 syn match zshKSHFunction contained '\k\+'
46 syn match zshFunction '^\s*\k\+\ze\s*()'
48 syn match zshOperator '||\|&&\|;\|&!\='
50 syn match zshRedir '\d\=\(<\|<>\|<<<\|<&\s*[0-9p-]\=\)'
51 syn match zshRedir '\d\=\(>\|>>\|>&\s*[0-9p-]\=\|&>\|>>&\|&>>\)[|!]\='
52 syn match zshRedir '|&\='
54 syn region zshHereDoc matchgroup=zshRedir
55 \ start='<\@<!<<\s*\z([^<]\S*\)'
58 syn region zshHereDoc matchgroup=zshRedir
59 \ start='<\@<!<<\s*\\\z(\S\+\)'
62 syn region zshHereDoc matchgroup=zshRedir
63 \ start='<\@<!<<-\s*\\\=\z(\S\+\)'
66 syn region zshHereDoc matchgroup=zshRedir
67 \ start=+<\@<!<<\s*\(["']\)\z(\S\+\)\1+
69 syn region zshHereDoc matchgroup=zshRedir
70 \ start=+<\@<!<<-\s*\(["']\)\z(\S\+\)\1+
73 syn match zshVariable '\<\h\w*' contained
75 syn match zshVariableDef '\<\h\w*\ze+\=='
76 " XXX: how safe is this?
77 syn region zshVariableDef oneline
78 \ start='\$\@<!\<\h\w*\[' end='\]\ze+\=='
81 syn cluster zshDerefs contains=zshShortDeref,zshLongDeref,zshDeref
83 if !exists("g:zsh_syntax_variables")
84 let s:zsh_syntax_variables = 'all'
86 let s:zsh_syntax_variables = g:zsh_syntax_variables
89 if s:zsh_syntax_variables =~ 'short\|all'
90 syn match zshShortDeref '\$[!#$*@?_-]\w\@!'
91 syn match zshShortDeref '\$[=^~]*[#+]*\d\+\>'
94 if s:zsh_syntax_variables =~ 'long\|all'
95 syn match zshLongDeref '\$\%(ARGC\|argv\|status\|pipestatus\|CPUTYPE\|EGID\|EUID\|ERRNO\|GID\|HOST\|LINENO\|LOGNAME\)'
96 syn match zshLongDeref '\$\%(MACHTYPE\|OLDPWD OPTARG\|OPTIND\|OSTYPE\|PPID\|PWD\|RANDOM\|SECONDS\|SHLVL\|signals\)'
97 syn match zshLongDeref '\$\%(TRY_BLOCK_ERROR\|TTY\|TTYIDLE\|UID\|USERNAME\|VENDOR\|ZSH_NAME\|ZSH_VERSION\|REPLY\|reply\|TERM\)'
100 if s:zsh_syntax_variables =~ 'all'
101 syn match zshDeref '\$[=^~]*[#+]*\h\w*\>'
103 syn match zshDeref transparent contains=NONE '\$[=^~]*[#+]*\h\w*\>'
106 syn match zshCommands '\%(^\|\s\)[.:]\ze\s'
107 syn keyword zshCommands alias autoload bg bindkey break bye cap cd
108 \ chdir clone comparguments compcall compctl
109 \ compdescribe compfiles compgroups compquote
110 \ comptags comptry compvalues continue dirs
111 \ disable disown echo echotc echoti emulate
112 \ enable eval exec exit export false fc fg
113 \ functions getcap getln getopts hash history
114 \ jobs kill let limit log logout popd print
115 \ printf pushd pushln pwd r read readonly
116 \ rehash return sched set setcap setopt shift
117 \ source stat suspend test times trap true
118 \ ttyctl type ulimit umask unalias unfunction
119 \ unhash unlimit unset unsetopt vared wait
120 \ whence where which zcompile zformat zftp zle
121 \ zmodload zparseopts zprof zpty zregexparse
122 \ zsocket zstyle ztcp
124 syn keyword zshTypes float integer local typeset declare
126 " XXX: this may be too much
127 " syn match zshSwitches '\s\zs--\=[a-zA-Z0-9-]\+'
129 syn match zshNumber '[+-]\=\<\d\+\>'
130 syn match zshNumber '[+-]\=\<0x\x\+\>'
131 syn match zshNumber '[+-]\=\<0\o\+\>'
132 syn match zshNumber '[+-]\=\d\+#[-+]\=\w\+\>'
133 syn match zshNumber '[+-]\=\d\+\.\d\+\>'
135 " TODO: $[...] is the same as $((...)), so add that as well.
136 syn cluster zshSubst contains=zshSubst,zshOldSubst,zshMathSubst
137 syn region zshSubst matchgroup=zshSubstDelim transparent
138 \ start='\$(' skip='\\)' end=')' contains=TOP
139 syn region zshParentheses transparent start='(' skip='\\)' end=')'
140 syn region zshMathSubst matchgroup=zshSubstDelim transparent
141 \ start='\$((' skip='\\)'
142 \ matchgroup=zshSubstDelim end='))'
143 \ contains=zshParentheses,@zshSubst,zshNumber,
144 \ @zshDerefs,zshString
145 syn region zshBrackets contained transparent start='{' skip='\\}'
147 syn region zshSubst matchgroup=zshSubstDelim start='\${' skip='\\}'
148 \ end='}' contains=@zshSubst,zshBrackets,zshQuoted,zshString
149 syn region zshOldSubst matchgroup=zshSubstDelim start=+`+ skip=+\\`+
150 \ end=+`+ contains=TOP,zshOldSubst
153 syn sync match zshHereDocSync grouphere NONE '<<-\=\s*\%(\\\=\S\+\|\(["']\)\S\+\1\)'
154 syn sync match zshHereDocEndSync groupthere NONE '^\s*EO\a\+\>'
156 hi def link zshTodo Todo
157 hi def link zshComment Comment
158 hi def link zshPreProc PreProc
159 hi def link zshQuoted SpecialChar
160 hi def link zshString String
161 hi def link zshStringDelimiter zshString
162 hi def link zshPOSIXString zshString
163 hi def link zshJobSpec Special
164 hi def link zshPrecommand Special
165 hi def link zshDelimiter Keyword
166 hi def link zshConditional Conditional
167 hi def link zshException Exception
168 hi def link zshRepeat Repeat
169 hi def link zshKeyword Keyword
170 hi def link zshFunction None
171 hi def link zshKSHFunction zshFunction
172 hi def link zshHereDoc String
174 hi def link zshOperator Operator
176 hi def link zshOperator None
179 hi def link zshRedir Operator
181 hi def link zshRedir None
183 hi def link zshVariable None
184 hi def link zshVariableDef zshVariable
185 hi def link zshDereferencing PreProc
186 if s:zsh_syntax_variables =~ 'short\|all'
187 hi def link zshShortDeref zshDereferencing
189 hi def link zshShortDeref None
191 if s:zsh_syntax_variables =~ 'long\|all'
192 hi def link zshLongDeref zshDereferencing
194 hi def link zshLongDeref None
196 if s:zsh_syntax_variables =~ 'all'
197 hi def link zshDeref zshDereferencing
199 hi def link zshDeref None
201 hi def link zshCommands Keyword
202 hi def link zshTypes Type
203 hi def link zshSwitches Special
204 hi def link zshNumber Number
205 hi def link zshSubst PreProc
206 hi def link zshMathSubst zshSubst
207 hi def link zshOldSubst zshSubst
208 hi def link zshSubstDelim zshSubst
210 let b:current_syntax = "zsh"
212 let &cpo = s:cpo_save