1" Vim syntax file
2" Language:             Zsh shell script
3" Maintainer:           Christian Brabandt <cb@256bit.org>
4" Previous Maintainer:  Nikolai Weibull <now@bitwi.se>
5" Latest Revision:      2020-11-21
6" License:              Vim (see :h license)
7" Repository:           https://github.com/chrisbra/vim-zsh
8
9if exists("b:current_syntax")
10  finish
11endif
12
13let s:cpo_save = &cpo
14set cpo&vim
15
16function! s:ContainedGroup()
17  " needs 7.4.2008 for execute() function
18  let result='TOP'
19    " vim-pandoc syntax defines the @langname cluster for embedded syntax languages
20    " However, if no syntax is defined yet, `syn list @zsh` will return
21    " "No syntax items defined", so make sure the result is actually a valid syn cluster
22    for cluster in ['markdownHighlightzsh', 'zsh']
23      try
24      " markdown syntax defines embedded clusters as @markdownhighlight<lang>,
25      " pandoc just uses @<lang>, so check both for both clusters
26        let a=split(execute('syn list @'. cluster), "\n")
27        if len(a) == 2 && a[0] =~# '^---' && a[1] =~? cluster
28          return  '@'. cluster
29        endif
30      catch /E392/
31        " ignore
32      endtry
33    endfor
34    return result
35endfunction
36
37let s:contained=s:ContainedGroup()
38
39syn iskeyword @,48-57,_,192-255,#,-
40if get(g:, 'zsh_fold_enable', 0)
41    setlocal foldmethod=syntax
42endif
43
44syn match   zshPOSIXQuoted      '\\[xX][0-9a-fA-F]\{1,2}'
45syn match   zshPOSIXQuoted      '\\[0-7]\{1,3}'
46syn match   zshPOSIXQuoted      '\\u[0-9a-fA-F]\{1,4}'
47syn match   zshPOSIXQuoted      '\\U[1-9a-fA-F]\{1,8}'
48syn match   zshQuoted           '\\.'
49syn region  zshString           matchgroup=zshStringDelimiter start=+"+ end=+"+
50                                \ contains=zshQuoted,@zshDerefs,@zshSubst fold
51syn region  zshString           matchgroup=zshStringDelimiter start=+'+ end=+'+ fold
52syn region  zshPOSIXString      matchgroup=zshStringDelimiter start=+\$'+
53                                \ skip=+\\[\\']+ end=+'+ contains=zshPOSIXQuoted,zshQuoted
54syn match   zshJobSpec          '%\(\d\+\|?\=\w\+\|[%+-]\)'
55
56syn keyword zshPrecommand       noglob nocorrect exec command builtin - time
57
58syn keyword zshDelimiter        do done end
59
60syn keyword zshConditional      if then elif else fi case in esac select
61
62syn keyword zshRepeat           while until repeat
63
64syn keyword zshRepeat           for foreach nextgroup=zshVariable skipwhite
65
66syn keyword zshException        always
67
68syn keyword zshKeyword          function nextgroup=zshKSHFunction skipwhite
69
70syn match   zshKSHFunction      contained '\w\S\+'
71syn match   zshFunction         '^\s*\k\+\ze\s*()'
72
73syn match   zshOperator         '||\|&&\|;\|&!\='
74
75syn match   zshRedir            '\d\=\(<\|<>\|<<<\|<&\s*[0-9p-]\=\)'
76syn match   zshRedir            '\d\=\(>\|>>\|>&\s*[0-9p-]\=\|&>\|>>&\|&>>\)[|!]\='
77syn match   zshRedir            '|&\='
78
79syn region  zshHereDoc          matchgroup=zshRedir
80                                \ start='<\@<!<<\s*\z([^<]\S*\)'
81                                \ end='^\z1\>'
82                                \ contains=@zshSubst,@zshDerefs,zshQuoted,zshPOSIXString
83syn region  zshHereDoc          matchgroup=zshRedir
84                                \ start='<\@<!<<\s*\\\z(\S\+\)'
85                                \ end='^\z1\>'
86                                \ contains=@zshSubst,@zshDerefs,zshQuoted,zshPOSIXString
87syn region  zshHereDoc          matchgroup=zshRedir
88                                \ start='<\@<!<<-\s*\\\=\z(\S\+\)'
89                                \ end='^\s*\z1\>'
90                                \ contains=@zshSubst,@zshDerefs,zshQuoted,zshPOSIXString
91syn region  zshHereDoc          matchgroup=zshRedir
92                                \ start=+<\@<!<<\s*\(["']\)\z(\S\+\)\1+
93                                \ end='^\z1\>'
94syn region  zshHereDoc          matchgroup=zshRedir
95                                \ start=+<\@<!<<-\s*\(["']\)\z(\S\+\)\1+
96                                \ end='^\s*\z1\>'
97
98syn match   zshVariable         '\<\h\w*' contained
99
100syn match   zshVariableDef      '\<\h\w*\ze+\=='
101" XXX: how safe is this?
102syn region  zshVariableDef      oneline
103                                \ start='\$\@<!\<\h\w*\[' end='\]\ze+\?=\?'
104                                \ contains=@zshSubst
105
106syn cluster zshDerefs           contains=zshShortDeref,zshLongDeref,zshDeref,zshDollarVar
107
108syn match zshShortDeref       '\$[!#$*@?_-]\w\@!'
109syn match zshShortDeref       '\$[=^~]*[#+]*\d\+\>'
110
111syn match zshLongDeref        '\$\%(ARGC\|argv\|status\|pipestatus\|CPUTYPE\|EGID\|EUID\|ERRNO\|GID\|HOST\|LINENO\|LOGNAME\)'
112syn match zshLongDeref        '\$\%(MACHTYPE\|OLDPWD OPTARG\|OPTIND\|OSTYPE\|PPID\|PWD\|RANDOM\|SECONDS\|SHLVL\|signals\)'
113syn match zshLongDeref        '\$\%(TRY_BLOCK_ERROR\|TTY\|TTYIDLE\|UID\|USERNAME\|VENDOR\|ZSH_NAME\|ZSH_VERSION\|REPLY\|reply\|TERM\)'
114
115syn match zshDollarVar        '\$\h\w*'
116syn match zshDeref            '\$[=^~]*[#+]*\h\w*\>'
117
118syn match   zshCommands         '\%(^\|\s\)[.:]\ze\s'
119syn keyword zshCommands         alias autoload bg bindkey break bye cap cd
120                                \ chdir clone comparguments compcall compctl
121                                \ compdescribe compfiles compgroups compquote
122                                \ comptags comptry compvalues continue dirs
123                                \ disable disown echo echotc echoti emulate
124                                \ enable eval exec exit export false fc fg
125                                \ functions getcap getln getopts hash history
126                                \ jobs kill let limit log logout popd print
127                                \ printf pushd pushln pwd r read
128                                \ rehash return sched set setcap shift
129                                \ source stat suspend test times trap true
130                                \ ttyctl type ulimit umask unalias unfunction
131                                \ unhash unlimit unset  vared wait
132                                \ whence where which zcompile zformat zftp zle
133                                \ zmodload zparseopts zprof zpty zrecompile
134                                \ zregexparse zsocket zstyle ztcp
135
136" Options, generated by: echo ${(j:\n:)options[(I)*]} | sort
137" Create a list of option names from zsh source dir:
138"     #!/bin/zsh
139"    topdir=/path/to/zsh-xxx
140"    grep '^pindex([A-Za-z_]*)$' $topdir/Doc/Zsh/options.yo |
141"    while read opt
142"    do
143"        echo ${${(L)opt#pindex\(}%\)}
144"    done
145
146syn case ignore
147
148syn match   zshOptStart /^\s*\%(\%(\%(un\)\?setopt\)\|set\s+[-+]o\)/ nextgroup=zshOption skipwhite
149syn match   zshOption /
150      \ \%(\%(\<no_\?\)\?aliases\>\)\|
151      \ \%(\%(\<no_\?\)\?aliasfuncdef\>\)\|\%(\%(no_\?\)\?alias_func_def\>\)\|
152      \ \%(\%(\<no_\?\)\?allexport\>\)\|\%(\%(no_\?\)\?all_export\>\)\|
153      \ \%(\%(\<no_\?\)\?alwayslastprompt\>\)\|\%(\%(no_\?\)\?always_last_prompt\>\)\|\%(\%(no_\?\)\?always_lastprompt\>\)\|
154      \ \%(\%(\<no_\?\)\?alwaystoend\>\)\|\%(\%(no_\?\)\?always_to_end\>\)\|
155      \ \%(\%(\<no_\?\)\?appendcreate\>\)\|\%(\%(no_\?\)\?append_create\>\)\|
156      \ \%(\%(\<no_\?\)\?appendhistory\>\)\|\%(\%(no_\?\)\?append_history\>\)\|
157      \ \%(\%(\<no_\?\)\?autocd\>\)\|\%(\%(no_\?\)\?auto_cd\>\)\|
158      \ \%(\%(\<no_\?\)\?autocontinue\>\)\|\%(\%(no_\?\)\?auto_continue\>\)\|
159      \ \%(\%(\<no_\?\)\?autolist\>\)\|\%(\%(no_\?\)\?auto_list\>\)\|
160      \ \%(\%(\<no_\?\)\?automenu\>\)\|\%(\%(no_\?\)\?auto_menu\>\)\|
161      \ \%(\%(\<no_\?\)\?autonamedirs\>\)\|\%(\%(no_\?\)\?auto_name_dirs\>\)\|
162      \ \%(\%(\<no_\?\)\?autoparamkeys\>\)\|\%(\%(no_\?\)\?auto_param_keys\>\)\|
163      \ \%(\%(\<no_\?\)\?autoparamslash\>\)\|\%(\%(no_\?\)\?auto_param_slash\>\)\|
164      \ \%(\%(\<no_\?\)\?autopushd\>\)\|\%(\%(no_\?\)\?auto_pushd\>\)\|
165      \ \%(\%(\<no_\?\)\?autoremoveslash\>\)\|\%(\%(no_\?\)\?auto_remove_slash\>\)\|
166      \ \%(\%(\<no_\?\)\?autoresume\>\)\|\%(\%(no_\?\)\?auto_resume\>\)\|
167      \ \%(\%(\<no_\?\)\?badpattern\>\)\|\%(\%(no_\?\)\?bad_pattern\>\)\|
168      \ \%(\%(\<no_\?\)\?banghist\>\)\|\%(\%(no_\?\)\?bang_hist\>\)\|
169      \ \%(\%(\<no_\?\)\?bareglobqual\>\)\|\%(\%(no_\?\)\?bare_glob_qual\>\)\|
170      \ \%(\%(\<no_\?\)\?bashautolist\>\)\|\%(\%(no_\?\)\?bash_auto_list\>\)\|
171      \ \%(\%(\<no_\?\)\?bashrematch\>\)\|\%(\%(no_\?\)\?bash_rematch\>\)\|
172      \ \%(\%(\<no_\?\)\?beep\>\)\|
173      \ \%(\%(\<no_\?\)\?bgnice\>\)\|\%(\%(no_\?\)\?bg_nice\>\)\|
174      \ \%(\%(\<no_\?\)\?braceccl\>\)\|\%(\%(no_\?\)\?brace_ccl\>\)\|
175      \ \%(\%(\<no_\?\)\?braceexpand\>\)\|\%(\%(no_\?\)\?brace_expand\>\)\|
176      \ \%(\%(\<no_\?\)\?bsdecho\>\)\|\%(\%(no_\?\)\?bsd_echo\>\)\|
177      \ \%(\%(\<no_\?\)\?caseglob\>\)\|\%(\%(no_\?\)\?case_glob\>\)\|
178      \ \%(\%(\<no_\?\)\?casematch\>\)\|\%(\%(no_\?\)\?case_match\>\)\|
179      \ \%(\%(\<no_\?\)\?cbases\>\)\|\%(\%(no_\?\)\?c_bases\>\)\|
180      \ \%(\%(\<no_\?\)\?cdablevars\>\)\|\%(\%(no_\?\)\?cdable_vars\>\)\|\%(\%(no_\?\)\?cd_able_vars\>\)\|
181      \ \%(\%(\<no_\?\)\?cdsilent\>\)\|\%(\%(no_\?\)\?cd_silent\>\)\|\%(\%(no_\?\)\?cd_silent\>\)\|
182      \ \%(\%(\<no_\?\)\?chasedots\>\)\|\%(\%(no_\?\)\?chase_dots\>\)\|
183      \ \%(\%(\<no_\?\)\?chaselinks\>\)\|\%(\%(no_\?\)\?chase_links\>\)\|
184      \ \%(\%(\<no_\?\)\?checkjobs\>\)\|\%(\%(no_\?\)\?check_jobs\>\)\|
185      \ \%(\%(\<no_\?\)\?checkrunningjobs\>\)\|\%(\%(no_\?\)\?check_running_jobs\>\)\|
186      \ \%(\%(\<no_\?\)\?clobber\>\)\|
187      \ \%(\%(\<no_\?\)\?clobberempty\>\)\|\%(\%(no_\?\)\?clobber_empty\>\)\|
188      \ \%(\%(\<no_\?\)\?combiningchars\>\)\|\%(\%(no_\?\)\?combining_chars\>\)\|
189      \ \%(\%(\<no_\?\)\?completealiases\>\)\|\%(\%(no_\?\)\?complete_aliases\>\)\|
190      \ \%(\%(\<no_\?\)\?completeinword\>\)\|\%(\%(no_\?\)\?complete_in_word\>\)\|
191      \ \%(\%(\<no_\?\)\?continueonerror\>\)\|\%(\%(no_\?\)\?continue_on_error\>\)\|
192      \ \%(\%(\<no_\?\)\?correct\>\)\|
193      \ \%(\%(\<no_\?\)\?correctall\>\)\|\%(\%(no_\?\)\?correct_all\>\)\|
194      \ \%(\%(\<no_\?\)\?cprecedences\>\)\|\%(\%(no_\?\)\?c_precedences\>\)\|
195      \ \%(\%(\<no_\?\)\?cshjunkiehistory\>\)\|\%(\%(no_\?\)\?csh_junkie_history\>\)\|
196      \ \%(\%(\<no_\?\)\?cshjunkieloops\>\)\|\%(\%(no_\?\)\?csh_junkie_loops\>\)\|
197      \ \%(\%(\<no_\?\)\?cshjunkiequotes\>\)\|\%(\%(no_\?\)\?csh_junkie_quotes\>\)\|
198      \ \%(\%(\<no_\?\)\?csh_nullcmd\>\)\|\%(\%(no_\?\)\?csh_null_cmd\>\)\|\%(\%(no_\?\)\?cshnullcmd\>\)\|\%(\%(no_\?\)\?csh_null_cmd\>\)\|
199      \ \%(\%(\<no_\?\)\?cshnullglob\>\)\|\%(\%(no_\?\)\?csh_null_glob\>\)\|
200      \ \%(\%(\<no_\?\)\?debugbeforecmd\>\)\|\%(\%(no_\?\)\?debug_before_cmd\>\)\|
201      \ \%(\%(\<no_\?\)\?dotglob\>\)\|\%(\%(no_\?\)\?dot_glob\>\)\|
202      \ \%(\%(\<no_\?\)\?dvorak\>\)\|
203      \ \%(\%(\<no_\?\)\?emacs\>\)\|
204      \ \%(\%(\<no_\?\)\?equals\>\)\|
205      \ \%(\%(\<no_\?\)\?errexit\>\)\|\%(\%(no_\?\)\?err_exit\>\)\|
206      \ \%(\%(\<no_\?\)\?errreturn\>\)\|\%(\%(no_\?\)\?err_return\>\)\|
207      \ \%(\%(\<no_\?\)\?evallineno\>\)\|\%(\%(no_\?\)\?eval_lineno\>\)\|
208      \ \%(\%(\<no_\?\)\?exec\>\)\|
209      \ \%(\%(\<no_\?\)\?extendedglob\>\)\|\%(\%(no_\?\)\?extended_glob\>\)\|
210      \ \%(\%(\<no_\?\)\?extendedhistory\>\)\|\%(\%(no_\?\)\?extended_history\>\)\|
211      \ \%(\%(\<no_\?\)\?flowcontrol\>\)\|\%(\%(no_\?\)\?flow_control\>\)\|
212      \ \%(\%(\<no_\?\)\?forcefloat\>\)\|\%(\%(no_\?\)\?force_float\>\)\|
213      \ \%(\%(\<no_\?\)\?functionargzero\>\)\|\%(\%(no_\?\)\?function_argzero\>\)\|\%(\%(no_\?\)\?function_arg_zero\>\)\|
214      \ \%(\%(\<no_\?\)\?glob\>\)\|
215      \ \%(\%(\<no_\?\)\?globalexport\>\)\|\%(\%(no_\?\)\?global_export\>\)\|
216      \ \%(\%(\<no_\?\)\?globalrcs\>\)\|\%(\%(no_\?\)\?global_rcs\>\)\|
217      \ \%(\%(\<no_\?\)\?globassign\>\)\|\%(\%(no_\?\)\?glob_assign\>\)\|
218      \ \%(\%(\<no_\?\)\?globcomplete\>\)\|\%(\%(no_\?\)\?glob_complete\>\)\|
219      \ \%(\%(\<no_\?\)\?globdots\>\)\|\%(\%(no_\?\)\?glob_dots\>\)\|
220      \ \%(\%(\<no_\?\)\?glob_subst\>\)\|\%(\%(no_\?\)\?globsubst\>\)\|
221      \ \%(\%(\<no_\?\)\?globstarshort\>\)\|\%(\%(no_\?\)\?glob_star_short\>\)\|
222      \ \%(\%(\<no_\?\)\?hashall\>\)\|\%(\%(no_\?\)\?hash_all\>\)\|
223      \ \%(\%(\<no_\?\)\?hashcmds\>\)\|\%(\%(no_\?\)\?hash_cmds\>\)\|
224      \ \%(\%(\<no_\?\)\?hashdirs\>\)\|\%(\%(no_\?\)\?hash_dirs\>\)\|
225      \ \%(\%(\<no_\?\)\?hashexecutablesonly\>\)\|\%(\%(no_\?\)\?hash_executables_only\>\)\|
226      \ \%(\%(\<no_\?\)\?hashlistall\>\)\|\%(\%(no_\?\)\?hash_list_all\>\)\|
227      \ \%(\%(\<no_\?\)\?histallowclobber\>\)\|\%(\%(no_\?\)\?hist_allow_clobber\>\)\|
228      \ \%(\%(\<no_\?\)\?histappend\>\)\|\%(\%(no_\?\)\?hist_append\>\)\|
229      \ \%(\%(\<no_\?\)\?histbeep\>\)\|\%(\%(no_\?\)\?hist_beep\>\)\|
230      \ \%(\%(\<no_\?\)\?hist_expand\>\)\|\%(\%(no_\?\)\?histexpand\>\)\|
231      \ \%(\%(\<no_\?\)\?hist_expire_dups_first\>\)\|\%(\%(no_\?\)\?histexpiredupsfirst\>\)\|
232      \ \%(\%(\<no_\?\)\?histfcntllock\>\)\|\%(\%(no_\?\)\?hist_fcntl_lock\>\)\|
233      \ \%(\%(\<no_\?\)\?histfindnodups\>\)\|\%(\%(no_\?\)\?hist_find_no_dups\>\)\|
234      \ \%(\%(\<no_\?\)\?histignorealldups\>\)\|\%(\%(no_\?\)\?hist_ignore_all_dups\>\)\|
235      \ \%(\%(\<no_\?\)\?histignoredups\>\)\|\%(\%(no_\?\)\?hist_ignore_dups\>\)\|
236      \ \%(\%(\<no_\?\)\?histignorespace\>\)\|\%(\%(no_\?\)\?hist_ignore_space\>\)\|
237      \ \%(\%(\<no_\?\)\?histlexwords\>\)\|\%(\%(no_\?\)\?hist_lex_words\>\)\|
238      \ \%(\%(\<no_\?\)\?histnofunctions\>\)\|\%(\%(no_\?\)\?hist_no_functions\>\)\|
239      \ \%(\%(\<no_\?\)\?histnostore\>\)\|\%(\%(no_\?\)\?hist_no_store\>\)\|
240      \ \%(\%(\<no_\?\)\?histreduceblanks\>\)\|\%(\%(no_\?\)\?hist_reduce_blanks\>\)\|
241      \ \%(\%(\<no_\?\)\?histsavebycopy\>\)\|\%(\%(no_\?\)\?hist_save_by_copy\>\)\|
242      \ \%(\%(\<no_\?\)\?histsavenodups\>\)\|\%(\%(no_\?\)\?hist_save_no_dups\>\)\|
243      \ \%(\%(\<no_\?\)\?histsubstpattern\>\)\|\%(\%(no_\?\)\?hist_subst_pattern\>\)\|
244      \ \%(\%(\<no_\?\)\?histverify\>\)\|\%(\%(no_\?\)\?hist_verify\>\)\|
245      \ \%(\%(\<no_\?\)\?hup\>\)\|
246      \ \%(\%(\<no_\?\)\?ignorebraces\>\)\|\%(\%(no_\?\)\?ignore_braces\>\)\|
247      \ \%(\%(\<no_\?\)\?ignoreclosebraces\>\)\|\%(\%(no_\?\)\?ignore_close_braces\>\)\|
248      \ \%(\%(\<no_\?\)\?ignoreeof\>\)\|\%(\%(no_\?\)\?ignore_eof\>\)\|
249      \ \%(\%(\<no_\?\)\?incappendhistory\>\)\|\%(\%(no_\?\)\?inc_append_history\>\)\|
250      \ \%(\%(\<no_\?\)\?incappendhistorytime\>\)\|\%(\%(no_\?\)\?inc_append_history_time\>\)\|
251      \ \%(\%(\<no_\?\)\?interactive\>\)\|
252      \ \%(\%(\<no_\?\)\?interactivecomments\>\)\|\%(\%(no_\?\)\?interactive_comments\>\)\|
253      \ \%(\%(\<no_\?\)\?ksharrays\>\)\|\%(\%(no_\?\)\?ksh_arrays\>\)\|
254      \ \%(\%(\<no_\?\)\?kshautoload\>\)\|\%(\%(no_\?\)\?ksh_autoload\>\)\|
255      \ \%(\%(\<no_\?\)\?kshglob\>\)\|\%(\%(no_\?\)\?ksh_glob\>\)\|
256      \ \%(\%(\<no_\?\)\?kshoptionprint\>\)\|\%(\%(no_\?\)\?ksh_option_print\>\)\|
257      \ \%(\%(\<no_\?\)\?kshtypeset\>\)\|\%(\%(no_\?\)\?ksh_typeset\>\)\|
258      \ \%(\%(\<no_\?\)\?kshzerosubscript\>\)\|\%(\%(no_\?\)\?ksh_zero_subscript\>\)\|
259      \ \%(\%(\<no_\?\)\?listambiguous\>\)\|\%(\%(no_\?\)\?list_ambiguous\>\)\|
260      \ \%(\%(\<no_\?\)\?listbeep\>\)\|\%(\%(no_\?\)\?list_beep\>\)\|
261      \ \%(\%(\<no_\?\)\?listpacked\>\)\|\%(\%(no_\?\)\?list_packed\>\)\|
262      \ \%(\%(\<no_\?\)\?listrowsfirst\>\)\|\%(\%(no_\?\)\?list_rows_first\>\)\|
263      \ \%(\%(\<no_\?\)\?listtypes\>\)\|\%(\%(no_\?\)\?list_types\>\)\|
264      \ \%(\%(\<no_\?\)\?localloops\>\)\|\%(\%(no_\?\)\?local_loops\>\)\|
265      \ \%(\%(\<no_\?\)\?localoptions\>\)\|\%(\%(no_\?\)\?local_options\>\)\|
266      \ \%(\%(\<no_\?\)\?localpatterns\>\)\|\%(\%(no_\?\)\?local_patterns\>\)\|
267      \ \%(\%(\<no_\?\)\?localtraps\>\)\|\%(\%(no_\?\)\?local_traps\>\)\|
268      \ \%(\%(\<no_\?\)\?log\>\)\|
269      \ \%(\%(\<no_\?\)\?login\>\)\|
270      \ \%(\%(\<no_\?\)\?longlistjobs\>\)\|\%(\%(no_\?\)\?long_list_jobs\>\)\|
271      \ \%(\%(\<no_\?\)\?magicequalsubst\>\)\|\%(\%(no_\?\)\?magic_equal_subst\>\)\|
272      \ \%(\%(\<no_\?\)\?mark_dirs\>\)\|
273      \ \%(\%(\<no_\?\)\?mailwarn\>\)\|\%(\%(no_\?\)\?mail_warn\>\)\|
274      \ \%(\%(\<no_\?\)\?mailwarning\>\)\|\%(\%(no_\?\)\?mail_warning\>\)\|
275      \ \%(\%(\<no_\?\)\?markdirs\>\)\|
276      \ \%(\%(\<no_\?\)\?menucomplete\>\)\|\%(\%(no_\?\)\?menu_complete\>\)\|
277      \ \%(\%(\<no_\?\)\?monitor\>\)\|
278      \ \%(\%(\<no_\?\)\?multibyte\>\)\|\%(\%(no_\?\)\?multi_byte\>\)\|
279      \ \%(\%(\<no_\?\)\?multifuncdef\>\)\|\%(\%(no_\?\)\?multi_func_def\>\)\|
280      \ \%(\%(\<no_\?\)\?multios\>\)\|\%(\%(no_\?\)\?multi_os\>\)\|
281      \ \%(\%(\<no_\?\)\?nomatch\>\)\|\%(\%(no_\?\)\?no_match\>\)\|
282      \ \%(\%(\<no_\?\)\?notify\>\)\|
283      \ \%(\%(\<no_\?\)\?nullglob\>\)\|\%(\%(no_\?\)\?null_glob\>\)\|
284      \ \%(\%(\<no_\?\)\?numericglobsort\>\)\|\%(\%(no_\?\)\?numeric_glob_sort\>\)\|
285      \ \%(\%(\<no_\?\)\?octalzeroes\>\)\|\%(\%(no_\?\)\?octal_zeroes\>\)\|
286      \ \%(\%(\<no_\?\)\?onecmd\>\)\|\%(\%(no_\?\)\?one_cmd\>\)\|
287      \ \%(\%(\<no_\?\)\?overstrike\>\)\|\%(\%(no_\?\)\?over_strike\>\)\|
288      \ \%(\%(\<no_\?\)\?pathdirs\>\)\|\%(\%(no_\?\)\?path_dirs\>\)\|
289      \ \%(\%(\<no_\?\)\?pathscript\>\)\|\%(\%(no_\?\)\?path_script\>\)\|
290      \ \%(\%(\<no_\?\)\?physical\>\)\|
291      \ \%(\%(\<no_\?\)\?pipefail\>\)\|\%(\%(no_\?\)\?pipe_fail\>\)\|
292      \ \%(\%(\<no_\?\)\?posixaliases\>\)\|\%(\%(no_\?\)\?posix_aliases\>\)\|
293      \ \%(\%(\<no_\?\)\?posixargzero\>\)\|\%(\%(no_\?\)\?posix_arg_zero\>\)\|\%(\%(no_\?\)\?posix_argzero\>\)\|
294      \ \%(\%(\<no_\?\)\?posixbuiltins\>\)\|\%(\%(no_\?\)\?posix_builtins\>\)\|
295      \ \%(\%(\<no_\?\)\?posixcd\>\)\|\%(\%(no_\?\)\?posix_cd\>\)\|
296      \ \%(\%(\<no_\?\)\?posixidentifiers\>\)\|\%(\%(no_\?\)\?posix_identifiers\>\)\|
297      \ \%(\%(\<no_\?\)\?posixjobs\>\)\|\%(\%(no_\?\)\?posix_jobs\>\)\|
298      \ \%(\%(\<no_\?\)\?posixstrings\>\)\|\%(\%(no_\?\)\?posix_strings\>\)\|
299      \ \%(\%(\<no_\?\)\?posixtraps\>\)\|\%(\%(no_\?\)\?posix_traps\>\)\|
300      \ \%(\%(\<no_\?\)\?printeightbit\>\)\|\%(\%(no_\?\)\?print_eight_bit\>\)\|
301      \ \%(\%(\<no_\?\)\?printexitvalue\>\)\|\%(\%(no_\?\)\?print_exit_value\>\)\|
302      \ \%(\%(\<no_\?\)\?privileged\>\)\|
303      \ \%(\%(\<no_\?\)\?promptbang\>\)\|\%(\%(no_\?\)\?prompt_bang\>\)\|
304      \ \%(\%(\<no_\?\)\?promptcr\>\)\|\%(\%(no_\?\)\?prompt_cr\>\)\|
305      \ \%(\%(\<no_\?\)\?promptpercent\>\)\|\%(\%(no_\?\)\?prompt_percent\>\)\|
306      \ \%(\%(\<no_\?\)\?promptsp\>\)\|\%(\%(no_\?\)\?prompt_sp\>\)\|
307      \ \%(\%(\<no_\?\)\?promptsubst\>\)\|\%(\%(no_\?\)\?prompt_subst\>\)\|
308      \ \%(\%(\<no_\?\)\?promptvars\>\)\|\%(\%(no_\?\)\?prompt_vars\>\)\|
309      \ \%(\%(\<no_\?\)\?pushdignoredups\>\)\|\%(\%(no_\?\)\?pushd_ignore_dups\>\)\|
310      \ \%(\%(\<no_\?\)\?pushdminus\>\)\|\%(\%(no_\?\)\?pushd_minus\>\)\|
311      \ \%(\%(\<no_\?\)\?pushdsilent\>\)\|\%(\%(no_\?\)\?pushd_silent\>\)\|
312      \ \%(\%(\<no_\?\)\?pushdtohome\>\)\|\%(\%(no_\?\)\?pushd_to_home\>\)\|
313      \ \%(\%(\<no_\?\)\?rcexpandparam\>\)\|\%(\%(no_\?\)\?rc_expandparam\>\)\|\%(\%(no_\?\)\?rc_expand_param\>\)\|
314      \ \%(\%(\<no_\?\)\?rcquotes\>\)\|\%(\%(no_\?\)\?rc_quotes\>\)\|
315      \ \%(\%(\<no_\?\)\?rcs\>\)\|
316      \ \%(\%(\<no_\?\)\?recexact\>\)\|\%(\%(no_\?\)\?rec_exact\>\)\|
317      \ \%(\%(\<no_\?\)\?rematchpcre\>\)\|\%(\%(no_\?\)\?re_match_pcre\>\)\|\%(\%(no_\?\)\?rematch_pcre\>\)\|
318      \ \%(\%(\<no_\?\)\?restricted\>\)\|
319      \ \%(\%(\<no_\?\)\?rmstarsilent\>\)\|\%(\%(no_\?\)\?rm_star_silent\>\)\|
320      \ \%(\%(\<no_\?\)\?rmstarwait\>\)\|\%(\%(no_\?\)\?rm_star_wait\>\)\|
321      \ \%(\%(\<no_\?\)\?sharehistory\>\)\|\%(\%(no_\?\)\?share_history\>\)\|
322      \ \%(\%(\<no_\?\)\?shfileexpansion\>\)\|\%(\%(no_\?\)\?sh_file_expansion\>\)\|
323      \ \%(\%(\<no_\?\)\?shglob\>\)\|\%(\%(no_\?\)\?sh_glob\>\)\|
324      \ \%(\%(\<no_\?\)\?shinstdin\>\)\|\%(\%(no_\?\)\?shin_stdin\>\)\|
325      \ \%(\%(\<no_\?\)\?shnullcmd\>\)\|\%(\%(no_\?\)\?sh_nullcmd\>\)\|
326      \ \%(\%(\<no_\?\)\?shoptionletters\>\)\|\%(\%(no_\?\)\?sh_option_letters\>\)\|
327      \ \%(\%(\<no_\?\)\?shortloops\>\)\|\%(\%(no_\?\)\?short_loops\>\)\|
328      \ \%(\%(\<no_\?\)\?shortrepeat\>\)\|\%(\%(no_\?\)\?short_repeat\>\)\|
329      \ \%(\%(\<no_\?\)\?shwordsplit\>\)\|\%(\%(no_\?\)\?sh_word_split\>\)\|
330      \ \%(\%(\<no_\?\)\?singlecommand\>\)\|\%(\%(no_\?\)\?single_command\>\)\|
331      \ \%(\%(\<no_\?\)\?singlelinezle\>\)\|\%(\%(no_\?\)\?single_line_zle\>\)\|
332      \ \%(\%(\<no_\?\)\?sourcetrace\>\)\|\%(\%(no_\?\)\?source_trace\>\)\|
333      \ \%(\%(\<no_\?\)\?stdin\>\)\|
334      \ \%(\%(\<no_\?\)\?sunkeyboardhack\>\)\|\%(\%(no_\?\)\?sun_keyboard_hack\>\)\|
335      \ \%(\%(\<no_\?\)\?trackall\>\)\|\%(\%(no_\?\)\?track_all\>\)\|
336      \ \%(\%(\<no_\?\)\?transientrprompt\>\)\|\%(\%(no_\?\)\?transient_rprompt\>\)\|
337      \ \%(\%(\<no_\?\)\?trapsasync\>\)\|\%(\%(no_\?\)\?traps_async\>\)\|
338      \ \%(\%(\<no_\?\)\?typesetsilent\>\)\|\%(\%(no_\?\)\?type_set_silent\>\)\|\%(\%(no_\?\)\?typeset_silent\>\)\|
339      \ \%(\%(\<no_\?\)\?unset\>\)\|
340      \ \%(\%(\<no_\?\)\?verbose\>\)\|
341      \ \%(\%(\<no_\?\)\?vi\>\)\|
342      \ \%(\%(\<no_\?\)\?warnnestedvar\>\)\|\%(\%(no_\?\)\?warn_nested_var\>\)\|
343      \ \%(\%(\<no_\?\)\?warncreateglobal\>\)\|\%(\%(no_\?\)\?warn_create_global\>\)\|
344      \ \%(\%(\<no_\?\)\?xtrace\>\)\|
345      \ \%(\%(\<no_\?\)\?zle\>\)/ nextgroup=zshOption,zshComment skipwhite contained
346
347syn case match
348
349syn keyword zshTypes            float integer local typeset declare private readonly
350
351" XXX: this may be too much
352" syn match   zshSwitches         '\s\zs--\=[a-zA-Z0-9-]\+'
353
354syn match   zshNumber           '[+-]\=\<\d\+\>'
355syn match   zshNumber           '[+-]\=\<0x\x\+\>'
356syn match   zshNumber           '[+-]\=\<0\o\+\>'
357syn match   zshNumber           '[+-]\=\d\+#[-+]\=\w\+\>'
358syn match   zshNumber           '[+-]\=\d\+\.\d\+\>'
359
360" TODO: $[...] is the same as $((...)), so add that as well.
361syn cluster zshSubst            contains=zshSubst,zshOldSubst,zshMathSubst
362exe 'syn region  zshSubst       matchgroup=zshSubstDelim transparent start=/\$(/ skip=/\\)/ end=/)/ contains='.s:contained. '  fold'
363syn region  zshParentheses      transparent start='(' skip='\\)' end=')' fold
364syn region  zshGlob             start='(#' end=')'
365syn region  zshMathSubst        matchgroup=zshSubstDelim transparent
366                                \ start='\%(\$\?\)[<=>]\@<!((' skip='\\)' end='))'
367                                \ contains=zshParentheses,@zshSubst,zshNumber,
368                                \ @zshDerefs,zshString keepend fold
369" The ms=s+1 prevents matching zshBrackets several times on opening brackets
370" (see https://github.com/chrisbra/vim-zsh/issues/21#issuecomment-576330348)
371syn region  zshBrackets         contained transparent start='{'ms=s+1 skip='\\}'
372                                \ end='}' fold
373exe 'syn region  zshBrackets    transparent start=/{/ms=s+1 skip=/\\}/ end=/}/ contains='.s:contained. ' fold'
374
375syn region  zshSubst            matchgroup=zshSubstDelim start='\${' skip='\\}'
376                                \ end='}' contains=@zshSubst,zshBrackets,zshQuoted,zshString fold
377exe 'syn region  zshOldSubst    matchgroup=zshSubstDelim start=/`/ skip=/\\[\\`]/ end=/`/ contains='.s:contained. ',zshOldSubst fold'
378
379syn sync    minlines=50 maxlines=90
380syn sync    match zshHereDocSync    grouphere   NONE '<<-\=\s*\%(\\\=\S\+\|\(["']\)\S\+\1\)'
381syn sync    match zshHereDocEndSync groupthere  NONE '^\s*EO\a\+\>'
382
383syn keyword zshTodo             contained TODO FIXME XXX NOTE
384
385syn region  zshComment          oneline start='\%(^\|\s\+\)#' end='$'
386                                \ contains=zshTodo,@Spell fold
387
388syn region  zshComment          start='^\s*#' end='^\%(\s*#\)\@!'
389                                \ contains=zshTodo,@Spell fold
390
391syn match   zshPreProc          '^\%1l#\%(!\|compdef\|autoload\).*$'
392
393hi def link zshTodo             Todo
394hi def link zshComment          Comment
395hi def link zshPreProc          PreProc
396hi def link zshQuoted           SpecialChar
397hi def link zshPOSIXQuoted      SpecialChar
398hi def link zshString           String
399hi def link zshStringDelimiter  zshString
400hi def link zshPOSIXString      zshString
401hi def link zshJobSpec          Special
402hi def link zshPrecommand       Special
403hi def link zshDelimiter        Keyword
404hi def link zshConditional      Conditional
405hi def link zshException        Exception
406hi def link zshRepeat           Repeat
407hi def link zshKeyword          Keyword
408hi def link zshFunction         None
409hi def link zshKSHFunction      zshFunction
410hi def link zshHereDoc          String
411hi def link zshOperator         None
412hi def link zshRedir            Operator
413hi def link zshVariable         None
414hi def link zshVariableDef      zshVariable
415hi def link zshDereferencing    PreProc
416hi def link zshShortDeref       zshDereferencing
417hi def link zshLongDeref        zshDereferencing
418hi def link zshDeref            zshDereferencing
419hi def link zshDollarVar        zshDereferencing
420hi def link zshCommands         Keyword
421hi def link zshOptStart         Keyword
422hi def link zshOption           Constant
423hi def link zshTypes            Type
424hi def link zshSwitches         Special
425hi def link zshNumber           Number
426hi def link zshSubst            PreProc
427hi def link zshMathSubst        zshSubst
428hi def link zshOldSubst         zshSubst
429hi def link zshSubstDelim       zshSubst
430hi def link zshGlob             zshSubst
431
432let b:current_syntax = "zsh"
433
434let &cpo = s:cpo_save
435unlet s:cpo_save
436