blob: 04b39aeac075fa038e6c5034c279679596ad75a4 [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>
Christian Brabandt202ebc62025-01-05 16:36:10 +01005" Latest Revision: 2024 Jan 04
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
Bram Moolenaar71b6d332022-09-10 13:13:14 +010022 for cluster in ['markdownHighlight_zsh', 'zsh']
Bram Moolenaarb17893a2020-03-14 08:19:51 +010023 try
Bram Moolenaar71b6d332022-09-10 13:13:14 +010024 " markdown syntax defines embedded clusters as @markdownhighlight_<lang>,
Bram Moolenaarb17893a2020-03-14 08:19:51 +010025 " 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 Moolenaarfa3b7232021-12-24 13:18:38 +000044syn match zshQuoted '\\.'
Bram Moolenaarb17893a2020-03-14 08:19:51 +010045syn match zshPOSIXQuoted '\\[xX][0-9a-fA-F]\{1,2}'
46syn match zshPOSIXQuoted '\\[0-7]\{1,3}'
47syn match zshPOSIXQuoted '\\u[0-9a-fA-F]\{1,4}'
48syn match zshPOSIXQuoted '\\U[1-9a-fA-F]\{1,8}'
Bram Moolenaarfa3b7232021-12-24 13:18:38 +000049
Bram Moolenaarc81e5e72007-05-05 18:24:42 +000050syn region zshString matchgroup=zshStringDelimiter start=+"+ end=+"+
Christian Brabandt202ebc62025-01-05 16:36:10 +010051 \ contains=@Spell,zshQuoted,@zshDerefs,@zshSubstQuoted fold
Bram Moolenaarf3913272016-02-25 00:00:01 +010052syn region zshString matchgroup=zshStringDelimiter start=+'+ end=+'+ fold
Christian Brabandt202ebc62025-01-05 16:36:10 +010053 \ contains=@Spell
Bram Moolenaarc81e5e72007-05-05 18:24:42 +000054syn region zshPOSIXString matchgroup=zshStringDelimiter start=+\$'+
Bram Moolenaarb17893a2020-03-14 08:19:51 +010055 \ skip=+\\[\\']+ end=+'+ contains=zshPOSIXQuoted,zshQuoted
Bram Moolenaarc81e5e72007-05-05 18:24:42 +000056syn match zshJobSpec '%\(\d\+\|?\=\w\+\|[%+-]\)'
Bram Moolenaar071d4272004-06-13 20:20:40 +000057
Bram Moolenaar71b6d332022-09-10 13:13:14 +010058syn match zshNumber '[+-]\=\<\d\+\>'
59syn match zshNumber '[+-]\=\<0x\x\+\>'
60syn match zshNumber '[+-]\=\<0\o\+\>'
61syn match zshNumber '[+-]\=\d\+#[-+]\=\w\+\>'
62syn match zshNumber '[+-]\=\d\+\.\d\+\>'
63
Bram Moolenaarc81e5e72007-05-05 18:24:42 +000064syn keyword zshPrecommand noglob nocorrect exec command builtin - time
Bram Moolenaar071d4272004-06-13 20:20:40 +000065
Bram Moolenaarf2571c62015-06-09 19:44:55 +020066syn keyword zshDelimiter do done end
Bram Moolenaar071d4272004-06-13 20:20:40 +000067
Bram Moolenaar71b6d332022-09-10 13:13:14 +010068syn keyword zshConditional if then elif else fi esac select
69
70syn keyword zshCase case nextgroup=zshCaseWord skipwhite
71syn match zshCaseWord /\S\+/ nextgroup=zshCaseIn skipwhite contained transparent
Christian Brabandt202ebc62025-01-05 16:36:10 +010072syn keyword zshCaseIn in nextgroup=zshComment,zshCasePattern skipwhite skipnl contained
Bram Moolenaar71b6d332022-09-10 13:13:14 +010073syn match zshCasePattern /\S[^)]*)/ contained
Bram Moolenaar071d4272004-06-13 20:20:40 +000074
Bram Moolenaare37d50a2008-08-06 17:06:04 +000075syn keyword zshRepeat while until repeat
76
77syn keyword zshRepeat for foreach nextgroup=zshVariable skipwhite
Bram Moolenaar071d4272004-06-13 20:20:40 +000078
Bram Moolenaarc81e5e72007-05-05 18:24:42 +000079syn keyword zshException always
Bram Moolenaar071d4272004-06-13 20:20:40 +000080
Bram Moolenaarc81e5e72007-05-05 18:24:42 +000081syn keyword zshKeyword function nextgroup=zshKSHFunction skipwhite
Bram Moolenaar071d4272004-06-13 20:20:40 +000082
Bram Moolenaarf3913272016-02-25 00:00:01 +010083syn match zshKSHFunction contained '\w\S\+'
Bram Moolenaarc81e5e72007-05-05 18:24:42 +000084syn match zshFunction '^\s*\k\+\ze\s*()'
85
86syn match zshOperator '||\|&&\|;\|&!\='
87
Bram Moolenaar71b6d332022-09-10 13:13:14 +010088 " <<<, <, <>, and variants.
89syn match zshRedir '\d\=\(<<<\|<&\s*[0-9p-]\=\|<>\?\)'
90 " >, >>, and variants.
91syn match zshRedir '\d\=\(>&\s*[0-9p-]\=\|&>>\?\|>>\?&\?\)[|!]\='
Viktor Szépedbf749b2023-10-16 09:53:37 +020092 " | and |&, but only if it's not preceded or
Bram Moolenaar71b6d332022-09-10 13:13:14 +010093 " followed by a | to avoid matching ||.
94syn match zshRedir '|\@1<!|&\=|\@!'
Bram Moolenaarc81e5e72007-05-05 18:24:42 +000095
Bram Moolenaarc81e5e72007-05-05 18:24:42 +000096syn region zshHereDoc matchgroup=zshRedir
Bram Moolenaare37d50a2008-08-06 17:06:04 +000097 \ start='<\@<!<<\s*\z([^<]\S*\)'
Christian Brabandt202ebc62025-01-05 16:36:10 +010098 \ end='^\z1$'
99 \ contains=@Spell,@zshSubst,@zshDerefs,zshQuoted,zshPOSIXString
Bram Moolenaarc81e5e72007-05-05 18:24:42 +0000100syn region zshHereDoc matchgroup=zshRedir
Bram Moolenaare37d50a2008-08-06 17:06:04 +0000101 \ start='<\@<!<<\s*\\\z(\S\+\)'
Christian Brabandt202ebc62025-01-05 16:36:10 +0100102 \ end='^\z1$'
103 \ contains=@Spell
Bram Moolenaare37d50a2008-08-06 17:06:04 +0000104syn region zshHereDoc matchgroup=zshRedir
105 \ start='<\@<!<<-\s*\\\=\z(\S\+\)'
Christian Brabandt202ebc62025-01-05 16:36:10 +0100106 \ end='^\t*\z1$'
107 \ contains=@Spell
Bram Moolenaare37d50a2008-08-06 17:06:04 +0000108syn region zshHereDoc matchgroup=zshRedir
Bram Moolenaarf2571c62015-06-09 19:44:55 +0200109 \ start=+<\@<!<<\s*\(["']\)\z(\S\+\)\1+
Christian Brabandt202ebc62025-01-05 16:36:10 +0100110 \ end='^\z1$'
111 \ contains=@Spell
Bram Moolenaare37d50a2008-08-06 17:06:04 +0000112syn region zshHereDoc matchgroup=zshRedir
113 \ start=+<\@<!<<-\s*\(["']\)\z(\S\+\)\1+
Christian Brabandt202ebc62025-01-05 16:36:10 +0100114 \ end='^\t*\z1$'
115 \ contains=@Spell
Bram Moolenaarc81e5e72007-05-05 18:24:42 +0000116
Bram Moolenaare37d50a2008-08-06 17:06:04 +0000117syn match zshVariable '\<\h\w*' contained
118
119syn match zshVariableDef '\<\h\w*\ze+\=='
Bram Moolenaarc81e5e72007-05-05 18:24:42 +0000120" XXX: how safe is this?
Bram Moolenaare37d50a2008-08-06 17:06:04 +0000121syn region zshVariableDef oneline
Bram Moolenaar94237492017-04-23 18:40:21 +0200122 \ start='\$\@<!\<\h\w*\[' end='\]\ze+\?=\?'
Bram Moolenaarc81e5e72007-05-05 18:24:42 +0000123 \ contains=@zshSubst
124
Bram Moolenaar94237492017-04-23 18:40:21 +0200125syn cluster zshDerefs contains=zshShortDeref,zshLongDeref,zshDeref,zshDollarVar
Bram Moolenaarc81e5e72007-05-05 18:24:42 +0000126
Bram Moolenaar94237492017-04-23 18:40:21 +0200127syn match zshShortDeref '\$[!#$*@?_-]\w\@!'
128syn match zshShortDeref '\$[=^~]*[#+]*\d\+\>'
Bram Moolenaar071d4272004-06-13 20:20:40 +0000129
Bram Moolenaar94237492017-04-23 18:40:21 +0200130syn match zshLongDeref '\$\%(ARGC\|argv\|status\|pipestatus\|CPUTYPE\|EGID\|EUID\|ERRNO\|GID\|HOST\|LINENO\|LOGNAME\)'
131syn match zshLongDeref '\$\%(MACHTYPE\|OLDPWD OPTARG\|OPTIND\|OSTYPE\|PPID\|PWD\|RANDOM\|SECONDS\|SHLVL\|signals\)'
132syn match zshLongDeref '\$\%(TRY_BLOCK_ERROR\|TTY\|TTYIDLE\|UID\|USERNAME\|VENDOR\|ZSH_NAME\|ZSH_VERSION\|REPLY\|reply\|TERM\)'
Bram Moolenaarc81e5e72007-05-05 18:24:42 +0000133
Bram Moolenaar94237492017-04-23 18:40:21 +0200134syn match zshDollarVar '\$\h\w*'
135syn match zshDeref '\$[=^~]*[#+]*\h\w*\>'
Bram Moolenaarc81e5e72007-05-05 18:24:42 +0000136
137syn match zshCommands '\%(^\|\s\)[.:]\ze\s'
138syn keyword zshCommands alias autoload bg bindkey break bye cap cd
139 \ chdir clone comparguments compcall compctl
140 \ compdescribe compfiles compgroups compquote
141 \ comptags comptry compvalues continue dirs
142 \ disable disown echo echotc echoti emulate
143 \ enable eval exec exit export false fc fg
144 \ functions getcap getln getopts hash history
145 \ jobs kill let limit log logout popd print
Bram Moolenaar71b6d332022-09-10 13:13:14 +0100146 \ printf prompt pushd pushln pwd r read
Bram Moolenaar94237492017-04-23 18:40:21 +0200147 \ rehash return sched set setcap shift
Bram Moolenaarc81e5e72007-05-05 18:24:42 +0000148 \ source stat suspend test times trap true
149 \ ttyctl type ulimit umask unalias unfunction
Bram Moolenaar94237492017-04-23 18:40:21 +0200150 \ unhash unlimit unset vared wait
Bram Moolenaarc81e5e72007-05-05 18:24:42 +0000151 \ whence where which zcompile zformat zftp zle
Bram Moolenaar7db25fe2018-05-13 00:02:36 +0200152 \ zmodload zparseopts zprof zpty zrecompile
153 \ zregexparse zsocket zstyle ztcp
Bram Moolenaarc81e5e72007-05-05 18:24:42 +0000154
Bram Moolenaarfa3b7232021-12-24 13:18:38 +0000155" Options, generated by from the zsh source with the make-options.zsh script.
Bram Moolenaarf2571c62015-06-09 19:44:55 +0200156syn case ignore
Bram Moolenaarfa3b7232021-12-24 13:18:38 +0000157syn match zshOptStart
158 \ /\v^\s*%(%(un)?setopt|set\s+[-+]o)/
159 \ nextgroup=zshOption skipwhite
Bram Moolenaar71b6d332022-09-10 13:13:14 +0100160syn keyword zshOption nextgroup=zshOption,zshComment skipwhite contained
161 \ auto_cd no_auto_cd autocd noautocd auto_pushd no_auto_pushd autopushd noautopushd cdable_vars
162 \ no_cdable_vars cdablevars nocdablevars cd_silent no_cd_silent cdsilent nocdsilent chase_dots
163 \ no_chase_dots chasedots nochasedots chase_links no_chase_links chaselinks nochaselinks posix_cd
164 \ posixcd no_posix_cd noposixcd pushd_ignore_dups no_pushd_ignore_dups pushdignoredups
165 \ nopushdignoredups pushd_minus no_pushd_minus pushdminus nopushdminus pushd_silent no_pushd_silent
166 \ pushdsilent nopushdsilent pushd_to_home no_pushd_to_home pushdtohome nopushdtohome
167 \ always_last_prompt no_always_last_prompt alwayslastprompt noalwayslastprompt always_to_end
168 \ no_always_to_end alwaystoend noalwaystoend auto_list no_auto_list autolist noautolist auto_menu
169 \ no_auto_menu automenu noautomenu auto_name_dirs no_auto_name_dirs autonamedirs noautonamedirs
170 \ auto_param_keys no_auto_param_keys autoparamkeys noautoparamkeys auto_param_slash
171 \ no_auto_param_slash autoparamslash noautoparamslash auto_remove_slash no_auto_remove_slash
172 \ autoremoveslash noautoremoveslash bash_auto_list no_bash_auto_list bashautolist nobashautolist
173 \ complete_aliases no_complete_aliases completealiases nocompletealiases complete_in_word
174 \ no_complete_in_word completeinword nocompleteinword glob_complete no_glob_complete globcomplete
175 \ noglobcomplete hash_list_all no_hash_list_all hashlistall nohashlistall list_ambiguous
176 \ no_list_ambiguous listambiguous nolistambiguous list_beep no_list_beep listbeep nolistbeep
177 \ list_packed no_list_packed listpacked nolistpacked list_rows_first no_list_rows_first listrowsfirst
178 \ nolistrowsfirst list_types no_list_types listtypes nolisttypes menu_complete no_menu_complete
179 \ menucomplete nomenucomplete rec_exact no_rec_exact recexact norecexact bad_pattern no_bad_pattern
180 \ badpattern nobadpattern bare_glob_qual no_bare_glob_qual bareglobqual nobareglobqual brace_ccl
181 \ no_brace_ccl braceccl nobraceccl case_glob no_case_glob caseglob nocaseglob case_match
182 \ no_case_match casematch nocasematch case_paths no_case_paths casepaths nocasepaths csh_null_glob
183 \ no_csh_null_glob cshnullglob nocshnullglob equals no_equals noequals extended_glob no_extended_glob
184 \ extendedglob noextendedglob force_float no_force_float forcefloat noforcefloat glob no_glob noglob
185 \ glob_assign no_glob_assign globassign noglobassign glob_dots no_glob_dots globdots noglobdots
186 \ glob_star_short no_glob_star_short globstarshort noglobstarshort glob_subst no_glob_subst globsubst
187 \ noglobsubst hist_subst_pattern no_hist_subst_pattern histsubstpattern nohistsubstpattern
188 \ ignore_braces no_ignore_braces ignorebraces noignorebraces ignore_close_braces
189 \ no_ignore_close_braces ignoreclosebraces noignoreclosebraces ksh_glob no_ksh_glob kshglob nokshglob
190 \ magic_equal_subst no_magic_equal_subst magicequalsubst nomagicequalsubst mark_dirs no_mark_dirs
191 \ markdirs nomarkdirs multibyte no_multibyte nomultibyte nomatch no_nomatch nonomatch null_glob
192 \ no_null_glob nullglob nonullglob numeric_glob_sort no_numeric_glob_sort numericglobsort
193 \ nonumericglobsort rc_expand_param no_rc_expand_param rcexpandparam norcexpandparam rematch_pcre
194 \ no_rematch_pcre rematchpcre norematchpcre sh_glob no_sh_glob shglob noshglob unset no_unset nounset
195 \ warn_create_global no_warn_create_global warncreateglobal nowarncreateglobal warn_nested_var
196 \ no_warn_nested_var warnnestedvar no_warnnestedvar append_history no_append_history appendhistory
197 \ noappendhistory bang_hist no_bang_hist banghist nobanghist extended_history no_extended_history
198 \ extendedhistory noextendedhistory hist_allow_clobber no_hist_allow_clobber histallowclobber
199 \ nohistallowclobber hist_beep no_hist_beep histbeep nohistbeep hist_expire_dups_first
200 \ no_hist_expire_dups_first histexpiredupsfirst nohistexpiredupsfirst hist_fcntl_lock
201 \ no_hist_fcntl_lock histfcntllock nohistfcntllock hist_find_no_dups no_hist_find_no_dups
202 \ histfindnodups nohistfindnodups hist_ignore_all_dups no_hist_ignore_all_dups histignorealldups
203 \ nohistignorealldups hist_ignore_dups no_hist_ignore_dups histignoredups nohistignoredups
204 \ hist_ignore_space no_hist_ignore_space histignorespace nohistignorespace hist_lex_words
205 \ no_hist_lex_words histlexwords nohistlexwords hist_no_functions no_hist_no_functions
206 \ histnofunctions nohistnofunctions hist_no_store no_hist_no_store histnostore nohistnostore
207 \ hist_reduce_blanks no_hist_reduce_blanks histreduceblanks nohistreduceblanks hist_save_by_copy
208 \ no_hist_save_by_copy histsavebycopy nohistsavebycopy hist_save_no_dups no_hist_save_no_dups
209 \ histsavenodups nohistsavenodups hist_verify no_hist_verify histverify nohistverify
210 \ inc_append_history no_inc_append_history incappendhistory noincappendhistory
211 \ inc_append_history_time no_inc_append_history_time incappendhistorytime noincappendhistorytime
212 \ share_history no_share_history sharehistory nosharehistory all_export no_all_export allexport
213 \ noallexport global_export no_global_export globalexport noglobalexport global_rcs no_global_rcs
214 \ globalrcs noglobalrcs rcs no_rcs norcs aliases no_aliases noaliases clobber no_clobber noclobber
215 \ clobber_empty no_clobber_empty clobberempty noclobberempty correct no_correct nocorrect correct_all
216 \ no_correct_all correctall nocorrectall dvorak no_dvorak nodvorak flow_control no_flow_control
217 \ flowcontrol noflowcontrol ignore_eof no_ignore_eof ignoreeof noignoreeof interactive_comments
218 \ no_interactive_comments interactivecomments nointeractivecomments hash_cmds no_hash_cmds hashcmds
219 \ nohashcmds hash_dirs no_hash_dirs hashdirs nohashdirs hash_executables_only
220 \ no_hash_executables_only hashexecutablesonly nohashexecutablesonly mail_warning no_mail_warning
221 \ mailwarning nomailwarning path_dirs no_path_dirs pathdirs nopathdirs path_script no_path_script
222 \ pathscript nopathscript print_eight_bit no_print_eight_bit printeightbit noprinteightbit
223 \ print_exit_value no_print_exit_value printexitvalue noprintexitvalue rc_quotes no_rc_quotes
224 \ rcquotes norcquotes rm_star_silent no_rm_star_silent rmstarsilent normstarsilent rm_star_wait
225 \ no_rm_star_wait rmstarwait normstarwait short_loops no_short_loops shortloops noshortloops
226 \ short_repeat no_short_repeat shortrepeat noshortrepeat sun_keyboard_hack no_sun_keyboard_hack
227 \ sunkeyboardhack nosunkeyboardhack auto_continue no_auto_continue autocontinue noautocontinue
228 \ auto_resume no_auto_resume autoresume noautoresume bg_nice no_bg_nice bgnice nobgnice check_jobs
229 \ no_check_jobs checkjobs nocheckjobs check_running_jobs no_check_running_jobs checkrunningjobs
230 \ nocheckrunningjobs hup no_hup nohup long_list_jobs no_long_list_jobs longlistjobs nolonglistjobs
231 \ monitor no_monitor nomonitor notify no_notify nonotify posix_jobs posixjobs no_posix_jobs
232 \ noposixjobs prompt_bang no_prompt_bang promptbang nopromptbang prompt_cr no_prompt_cr promptcr
233 \ nopromptcr prompt_sp no_prompt_sp promptsp nopromptsp prompt_percent no_prompt_percent
234 \ promptpercent nopromptpercent prompt_subst no_prompt_subst promptsubst nopromptsubst
235 \ transient_rprompt no_transient_rprompt transientrprompt notransientrprompt alias_func_def
236 \ no_alias_func_def aliasfuncdef noaliasfuncdef c_bases no_c_bases cbases nocbases c_precedences
237 \ no_c_precedences cprecedences nocprecedences debug_before_cmd no_debug_before_cmd debugbeforecmd
238 \ nodebugbeforecmd err_exit no_err_exit errexit noerrexit err_return no_err_return errreturn
239 \ noerrreturn eval_lineno no_eval_lineno evallineno noevallineno exec no_exec noexec function_argzero
240 \ no_function_argzero functionargzero nofunctionargzero local_loops no_local_loops localloops
241 \ nolocalloops local_options no_local_options localoptions nolocaloptions local_patterns
242 \ no_local_patterns localpatterns nolocalpatterns local_traps no_local_traps localtraps nolocaltraps
243 \ multi_func_def no_multi_func_def multifuncdef nomultifuncdef multios no_multios nomultios
244 \ octal_zeroes no_octal_zeroes octalzeroes nooctalzeroes pipe_fail no_pipe_fail pipefail nopipefail
245 \ source_trace no_source_trace sourcetrace nosourcetrace typeset_silent no_typeset_silent
246 \ typesetsilent notypesetsilent typeset_to_unset no_typeset_to_unset typesettounset notypesettounset
247 \ verbose no_verbose noverbose xtrace no_xtrace noxtrace append_create no_append_create appendcreate
248 \ noappendcreate bash_rematch no_bash_rematch bashrematch nobashrematch bsd_echo no_bsd_echo bsdecho
249 \ nobsdecho continue_on_error no_continue_on_error continueonerror nocontinueonerror
250 \ csh_junkie_history no_csh_junkie_history cshjunkiehistory nocshjunkiehistory csh_junkie_loops
251 \ no_csh_junkie_loops cshjunkieloops nocshjunkieloops csh_junkie_quotes no_csh_junkie_quotes
252 \ cshjunkiequotes nocshjunkiequotes csh_nullcmd no_csh_nullcmd cshnullcmd nocshnullcmd ksh_arrays
253 \ no_ksh_arrays ksharrays noksharrays ksh_autoload no_ksh_autoload kshautoload nokshautoload
254 \ ksh_option_print no_ksh_option_print kshoptionprint nokshoptionprint ksh_typeset no_ksh_typeset
255 \ kshtypeset nokshtypeset ksh_zero_subscript no_ksh_zero_subscript kshzerosubscript
256 \ nokshzerosubscript posix_aliases no_posix_aliases posixaliases noposixaliases posix_argzero
257 \ no_posix_argzero posixargzero noposixargzero posix_builtins no_posix_builtins posixbuiltins
258 \ noposixbuiltins posix_identifiers no_posix_identifiers posixidentifiers noposixidentifiers
259 \ posix_strings no_posix_strings posixstrings noposixstrings posix_traps no_posix_traps posixtraps
260 \ noposixtraps sh_file_expansion no_sh_file_expansion shfileexpansion noshfileexpansion sh_nullcmd
261 \ no_sh_nullcmd shnullcmd noshnullcmd sh_option_letters no_sh_option_letters shoptionletters
262 \ noshoptionletters sh_word_split no_sh_word_split shwordsplit noshwordsplit traps_async
263 \ no_traps_async trapsasync notrapsasync interactive no_interactive nointeractive login no_login
264 \ nologin privileged no_privileged noprivileged restricted no_restricted norestricted shin_stdin
265 \ no_shin_stdin shinstdin noshinstdin single_command no_single_command singlecommand nosinglecommand
266 \ beep no_beep nobeep combining_chars no_combining_chars combiningchars nocombiningchars emacs
267 \ no_emacs noemacs overstrike no_overstrike nooverstrike single_line_zle no_single_line_zle
268 \ singlelinezle nosinglelinezle vi no_vi novi zle no_zle nozle brace_expand no_brace_expand
269 \ braceexpand nobraceexpand dot_glob no_dot_glob dotglob nodotglob hash_all no_hash_all hashall
270 \ nohashall hist_append no_hist_append histappend nohistappend hist_expand no_hist_expand histexpand
271 \ nohistexpand log no_log nolog mail_warn no_mail_warn mailwarn nomailwarn one_cmd no_one_cmd onecmd
272 \ noonecmd physical no_physical nophysical prompt_vars no_prompt_vars promptvars nopromptvars stdin
273 \ no_stdin nostdin track_all no_track_all trackall notrackall
Bram Moolenaar23515b42020-11-29 14:36:24 +0100274syn case match
275
Bram Moolenaar2f058492017-11-30 20:27:52 +0100276syn keyword zshTypes float integer local typeset declare private readonly
Bram Moolenaarc81e5e72007-05-05 18:24:42 +0000277
278" XXX: this may be too much
279" syn match zshSwitches '\s\zs--\=[a-zA-Z0-9-]\+'
280
Bram Moolenaare37d50a2008-08-06 17:06:04 +0000281" TODO: $[...] is the same as $((...)), so add that as well.
Bram Moolenaarc81e5e72007-05-05 18:24:42 +0000282syn cluster zshSubst contains=zshSubst,zshOldSubst,zshMathSubst
Bram Moolenaar71b6d332022-09-10 13:13:14 +0100283syn cluster zshSubstQuoted contains=zshSubstQuoted,zshOldSubst,zshMathSubst
Bram Moolenaarb17893a2020-03-14 08:19:51 +0100284exe 'syn region zshSubst matchgroup=zshSubstDelim transparent start=/\$(/ skip=/\\)/ end=/)/ contains='.s:contained. ' fold'
Bram Moolenaar71b6d332022-09-10 13:13:14 +0100285exe 'syn region zshSubstQuoted matchgroup=zshSubstDelim transparent start=/\$(/ skip=/\\)/ end=/)/ contains='.s:contained. ' fold'
286syn region zshSubstQuoted matchgroup=zshSubstDelim start='\${' skip='\\}' end='}' contains=@zshSubst,zshBrackets,zshQuoted fold
Bram Moolenaar681baaf2016-02-04 20:57:07 +0100287syn region zshParentheses transparent start='(' skip='\\)' end=')' fold
Bram Moolenaar94237492017-04-23 18:40:21 +0200288syn region zshGlob start='(#' end=')'
Bram Moolenaarc81e5e72007-05-05 18:24:42 +0000289syn region zshMathSubst matchgroup=zshSubstDelim transparent
Bram Moolenaar23515b42020-11-29 14:36:24 +0100290 \ start='\%(\$\?\)[<=>]\@<!((' skip='\\)' end='))'
Bram Moolenaarc81e5e72007-05-05 18:24:42 +0000291 \ contains=zshParentheses,@zshSubst,zshNumber,
Bram Moolenaarfa3b7232021-12-24 13:18:38 +0000292 \ @zshDerefs,zshString fold
Bram Moolenaarb17893a2020-03-14 08:19:51 +0100293" The ms=s+1 prevents matching zshBrackets several times on opening brackets
294" (see https://github.com/chrisbra/vim-zsh/issues/21#issuecomment-576330348)
295syn region zshBrackets contained transparent start='{'ms=s+1 skip='\\}'
Bram Moolenaar681baaf2016-02-04 20:57:07 +0100296 \ end='}' fold
Bram Moolenaarb17893a2020-03-14 08:19:51 +0100297exe 'syn region zshBrackets transparent start=/{/ms=s+1 skip=/\\}/ end=/}/ contains='.s:contained. ' fold'
298
Bram Moolenaarc81e5e72007-05-05 18:24:42 +0000299syn region zshSubst matchgroup=zshSubstDelim start='\${' skip='\\}'
Bram Moolenaar681baaf2016-02-04 20:57:07 +0100300 \ end='}' contains=@zshSubst,zshBrackets,zshQuoted,zshString fold
Bram Moolenaarb17893a2020-03-14 08:19:51 +0100301exe 'syn region zshOldSubst matchgroup=zshSubstDelim start=/`/ skip=/\\[\\`]/ end=/`/ contains='.s:contained. ',zshOldSubst fold'
Bram Moolenaarc81e5e72007-05-05 18:24:42 +0000302
Bram Moolenaarf2571c62015-06-09 19:44:55 +0200303syn sync minlines=50 maxlines=90
Bram Moolenaare37d50a2008-08-06 17:06:04 +0000304syn sync match zshHereDocSync grouphere NONE '<<-\=\s*\%(\\\=\S\+\|\(["']\)\S\+\1\)'
305syn sync match zshHereDocEndSync groupthere NONE '^\s*EO\a\+\>'
306
Bram Moolenaar23515b42020-11-29 14:36:24 +0100307syn keyword zshTodo contained TODO FIXME XXX NOTE
308
309syn region zshComment oneline start='\%(^\|\s\+\)#' end='$'
310 \ contains=zshTodo,@Spell fold
311
312syn region zshComment start='^\s*#' end='^\%(\s*#\)\@!'
313 \ contains=zshTodo,@Spell fold
314
315syn match zshPreProc '^\%1l#\%(!\|compdef\|autoload\).*$'
316
Bram Moolenaarc81e5e72007-05-05 18:24:42 +0000317hi def link zshTodo Todo
318hi def link zshComment Comment
319hi def link zshPreProc PreProc
320hi def link zshQuoted SpecialChar
Bram Moolenaarb17893a2020-03-14 08:19:51 +0100321hi def link zshPOSIXQuoted SpecialChar
Bram Moolenaarc81e5e72007-05-05 18:24:42 +0000322hi def link zshString String
323hi def link zshStringDelimiter zshString
324hi def link zshPOSIXString zshString
325hi def link zshJobSpec Special
326hi def link zshPrecommand Special
327hi def link zshDelimiter Keyword
328hi def link zshConditional Conditional
Bram Moolenaar71b6d332022-09-10 13:13:14 +0100329hi def link zshCase zshConditional
330hi def link zshCaseIn zshCase
Bram Moolenaarc81e5e72007-05-05 18:24:42 +0000331hi def link zshException Exception
332hi def link zshRepeat Repeat
333hi def link zshKeyword Keyword
334hi def link zshFunction None
335hi def link zshKSHFunction zshFunction
336hi def link zshHereDoc String
Bram Moolenaarf2571c62015-06-09 19:44:55 +0200337hi def link zshOperator None
338hi def link zshRedir Operator
Bram Moolenaarc81e5e72007-05-05 18:24:42 +0000339hi def link zshVariable None
Bram Moolenaare37d50a2008-08-06 17:06:04 +0000340hi def link zshVariableDef zshVariable
Bram Moolenaarc81e5e72007-05-05 18:24:42 +0000341hi def link zshDereferencing PreProc
Bram Moolenaar94237492017-04-23 18:40:21 +0200342hi def link zshShortDeref zshDereferencing
343hi def link zshLongDeref zshDereferencing
344hi def link zshDeref zshDereferencing
345hi def link zshDollarVar zshDereferencing
Bram Moolenaarc81e5e72007-05-05 18:24:42 +0000346hi def link zshCommands Keyword
Bram Moolenaar94237492017-04-23 18:40:21 +0200347hi def link zshOptStart Keyword
348hi def link zshOption Constant
Bram Moolenaarc81e5e72007-05-05 18:24:42 +0000349hi def link zshTypes Type
350hi def link zshSwitches Special
351hi def link zshNumber Number
352hi def link zshSubst PreProc
Bram Moolenaar71b6d332022-09-10 13:13:14 +0100353hi def link zshSubstQuoted zshSubst
Bram Moolenaarc81e5e72007-05-05 18:24:42 +0000354hi def link zshMathSubst zshSubst
355hi def link zshOldSubst zshSubst
356hi def link zshSubstDelim zshSubst
Bram Moolenaar94237492017-04-23 18:40:21 +0200357hi def link zshGlob zshSubst
Bram Moolenaarc81e5e72007-05-05 18:24:42 +0000358
Bram Moolenaar071d4272004-06-13 20:20:40 +0000359let b:current_syntax = "zsh"
360
Bram Moolenaarc81e5e72007-05-05 18:24:42 +0000361let &cpo = s:cpo_save
362unlet s:cpo_save