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