blob: 819c419228f5f008a23e3333d5f305ae83439f3b [file] [log] [blame]
Bram Moolenaar071d4272004-06-13 20:20:40 +00001" Vim syntax file
Bram Moolenaarf2571c62015-06-09 19:44:55 +02002" Language: Zsh shell script
3" Maintainer: Christian Brabandt <cb@256bit.org>
4" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
Bram Moolenaar23515b42020-11-29 14:36:24 +01005" Latest Revision: 2020-11-21
Bram Moolenaarf2571c62015-06-09 19:44:55 +02006" License: Vim (see :h license)
Bram Moolenaar94237492017-04-23 18:40:21 +02007" Repository: https://github.com/chrisbra/vim-zsh
Bram Moolenaar071d4272004-06-13 20:20:40 +00008
Bram Moolenaarc81e5e72007-05-05 18:24:42 +00009if exists("b:current_syntax")
Bram Moolenaar071d4272004-06-13 20:20:40 +000010 finish
11endif
12
Bram Moolenaarc81e5e72007-05-05 18:24:42 +000013let s:cpo_save = &cpo
14set cpo&vim
Bram Moolenaar071d4272004-06-13 20:20:40 +000015
Bram Moolenaarb17893a2020-03-14 08:19:51 +010016function! s:ContainedGroup()
Bram Moolenaar23515b42020-11-29 14:36:24 +010017 " needs 7.4.2008 for execute() function
Bram Moolenaarb17893a2020-03-14 08:19:51 +010018 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,#,-
Bram Moolenaarf3913272016-02-25 00:00:01 +010040if get(g:, 'zsh_fold_enable', 0)
41 setlocal foldmethod=syntax
42endif
Bram Moolenaar071d4272004-06-13 20:20:40 +000043
Bram Moolenaarb17893a2020-03-14 08:19:51 +010044syn 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}'
Bram Moolenaarc81e5e72007-05-05 18:24:42 +000048syn match zshQuoted '\\.'
49syn region zshString matchgroup=zshStringDelimiter start=+"+ end=+"+
Bram Moolenaarf3913272016-02-25 00:00:01 +010050 \ contains=zshQuoted,@zshDerefs,@zshSubst fold
51syn region zshString matchgroup=zshStringDelimiter start=+'+ end=+'+ fold
Bram Moolenaarc81e5e72007-05-05 18:24:42 +000052syn region zshPOSIXString matchgroup=zshStringDelimiter start=+\$'+
Bram Moolenaarb17893a2020-03-14 08:19:51 +010053 \ skip=+\\[\\']+ end=+'+ contains=zshPOSIXQuoted,zshQuoted
Bram Moolenaarc81e5e72007-05-05 18:24:42 +000054syn match zshJobSpec '%\(\d\+\|?\=\w\+\|[%+-]\)'
Bram Moolenaar071d4272004-06-13 20:20:40 +000055
Bram Moolenaarc81e5e72007-05-05 18:24:42 +000056syn keyword zshPrecommand noglob nocorrect exec command builtin - time
Bram Moolenaar071d4272004-06-13 20:20:40 +000057
Bram Moolenaarf2571c62015-06-09 19:44:55 +020058syn keyword zshDelimiter do done end
Bram Moolenaar071d4272004-06-13 20:20:40 +000059
Bram Moolenaarc81e5e72007-05-05 18:24:42 +000060syn keyword zshConditional if then elif else fi case in esac select
Bram Moolenaar071d4272004-06-13 20:20:40 +000061
Bram Moolenaare37d50a2008-08-06 17:06:04 +000062syn keyword zshRepeat while until repeat
63
64syn keyword zshRepeat for foreach nextgroup=zshVariable skipwhite
Bram Moolenaar071d4272004-06-13 20:20:40 +000065
Bram Moolenaarc81e5e72007-05-05 18:24:42 +000066syn keyword zshException always
Bram Moolenaar071d4272004-06-13 20:20:40 +000067
Bram Moolenaarc81e5e72007-05-05 18:24:42 +000068syn keyword zshKeyword function nextgroup=zshKSHFunction skipwhite
Bram Moolenaar071d4272004-06-13 20:20:40 +000069
Bram Moolenaarf3913272016-02-25 00:00:01 +010070syn match zshKSHFunction contained '\w\S\+'
Bram Moolenaarc81e5e72007-05-05 18:24:42 +000071syn 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
Bram Moolenaarc81e5e72007-05-05 18:24:42 +000079syn region zshHereDoc matchgroup=zshRedir
Bram Moolenaare37d50a2008-08-06 17:06:04 +000080 \ start='<\@<!<<\s*\z([^<]\S*\)'
81 \ end='^\z1\>'
Bram Moolenaar7db25fe2018-05-13 00:02:36 +020082 \ contains=@zshSubst,@zshDerefs,zshQuoted,zshPOSIXString
Bram Moolenaarc81e5e72007-05-05 18:24:42 +000083syn region zshHereDoc matchgroup=zshRedir
Bram Moolenaare37d50a2008-08-06 17:06:04 +000084 \ start='<\@<!<<\s*\\\z(\S\+\)'
85 \ end='^\z1\>'
Bram Moolenaar7db25fe2018-05-13 00:02:36 +020086 \ contains=@zshSubst,@zshDerefs,zshQuoted,zshPOSIXString
Bram Moolenaare37d50a2008-08-06 17:06:04 +000087syn region zshHereDoc matchgroup=zshRedir
88 \ start='<\@<!<<-\s*\\\=\z(\S\+\)'
89 \ end='^\s*\z1\>'
Bram Moolenaar7db25fe2018-05-13 00:02:36 +020090 \ contains=@zshSubst,@zshDerefs,zshQuoted,zshPOSIXString
Bram Moolenaare37d50a2008-08-06 17:06:04 +000091syn region zshHereDoc matchgroup=zshRedir
Bram Moolenaarf2571c62015-06-09 19:44:55 +020092 \ start=+<\@<!<<\s*\(["']\)\z(\S\+\)\1+
Bram Moolenaare37d50a2008-08-06 17:06:04 +000093 \ end='^\z1\>'
94syn region zshHereDoc matchgroup=zshRedir
95 \ start=+<\@<!<<-\s*\(["']\)\z(\S\+\)\1+
Bram Moolenaarc81e5e72007-05-05 18:24:42 +000096 \ end='^\s*\z1\>'
97
Bram Moolenaare37d50a2008-08-06 17:06:04 +000098syn match zshVariable '\<\h\w*' contained
99
100syn match zshVariableDef '\<\h\w*\ze+\=='
Bram Moolenaarc81e5e72007-05-05 18:24:42 +0000101" XXX: how safe is this?
Bram Moolenaare37d50a2008-08-06 17:06:04 +0000102syn region zshVariableDef oneline
Bram Moolenaar94237492017-04-23 18:40:21 +0200103 \ start='\$\@<!\<\h\w*\[' end='\]\ze+\?=\?'
Bram Moolenaarc81e5e72007-05-05 18:24:42 +0000104 \ contains=@zshSubst
105
Bram Moolenaar94237492017-04-23 18:40:21 +0200106syn cluster zshDerefs contains=zshShortDeref,zshLongDeref,zshDeref,zshDollarVar
Bram Moolenaarc81e5e72007-05-05 18:24:42 +0000107
Bram Moolenaar94237492017-04-23 18:40:21 +0200108syn match zshShortDeref '\$[!#$*@?_-]\w\@!'
109syn match zshShortDeref '\$[=^~]*[#+]*\d\+\>'
Bram Moolenaar071d4272004-06-13 20:20:40 +0000110
Bram Moolenaar94237492017-04-23 18:40:21 +0200111syn 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\)'
Bram Moolenaarc81e5e72007-05-05 18:24:42 +0000114
Bram Moolenaar94237492017-04-23 18:40:21 +0200115syn match zshDollarVar '\$\h\w*'
116syn match zshDeref '\$[=^~]*[#+]*\h\w*\>'
Bram Moolenaarc81e5e72007-05-05 18:24:42 +0000117
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
Bram Moolenaar96f45c02019-10-26 19:53:45 +0200127 \ printf pushd pushln pwd r read
Bram Moolenaar94237492017-04-23 18:40:21 +0200128 \ rehash return sched set setcap shift
Bram Moolenaarc81e5e72007-05-05 18:24:42 +0000129 \ source stat suspend test times trap true
130 \ ttyctl type ulimit umask unalias unfunction
Bram Moolenaar94237492017-04-23 18:40:21 +0200131 \ unhash unlimit unset vared wait
Bram Moolenaarc81e5e72007-05-05 18:24:42 +0000132 \ whence where which zcompile zformat zftp zle
Bram Moolenaar7db25fe2018-05-13 00:02:36 +0200133 \ zmodload zparseopts zprof zpty zrecompile
134 \ zregexparse zsocket zstyle ztcp
Bram Moolenaarc81e5e72007-05-05 18:24:42 +0000135
Bram Moolenaarf2571c62015-06-09 19:44:55 +0200136" Options, generated by: echo ${(j:\n:)options[(I)*]} | sort
Bram Moolenaarfa735342016-01-03 22:14:44 +0100137" Create a list of option names from zsh source dir:
138" #!/bin/zsh
139" topdir=/path/to/zsh-xxx
Bram Moolenaar96f45c02019-10-26 19:53:45 +0200140" grep '^pindex([A-Za-z_]*)$' $topdir/Doc/Zsh/options.yo |
Bram Moolenaarfa735342016-01-03 22:14:44 +0100141" while read opt
142" do
143" echo ${${(L)opt#pindex\(}%\)}
144" done
145
Bram Moolenaarf2571c62015-06-09 19:44:55 +0200146syn case ignore
Bram Moolenaarf2571c62015-06-09 19:44:55 +0200147
Bram Moolenaar94237492017-04-23 18:40:21 +0200148syn match zshOptStart /^\s*\%(\%(\%(un\)\?setopt\)\|set\s+[-+]o\)/ nextgroup=zshOption skipwhite
Bram Moolenaarf55e4c82017-08-01 20:44:53 +0200149syn match zshOption /
150 \ \%(\%(\<no_\?\)\?aliases\>\)\|
Bram Moolenaar96f45c02019-10-26 19:53:45 +0200151 \ \%(\%(\<no_\?\)\?aliasfuncdef\>\)\|\%(\%(no_\?\)\?alias_func_def\>\)\|
Bram Moolenaarf55e4c82017-08-01 20:44:53 +0200152 \ \%(\%(\<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\>\)\|
Bram Moolenaar23515b42020-11-29 14:36:24 +0100181 \ \%(\%(\<no_\?\)\?cdsilent\>\)\|\%(\%(no_\?\)\?cd_silent\>\)\|\%(\%(no_\?\)\?cd_silent\>\)\|
Bram Moolenaarf55e4c82017-08-01 20:44:53 +0200182 \ \%(\%(\<no_\?\)\?chasedots\>\)\|\%(\%(no_\?\)\?chase_dots\>\)\|
183 \ \%(\%(\<no_\?\)\?chaselinks\>\)\|\%(\%(no_\?\)\?chase_links\>\)\|
184 \ \%(\%(\<no_\?\)\?checkjobs\>\)\|\%(\%(no_\?\)\?check_jobs\>\)\|
Bram Moolenaar96f45c02019-10-26 19:53:45 +0200185 \ \%(\%(\<no_\?\)\?checkrunningjobs\>\)\|\%(\%(no_\?\)\?check_running_jobs\>\)\|
Bram Moolenaarf55e4c82017-08-01 20:44:53 +0200186 \ \%(\%(\<no_\?\)\?clobber\>\)\|
Bram Moolenaar23515b42020-11-29 14:36:24 +0100187 \ \%(\%(\<no_\?\)\?clobberempty\>\)\|\%(\%(no_\?\)\?clobber_empty\>\)\|
Bram Moolenaarf55e4c82017-08-01 20:44:53 +0200188 \ \%(\%(\<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\>\)\|
Bram Moolenaar96f45c02019-10-26 19:53:45 +0200207 \ \%(\%(\<no_\?\)\?evallineno\>\)\|\%(\%(no_\?\)\?eval_lineno\>\)\|
Bram Moolenaarf55e4c82017-08-01 20:44:53 +0200208 \ \%(\%(\<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\>\)\|
Bram Moolenaar23515b42020-11-29 14:36:24 +0100328 \ \%(\%(\<no_\?\)\?shortrepeat\>\)\|\%(\%(no_\?\)\?short_repeat\>\)\|
Bram Moolenaarf55e4c82017-08-01 20:44:53 +0200329 \ \%(\%(\<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\>\)\|
Bram Moolenaar96f45c02019-10-26 19:53:45 +0200342 \ \%(\%(\<no_\?\)\?warnnestedvar\>\)\|\%(\%(no_\?\)\?warn_nested_var\>\)\|
Bram Moolenaarf55e4c82017-08-01 20:44:53 +0200343 \ \%(\%(\<no_\?\)\?warncreateglobal\>\)\|\%(\%(no_\?\)\?warn_create_global\>\)\|
344 \ \%(\%(\<no_\?\)\?xtrace\>\)\|
Bram Moolenaar2f058492017-11-30 20:27:52 +0100345 \ \%(\%(\<no_\?\)\?zle\>\)/ nextgroup=zshOption,zshComment skipwhite contained
Bram Moolenaarf2571c62015-06-09 19:44:55 +0200346
Bram Moolenaar23515b42020-11-29 14:36:24 +0100347syn case match
348
Bram Moolenaar2f058492017-11-30 20:27:52 +0100349syn keyword zshTypes float integer local typeset declare private readonly
Bram Moolenaarc81e5e72007-05-05 18:24:42 +0000350
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
Bram Moolenaare37d50a2008-08-06 17:06:04 +0000360" TODO: $[...] is the same as $((...)), so add that as well.
Bram Moolenaarc81e5e72007-05-05 18:24:42 +0000361syn cluster zshSubst contains=zshSubst,zshOldSubst,zshMathSubst
Bram Moolenaarb17893a2020-03-14 08:19:51 +0100362exe 'syn region zshSubst matchgroup=zshSubstDelim transparent start=/\$(/ skip=/\\)/ end=/)/ contains='.s:contained. ' fold'
Bram Moolenaar681baaf2016-02-04 20:57:07 +0100363syn region zshParentheses transparent start='(' skip='\\)' end=')' fold
Bram Moolenaar94237492017-04-23 18:40:21 +0200364syn region zshGlob start='(#' end=')'
Bram Moolenaarc81e5e72007-05-05 18:24:42 +0000365syn region zshMathSubst matchgroup=zshSubstDelim transparent
Bram Moolenaar23515b42020-11-29 14:36:24 +0100366 \ start='\%(\$\?\)[<=>]\@<!((' skip='\\)' end='))'
Bram Moolenaarc81e5e72007-05-05 18:24:42 +0000367 \ contains=zshParentheses,@zshSubst,zshNumber,
Bram Moolenaar681baaf2016-02-04 20:57:07 +0100368 \ @zshDerefs,zshString keepend fold
Bram Moolenaarb17893a2020-03-14 08:19:51 +0100369" 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='\\}'
Bram Moolenaar681baaf2016-02-04 20:57:07 +0100372 \ end='}' fold
Bram Moolenaarb17893a2020-03-14 08:19:51 +0100373exe 'syn region zshBrackets transparent start=/{/ms=s+1 skip=/\\}/ end=/}/ contains='.s:contained. ' fold'
374
Bram Moolenaarc81e5e72007-05-05 18:24:42 +0000375syn region zshSubst matchgroup=zshSubstDelim start='\${' skip='\\}'
Bram Moolenaar681baaf2016-02-04 20:57:07 +0100376 \ end='}' contains=@zshSubst,zshBrackets,zshQuoted,zshString fold
Bram Moolenaarb17893a2020-03-14 08:19:51 +0100377exe 'syn region zshOldSubst matchgroup=zshSubstDelim start=/`/ skip=/\\[\\`]/ end=/`/ contains='.s:contained. ',zshOldSubst fold'
Bram Moolenaarc81e5e72007-05-05 18:24:42 +0000378
Bram Moolenaarf2571c62015-06-09 19:44:55 +0200379syn sync minlines=50 maxlines=90
Bram Moolenaare37d50a2008-08-06 17:06:04 +0000380syn sync match zshHereDocSync grouphere NONE '<<-\=\s*\%(\\\=\S\+\|\(["']\)\S\+\1\)'
381syn sync match zshHereDocEndSync groupthere NONE '^\s*EO\a\+\>'
382
Bram Moolenaar23515b42020-11-29 14:36:24 +0100383syn 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
Bram Moolenaarc81e5e72007-05-05 18:24:42 +0000393hi def link zshTodo Todo
394hi def link zshComment Comment
395hi def link zshPreProc PreProc
396hi def link zshQuoted SpecialChar
Bram Moolenaarb17893a2020-03-14 08:19:51 +0100397hi def link zshPOSIXQuoted SpecialChar
Bram Moolenaarc81e5e72007-05-05 18:24:42 +0000398hi 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
Bram Moolenaarf2571c62015-06-09 19:44:55 +0200411hi def link zshOperator None
412hi def link zshRedir Operator
Bram Moolenaarc81e5e72007-05-05 18:24:42 +0000413hi def link zshVariable None
Bram Moolenaare37d50a2008-08-06 17:06:04 +0000414hi def link zshVariableDef zshVariable
Bram Moolenaarc81e5e72007-05-05 18:24:42 +0000415hi def link zshDereferencing PreProc
Bram Moolenaar94237492017-04-23 18:40:21 +0200416hi def link zshShortDeref zshDereferencing
417hi def link zshLongDeref zshDereferencing
418hi def link zshDeref zshDereferencing
419hi def link zshDollarVar zshDereferencing
Bram Moolenaarc81e5e72007-05-05 18:24:42 +0000420hi def link zshCommands Keyword
Bram Moolenaar94237492017-04-23 18:40:21 +0200421hi def link zshOptStart Keyword
422hi def link zshOption Constant
Bram Moolenaarc81e5e72007-05-05 18:24:42 +0000423hi 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
Bram Moolenaar94237492017-04-23 18:40:21 +0200430hi def link zshGlob zshSubst
Bram Moolenaarc81e5e72007-05-05 18:24:42 +0000431
Bram Moolenaar071d4272004-06-13 20:20:40 +0000432let b:current_syntax = "zsh"
433
Bram Moolenaarc81e5e72007-05-05 18:24:42 +0000434let &cpo = s:cpo_save
435unlet s:cpo_save