blob: b0e02b9813ec340e740b2ed115d715701ea1481a [file] [log] [blame]
Bram Moolenaar071d4272004-06-13 20:20:40 +00001" Vim syntax file
2" Language: shell (sh) Korn shell (ksh) bash (sh)
Christian Brabandtf9ca1392024-02-19 20:37:11 +01003" Maintainer: This runtime file is looking for a new maintainer.
4" Previous Maintainers: Charles E. Campbell
5" Lennart Schultz <Lennart.Schultz@ecmwf.int>
dkearns1bdc9432024-03-05 05:14:08 +11006" Last Change: 2024 Mar 04 by Vim Project
Aliaksei Budavei48fa3192024-12-30 10:23:50 +01007" 2024 Nov 03 by Aliaksei Budavei <0x000c70 AT gmail DOT com> (improved bracket expressions, #15941)
Christian Brabandt3159b642025-01-06 18:50:15 +01008" 2025 Jan 06 add $PS0 to bashSpecialVariables (#16394)
Eisuke Kawashima54cb5142025-01-18 10:11:28 +01009" 2025 Jan 18 add bash coproc, remove duplicate syn keywords (#16467)
Mohamed Akram51a06ec2025-03-21 17:52:08 +010010" 2025 Mar 21 update shell capability detection (#16939)
Doug Kearns6099db92025-04-03 21:13:39 +020011" 2025 Apr 03 command substitution opening paren at EOL (#17026)
Aliaksei Budavei5c84d122025-04-10 21:52:14 +020012" 2025 Apr 10 improve shell detection (#17084)
Doug Kearnsf57c0652025-04-30 20:04:28 +020013" 2025 Apr 29 match escaped chars in test operands (#17221)
Doug Kearnsfe228672025-05-05 20:10:11 +020014" 2025 May 06 improve single-quote string matching in parameter expansions
Doug Kearns87947a92025-05-06 17:59:25 +020015" 2025 May 06 match KornShell compound arrays
Doug Kearns839b79e2025-05-10 20:57:10 +020016" 2025 May 10 improve wildcard character class lists
Bram Moolenaar71badf92023-04-22 22:40:14 +010017" Version: 208
Christian Brabandtf9ca1392024-02-19 20:37:11 +010018" Former URL: http://www.drchip.org/astronaut/vim/index.html#SYNTAX_SH
Bram Moolenaare2719092015-01-10 15:09:25 +010019" For options and settings, please use: :help ft-sh-syntax
Bram Moolenaar23515b42020-11-29 14:36:24 +010020" This file includes many ideas from Eric Brunet (eric.brunet@ens.fr) and heredoc fixes from Felipe Contreras
Bram Moolenaar071d4272004-06-13 20:20:40 +000021
Bram Moolenaarf37506f2016-08-31 22:22:10 +020022" quit when a syntax file was already loaded {{{1
Bram Moolenaar89bcfda2016-08-30 23:26:57 +020023if exists("b:current_syntax")
Bram Moolenaar071d4272004-06-13 20:20:40 +000024 finish
25endif
26
Mohamed Akram51a06ec2025-03-21 17:52:08 +010027" Ensure this is set unless we find another shell
28let b:is_sh = 1
29
Bram Moolenaard2ea7cf2021-05-30 20:54:13 +020030" If the shell script itself specifies which shell to use, use it
Aliaksei Budavei5c84d122025-04-10 21:52:14 +020031let s:shebang = getline(1)
32
33if s:shebang =~ '^#!.\{-2,}\<ksh\>'
Bram Moolenaar91c49372016-05-08 09:50:29 +020034 let b:is_kornshell = 1
Aliaksei Budavei5c84d122025-04-10 21:52:14 +020035elseif s:shebang =~ '^#!.\{-2,}\<bash\>'
Bram Moolenaar91c49372016-05-08 09:50:29 +020036 let b:is_bash = 1
Aliaksei Budavei5c84d122025-04-10 21:52:14 +020037elseif s:shebang =~ '^#!.\{-2,}\<dash\>'
Bram Moolenaard58a3bf2020-09-28 21:48:16 +020038 let b:is_dash = 1
Bram Moolenaard4755bb2004-09-02 19:12:26 +000039" handling /bin/sh with is_kornshell/is_sh {{{1
Bram Moolenaard2ea7cf2021-05-30 20:54:13 +020040" b:is_sh will be set when "#! /bin/sh" is found;
Bram Moolenaar071d4272004-06-13 20:20:40 +000041" However, it often is just a masquerade by bash (typically Linux)
42" or kornshell (typically workstations with Posix "sh").
Mohamed Akram51a06ec2025-03-21 17:52:08 +010043" So, when the user sets "g:is_kornshell", "g:is_bash",
44" "g:is_posix" or "g:is_dash", a b:is_sh is converted into
45" b:is_kornshell/b:is_bash/b:is_posix/b:is_dash, respectively.
46elseif !exists("b:is_kornshell") && !exists("b:is_bash") && !exists("b:is_posix") && !exists("b:is_dash")
47 if exists("g:is_kornshell")
48 let b:is_kornshell= 1
49 elseif exists("g:is_bash")
50 let b:is_bash= 1
51 elseif exists("g:is_dash")
52 let b:is_dash= 1
53 elseif exists("g:is_posix")
54 let b:is_posix= 1
55 elseif exists("g:is_sh")
56 let b:is_sh= 1
57 else
58 " user did not specify which shell to use, and
59 " the script itself does not specify which shell to use. FYI: /bin/sh is ambiguous.
60 " Assuming /bin/sh is executable, and if its a link, find out what it links to.
61 let s:shell = ""
62 if executable("/bin/sh")
63 let s:shell = resolve("/bin/sh")
64 elseif executable("/usr/bin/sh")
65 let s:shell = resolve("/usr/bin/sh")
Bram Moolenaar7fc904b2006-04-13 20:37:35 +000066 endif
Mohamed Akram51a06ec2025-03-21 17:52:08 +010067 if s:shell =~ '\<ksh\>'
68 let b:is_kornshell= 1
69 elseif s:shell =~ '\<bash\>'
70 let b:is_bash = 1
71 elseif s:shell =~ '\<dash\>'
72 let b:is_dash = 1
Bram Moolenaar071d4272004-06-13 20:20:40 +000073 else
Mohamed Akram51a06ec2025-03-21 17:52:08 +010074 let b:is_posix = 1
Bram Moolenaar071d4272004-06-13 20:20:40 +000075 endif
Mohamed Akram51a06ec2025-03-21 17:52:08 +010076 unlet s:shell
77 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +000078endif
79
Aliaksei Budavei5c84d122025-04-10 21:52:14 +020080unlet s:shebang
81
Bram Moolenaard58a3bf2020-09-28 21:48:16 +020082" if b:is_dash, set b:is_posix too
83if exists("b:is_dash")
84 let b:is_posix= 1
85endif
86
Mohamed Akram51a06ec2025-03-21 17:52:08 +010087if exists("b:is_kornshell") || exists("b:is_bash")
88 if exists("b:is_sh")
89 unlet b:is_sh
90 endif
91endif
92
Bram Moolenaarcd71fa32005-03-11 22:46:48 +000093" set up default g:sh_fold_enabled {{{1
Bram Moolenaarb4ff5182015-11-10 21:15:48 +010094" ================================
Bram Moolenaar071d4272004-06-13 20:20:40 +000095if !exists("g:sh_fold_enabled")
96 let g:sh_fold_enabled= 0
Bram Moolenaar293ee4d2004-12-09 21:34:53 +000097elseif g:sh_fold_enabled != 0 && !has("folding")
98 let g:sh_fold_enabled= 0
Bram Moolenaarcd71fa32005-03-11 22:46:48 +000099 echomsg "Ignoring g:sh_fold_enabled=".g:sh_fold_enabled."; need to re-compile vim for +fold support"
100endif
Bram Moolenaar86b48162022-12-06 18:20:10 +0000101let s:sh_fold_functions= and(g:sh_fold_enabled,1)
102let s:sh_fold_heredoc = and(g:sh_fold_enabled,2)
103let s:sh_fold_ifdofor = and(g:sh_fold_enabled,4)
Bram Moolenaarcd71fa32005-03-11 22:46:48 +0000104if g:sh_fold_enabled && &fdm == "manual"
Bram Moolenaar97d62492012-11-15 21:28:22 +0100105 " Given that the user provided g:sh_fold_enabled
106 " AND g:sh_fold_enabled is manual (usual default)
107 " implies a desire for syntax-based folding
108 setl fdm=syntax
Bram Moolenaar071d4272004-06-13 20:20:40 +0000109endif
110
Bram Moolenaard2ea7cf2021-05-30 20:54:13 +0200111" set up the syntax-highlighting for iskeyword
Bram Moolenaar723dd942019-04-04 13:11:03 +0200112if (v:version == 704 && has("patch-7.4.1142")) || v:version > 704
Bram Moolenaard2ea7cf2021-05-30 20:54:13 +0200113 if !exists("g:sh_syntax_isk") || (exists("g:sh_syntax_isk") && g:sh_syntax_isk)
114 if exists("b:is_bash")
115 exe "syn iskeyword ".&iskeyword.",-,:"
116 else
117 exe "syn iskeyword ".&iskeyword.",-"
118 endif
Bram Moolenaar91c49372016-05-08 09:50:29 +0200119 endif
Bram Moolenaare0fa3742016-02-20 15:47:01 +0100120endif
121
Bram Moolenaarb4ff5182015-11-10 21:15:48 +0100122" Set up folding commands for shell {{{1
123" =================================
Bram Moolenaar86b48162022-12-06 18:20:10 +0000124sil! delc ShFoldFunctions
125sil! delc ShFoldHereDoc
126sil! delc ShFoldIfDoFor
Bram Moolenaarb4ff5182015-11-10 21:15:48 +0100127if s:sh_fold_functions
128 com! -nargs=* ShFoldFunctions <args> fold
129else
130 com! -nargs=* ShFoldFunctions <args>
131endif
132if s:sh_fold_heredoc
133 com! -nargs=* ShFoldHereDoc <args> fold
134else
135 com! -nargs=* ShFoldHereDoc <args>
136endif
137if s:sh_fold_ifdofor
138 com! -nargs=* ShFoldIfDoFor <args> fold
139else
140 com! -nargs=* ShFoldIfDoFor <args>
141endif
142
Aliaksei Budavei48fa3192024-12-30 10:23:50 +0100143" Generate bracket expression items {{{1
144" =================================
145" Note that the following function can be invoked as many times as necessary
146" provided that these constraints hold for the passed dictionary argument:
147" - every time a unique group-name value is assigned to the "itemGroup" key;
148" - only ONCE either the "extraArgs" key is not entered or it is entered and
149" its value does not have "contained" among other optional arguments (":help
150" :syn-arguments").
151fun! s:GenerateBracketExpressionItems(dict) abort
152 let itemGroup = a:dict.itemGroup
153 let bracketGroup = a:dict.bracketGroup
154 let invGroup = itemGroup . 'Inv'
155 let skipLeftBracketGroup = itemGroup . 'SkipLeftBracket'
156 let skipRightBracketGroup = itemGroup . 'SkipRightBracket'
157 let extraArgs = has_key(a:dict, 'extraArgs') ? a:dict.extraArgs : ''
158
159 " Make the leading "[!^]" stand out in a NON-matching expression.
160 exec 'syn match ' . invGroup . ' contained "\[\@<=[!^]"'
161
162 " Set up indirections for unbalanced-bracket highlighting.
163 exec 'syn region ' . skipRightBracketGroup . ' contained matchgroup=' . bracketGroup . ' start="\[\%([!^]\=\\\=\]\)\@=" matchgroup=shCollSymb end="\[\.[^]]\{-}\][^]]\{-}\.\]" matchgroup=' . itemGroup . ' end="\]" contains=@shBracketExprList,shDoubleQuote,' . invGroup
164 exec 'syn region ' . skipLeftBracketGroup . ' contained matchgroup=' . bracketGroup . ' start="\[\%([!^]\=\\\=\]\)\@=" skip="[!^]\=\\\=\]\%(\[[^]]\+\]\|[^]]\)\{-}\%(\[[:.=]\@!\)\@=" matchgroup=' . itemGroup . ' end="\[[:.=]\@!" contains=@shBracketExprList,shDoubleQuote,' . invGroup
165
166 " Look for a general matching expression.
167 exec 'syn region ' . itemGroup . ' matchgroup=' . bracketGroup . ' start="\[\S\@=" end="\]" contains=@shBracketExprList,shDoubleQuote ' . extraArgs
168 " Look for a general NON-matching expression.
169 exec 'syn region ' . itemGroup . ' matchgroup=' . bracketGroup . ' start="\[[!^]\@=" end="\]" contains=@shBracketExprList,shDoubleQuote,' . invGroup . ' ' . extraArgs
170
171 " Accommodate unbalanced brackets in bracket expressions. The supported
172 " syntax for a plain "]" can be: "[]ws]" and "[^]ws]"; or, "[ws[.xs]ys.]zs]"
173 " and "[^ws[.xs]ys.]zs]"; see §9.3.5 RE Bracket Expression (in XBD).
174 exec 'syn region ' . itemGroup . ' matchgroup=NONE start="\[[!^]\=\\\=\]" matchgroup=' . bracketGroup . ' end="\]" contains=@shBracketExprList,shDoubleQuote,' . skipRightBracketGroup . ' ' . extraArgs
175 " Strive to handle "[]...[]" etc.
176 exec 'syn region ' . itemGroup . ' matchgroup=NONE start="\[[!^]\=\\\=\]\%(\[[^]]\+\]\|[^]]\)\{-}\[[:.=]\@!" matchgroup=' . bracketGroup . ' end="\]" contains=@shBracketExprList,shDoubleQuote,' . skipLeftBracketGroup . ' ' . extraArgs
177
178 if !exists("g:skip_sh_syntax_inits")
179 exec 'hi def link ' . skipLeftBracketGroup . ' ' . itemGroup
180 exec 'hi def link ' . skipRightBracketGroup . ' ' . itemGroup
181 exec 'hi def link ' . invGroup . ' Underlined'
182 endif
183endfun
184
185call s:GenerateBracketExpressionItems({'itemGroup': 'shBracketExpr', 'bracketGroup': 'shBracketExprDelim'})
186
Bram Moolenaarcd71fa32005-03-11 22:46:48 +0000187" sh syntax is case sensitive {{{1
Bram Moolenaar071d4272004-06-13 20:20:40 +0000188syn case match
189
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000190" Clusters: contains=@... clusters {{{1
Bram Moolenaar071d4272004-06-13 20:20:40 +0000191"==================================
Bram Moolenaar5c736222010-01-06 20:54:52 +0100192syn cluster shErrorList contains=shDoError,shIfError,shInError,shCaseError,shEsacError,shCurlyError,shParenError,shTestError,shOK
Bram Moolenaar51ad4ea2018-04-06 11:14:11 +0200193if exists("b:is_kornshell") || exists("b:is_bash")
Bram Moolenaarc236c162008-07-13 17:41:49 +0000194 syn cluster ErrorList add=shDTestError
195endif
Aliaksei Budavei48fa3192024-12-30 10:23:50 +0100196syn cluster shArithParenList contains=shArithmetic,shArithParen,shCaseEsac,shComment,shDeref,shDerefVarArray,shDo,shDerefSimple,shEcho,shEscape,shExpr,shNumber,shOperator,shPosnParm,shExSingleQuote,shExDoubleQuote,shHereString,shRedir,shSingleQuote,shDoubleQuote,shStatement,shVariable,shAlias,shTest,shCtrlSeq,shSpecial,shParen,bashSpecialVariables,bashStatement,shIf,shFor,shFunctionKey,shFunctionOne,shFunctionTwo
Bram Moolenaarc236c162008-07-13 17:41:49 +0000197syn cluster shArithList contains=@shArithParenList,shParenError
Aliaksei Budavei48fa3192024-12-30 10:23:50 +0100198syn cluster shBracketExprList contains=shCharClassOther,shCharClass,shCollSymb,shEqClass
Bram Moolenaard2855f52018-07-31 22:23:58 +0200199syn cluster shCaseEsacList contains=shCaseStart,shCaseLabel,shCase,shCaseBar,shCaseIn,shComment,shDeref,shDerefSimple,shCaseCommandSub,shCaseExSingleQuote,shCaseSingleQuote,shCaseDoubleQuote,shCtrlSeq,@shErrorList,shStringSpecial,shCaseRange
Johnothan Kingadd31ba2024-01-22 11:19:54 -0800200syn cluster shCaseList contains=@shCommandSubList,shCaseEsac,shColon,shCommandSub,shCommandSubBQ,shSubshare,shValsub,shComment,shDblBrace,shDo,shEcho,shExpr,shFor,shHereDoc,shIf,shHereString,shRedir,shSetList,shSource,shStatement,shVariable,shCtrlSeq
Bram Moolenaar23515b42020-11-29 14:36:24 +0100201if exists("b:is_kornshell") || exists("b:is_bash")
Lucien Grondin1858e2b2023-11-02 20:33:56 +0100202 syn cluster shCaseList add=shForPP,shDblParen
Bram Moolenaar23515b42020-11-29 14:36:24 +0100203endif
Aliaksei Budavei48fa3192024-12-30 10:23:50 +0100204syn cluster shCommandSubList contains=shAlias,shArithmetic,shBracketExpr,shCmdParenRegion,shCommandSub,shComment,shCtrlSeq,shDeref,shDerefSimple,shDoubleQuote,shEcho,shEscape,shExDoubleQuote,shExpr,shExSingleQuote,shHereDoc,shNumber,shOperator,shOption,shPosnParm,shHereString,shRedir,shSingleQuote,shSpecial,shStatement,shSubSh,shTest,shVariable
Bram Moolenaar572cb562005-08-05 21:35:02 +0000205syn cluster shCurlyList contains=shNumber,shComma,shDeref,shDerefSimple,shDerefSpecial
Bram Moolenaar6ba83ba2022-06-12 22:15:57 +0100206" COMBAK: removing shEscape from shDblQuoteList fails ksh04:43 -- Jun 09, 2022: I don't see the problem with ksh04, so am reinstating shEscape
Johnothan Kingadd31ba2024-01-22 11:19:54 -0800207syn cluster shDblQuoteList contains=shArithmetic,shCommandSub,shCommandSubBQ,shSubshare,shValsub,shDeref,shDerefSimple,shEscape,shPosnParm,shCtrlSeq,shSpecial,shSpecialDQ
Bram Moolenaaracb4f222016-01-10 15:59:26 +0100208syn cluster shDerefList contains=shDeref,shDerefSimple,shDerefVar,shDerefSpecial,shDerefWordError,shDerefPSR,shDerefPPS
Bram Moolenaard58a3bf2020-09-28 21:48:16 +0200209syn cluster shDerefVarList contains=shDerefOffset,shDerefOp,shDerefVarArray,shDerefOpError
Aliaksei Budavei48fa3192024-12-30 10:23:50 +0100210syn cluster shEchoList contains=shArithmetic,shBracketExpr,shCommandSub,shCommandSubBQ,shDerefVarArray,shSubshare,shValsub,shDeref,shDerefSimple,shEscape,shExSingleQuote,shExDoubleQuote,shSingleQuote,shDoubleQuote,shCtrlSeq,shEchoQuote
211syn cluster shExprList1 contains=shBracketExpr,shNumber,shOperator,shExSingleQuote,shExDoubleQuote,shSingleQuote,shDoubleQuote,shExpr,shDblBrace,shDeref,shDerefSimple,shCtrlSeq
Bram Moolenaar383f9bc2005-01-19 22:18:32 +0000212syn cluster shExprList2 contains=@shExprList1,@shCaseList,shTest
Aliaksei Budavei48fa3192024-12-30 10:23:50 +0100213syn cluster shFunctionList contains=shBracketExpr,@shCommandSubList,shCaseEsac,shColon,shComment,shDo,shEcho,shExpr,shFor,shHereDoc,shIf,shOption,shHereString,shRedir,shSetList,shSource,shStatement,shVariable,shOperator,shCtrlSeq
Bram Moolenaar7263a772007-05-10 17:35:54 +0000214if exists("b:is_kornshell") || exists("b:is_bash")
Bram Moolenaar23515b42020-11-29 14:36:24 +0100215 syn cluster shFunctionList add=shRepeat,shDblBrace,shDblParen,shForPP
Bram Moolenaar6ba83ba2022-06-12 22:15:57 +0100216 syn cluster shDerefList add=shCommandSubList,shEchoDeref
Bram Moolenaar7263a772007-05-10 17:35:54 +0000217endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000218syn cluster shHereBeginList contains=@shCommandSubList
219syn cluster shHereList contains=shBeginHere,shHerePayload
220syn cluster shHereListDQ contains=shBeginHere,@shDblQuoteList,shHerePayload
Aliaksei Budavei48fa3192024-12-30 10:23:50 +0100221syn cluster shIdList contains=shArithmetic,shCommandSub,shCommandSubBQ,shDerefVarArray,shSubshare,shValsub,shWrapLineOperator,shSetOption,shComment,shDeref,shDerefSimple,shHereString,shNumber,shOperator,shRedir,shExSingleQuote,shExDoubleQuote,shSingleQuote,shDoubleQuote,shExpr,shCtrlSeq,shStringSpecial,shAtExpr
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200222syn cluster shIfList contains=@shLoopList,shDblBrace,shDblParen,shFunctionKey,shFunctionOne,shFunctionTwo
Bram Moolenaar23515b42020-11-29 14:36:24 +0100223syn cluster shLoopList contains=@shCaseList,@shErrorList,shCaseEsac,shConditional,shDblBrace,shExpr,shFor,shIf,shOption,shSet,shTest,shTestOpr,shTouch
224if exists("b:is_kornshell") || exists("b:is_bash")
Lucien Grondina390e982023-10-28 21:40:48 +0200225 syn cluster shLoopList add=shForPP,shDblParen
Bram Moolenaar23515b42020-11-29 14:36:24 +0100226endif
Aliaksei Budavei48fa3192024-12-30 10:23:50 +0100227syn cluster shPPSLeftList contains=shAlias,shArithmetic,shBracketExpr,shCmdParenRegion,shCommandSub,shSubshare,shValsub,shCtrlSeq,shDeref,shDerefSimple,shDoubleQuote,shEcho,shEscape,shExDoubleQuote,shExpr,shExSingleQuote,shHereDoc,shNumber,shOperator,shOption,shPosnParm,shHereString,shRedir,shSingleQuote,shSpecial,shStatement,shSubSh,shTest,shVariable
Bram Moolenaardd60c362023-02-27 15:49:53 +0000228syn cluster shPPSRightList contains=shDeref,shDerefSimple,shEscape,shPosnParm
Aliaksei Budavei48fa3192024-12-30 10:23:50 +0100229syn cluster shSubShList contains=shBracketExpr,@shCommandSubList,shCommandSubBQ,shSubshare,shValsub,shCaseEsac,shColon,shCommandSub,shComment,shDo,shEcho,shExpr,shFor,shIf,shHereString,shRedir,shSetList,shSource,shStatement,shVariable,shCtrlSeq,shOperator
230syn cluster shTestList contains=shArithmetic,shBracketExpr,shCommandSub,shCommandSubBQ,shSubshare,shValsub,shCtrlSeq,shDeref,shDerefSimple,shDoubleQuote,shSpecialDQ,shExDoubleQuote,shExpr,shExSingleQuote,shNumber,shOperator,shSingleQuote,shTest,shTestOpr
Bram Moolenaarb0d45e72017-11-05 18:19:24 +0100231syn cluster shNoZSList contains=shSpecialNoZS
Johnothan Kingadd31ba2024-01-22 11:19:54 -0800232syn cluster shForList contains=shTestOpr,shNumber,shDerefSimple,shDeref,shCommandSub,shCommandSubBQ,shSubshare,shValsub,shArithmetic
Bram Moolenaarb4ff5182015-11-10 21:15:48 +0100233
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000234" Echo: {{{1
Bram Moolenaar071d4272004-06-13 20:20:40 +0000235" ====
236" This one is needed INSIDE a CommandSub, so that `echo bla` be correct
Johnothan Kingadd31ba2024-01-22 11:19:54 -0800237if exists("b:is_kornshell")
238 syn region shEcho matchgroup=shStatement start="\<echo\>" skip="\\$" matchgroup=shEchoDelim end="$" matchgroup=NONE end="[<>;&|()`}]"me=e-1 end="\d[<>]"me=e-2 end="#"me=e-1 end="\ze[ \t\n;]}" contains=@shEchoList skipwhite nextgroup=shQuickComment
239 syn region shEcho matchgroup=shStatement start="\<print\>" skip="\\$" matchgroup=shEchoDelim end="$" matchgroup=NONE end="[<>;&|()`}]"me=e-1 end="\d[<>]"me=e-2 end="#"me=e-1 end="\ze[ \t\n;]}" contains=@shEchoList skipwhite nextgroup=shQuickComment
240else
241 syn region shEcho matchgroup=shStatement start="\<echo\>" skip="\\$" matchgroup=shEchoDelim end="$" matchgroup=NONE end="[<>;&|()`]"me=e-1 end="\d[<>]"me=e-2 end="#"me=e-1 contains=@shEchoList skipwhite nextgroup=shQuickComment
242 syn region shEcho matchgroup=shStatement start="\<print\>" skip="\\$" matchgroup=shEchoDelim end="$" matchgroup=NONE end="[<>;&|()`]"me=e-1 end="\d[<>]"me=e-2 end="#"me=e-1 contains=@shEchoList skipwhite nextgroup=shQuickComment
243endif
Bram Moolenaar6ba83ba2022-06-12 22:15:57 +0100244if exists("b:is_kornshell") || exists("b:is_bash") || exists("b:is_posix")
245 syn region shEchoDeref contained matchgroup=shStatement start="\<echo\>" skip="\\$" matchgroup=shEchoDelim end="$" end="[<>;&|()`}]"me=e-1 end="\d[<>]"me=e-2 end="#"me=e-1 contains=@shEchoList skipwhite nextgroup=shQuickComment
246 syn region shEchoDeref contained matchgroup=shStatement start="\<print\>" skip="\\$" matchgroup=shEchoDelim end="$" end="[<>;&|()`}]"me=e-1 end="\d[<>]"me=e-2 end="#"me=e-1 contains=@shEchoList skipwhite nextgroup=shQuickComment
247endif
Bram Moolenaar5c736222010-01-06 20:54:52 +0100248syn match shEchoQuote contained '\%(\\\\\)*\\["`'()]'
Bram Moolenaar071d4272004-06-13 20:20:40 +0000249
Bram Moolenaarc236c162008-07-13 17:41:49 +0000250" This must be after the strings, so that ... \" will be correct
Aliaksei Budavei48fa3192024-12-30 10:23:50 +0100251syn region shEmbeddedEcho contained matchgroup=shStatement start="\<print\>" skip="\\$" matchgroup=shEchoDelim end="$" matchgroup=NONE end="[<>;&|`)]"me=e-1 end="\d[<>]"me=e-2 end="\s#"me=e-2 contains=shBracketExpr,shNumber,shExSingleQuote,shSingleQuote,shDeref,shDerefSimple,shSpecialVar,shOperator,shExDoubleQuote,shDoubleQuote,shCtrlSeq
Bram Moolenaar071d4272004-06-13 20:20:40 +0000252
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000253" Alias: {{{1
Bram Moolenaar071d4272004-06-13 20:20:40 +0000254" =====
Bram Moolenaar51ad4ea2018-04-06 11:14:11 +0200255if exists("b:is_kornshell") || exists("b:is_bash") || exists("b:is_posix")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000256 syn match shStatement "\<alias\>"
Bram Moolenaarbe4e0162023-02-02 13:59:48 +0000257 syn region shAlias matchgroup=shStatement start="\<alias\>\s\+\(\h[-._[:alnum:]]*\)\@=" skip="\\$" end="\>\|`"
258 syn region shAlias matchgroup=shStatement start="\<alias\>\s\+\(\h[-._[:alnum:]]*=\)\@=" skip="\\$" end="="
259" syn region shAlias matchgroup=shStatement start="\<alias\>\s\+\(\h[-._[:alnum:]]\+\)\@=" skip="\\$" end="\>\|`"
260" syn region shAlias matchgroup=shStatement start="\<alias\>\s\+\(\h[-._[:alnum:]]\+=\)\@=" skip="\\$" end="="
Bram Moolenaarb4ff5182015-11-10 21:15:48 +0100261
262 " Touch: {{{1
263 " =====
Bram Moolenaar6d5ad4c2016-10-27 17:00:16 +0200264 syn match shTouch '\<touch\>[^;#]*' skipwhite nextgroup=shComment contains=shTouchCmd,shDoubleQuote,shSingleQuote,shDeref,shDerefSimple
Bram Moolenaarb4ff5182015-11-10 21:15:48 +0100265 syn match shTouchCmd '\<touch\>' contained
Bram Moolenaar071d4272004-06-13 20:20:40 +0000266endif
267
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000268" Error Codes: {{{1
269" ============
Bram Moolenaar6be7f872012-01-20 21:08:56 +0100270if !exists("g:sh_no_error")
Bram Moolenaare2719092015-01-10 15:09:25 +0100271 syn match shDoError "\<done\>"
272 syn match shIfError "\<fi\>"
273 syn match shInError "\<in\>"
274 syn match shCaseError ";;"
275 syn match shEsacError "\<esac\>"
276 syn match shCurlyError "}"
277 syn match shParenError ")"
278 syn match shOK '\.\(done\|fi\|in\|esac\)'
Bram Moolenaar51ad4ea2018-04-06 11:14:11 +0200279 if exists("b:is_kornshell") || exists("b:is_bash")
Bram Moolenaare2719092015-01-10 15:09:25 +0100280 syn match shDTestError "]]"
Bram Moolenaar6be7f872012-01-20 21:08:56 +0100281 endif
Bram Moolenaare2719092015-01-10 15:09:25 +0100282 syn match shTestError "]"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000283endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000284
Bram Moolenaarc236c162008-07-13 17:41:49 +0000285" Options: {{{1
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000286" ====================
Bram Moolenaar7db8f6f2016-03-29 23:12:46 +0200287syn match shOption "\s\zs[-+][-_a-zA-Z#@]\+"
Bram Moolenaar1d9215b2020-01-25 13:27:42 +0100288syn match shOption "\s\zs--[^ \t$=`'"|);]\+"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000289
Bram Moolenaar7263a772007-05-10 17:35:54 +0000290" File Redirection Highlighted As Operators: {{{1
291"===========================================
292syn match shRedir "\d\=>\(&[-0-9]\)\="
293syn match shRedir "\d\=>>-\="
294syn match shRedir "\d\=<\(&[-0-9]\)\="
295syn match shRedir "\d<<-\="
296
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000297" Operators: {{{1
298" ==========
Bram Moolenaar7263a772007-05-10 17:35:54 +0000299syn match shOperator "<<\|>>" contained
Bram Moolenaarc236c162008-07-13 17:41:49 +0000300syn match shOperator "[!&;|]" contained
Bram Moolenaar541f92d2015-06-19 13:27:23 +0200301syn match shOperator "[-=/*+%]\==" skipwhite nextgroup=shPattern
Bram Moolenaare90ee312010-08-05 22:08:47 +0200302syn match shPattern "\<\S\+\())\)\@=" contained contains=shExSingleQuote,shSingleQuote,shExDoubleQuote,shDoubleQuote,shDeref
Bram Moolenaar071d4272004-06-13 20:20:40 +0000303
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000304" Subshells: {{{1
305" ==========
Bram Moolenaare4a3bcf2016-08-26 19:52:37 +0200306syn region shExpr transparent matchgroup=shExprRegion start="{" end="}" contains=@shExprList2 nextgroup=shSpecialNxt
307syn region shSubSh transparent matchgroup=shSubShRegion start="[^(]\zs(" end=")" contains=@shSubShList nextgroup=shSpecialNxt
Bram Moolenaar071d4272004-06-13 20:20:40 +0000308
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000309" Tests: {{{1
310"=======
Aliaksei Budavei48fa3192024-12-30 10:23:50 +0100311syn region shExpr matchgroup=shRange start="\[\s\@=" skip=+\\\\\|\\$\|\[+ end="\]" contains=@shTestList,shSpecial
Bram Moolenaar5c736222010-01-06 20:54:52 +0100312syn region shTest transparent matchgroup=shStatement start="\<test\s" skip=+\\\\\|\\$+ matchgroup=NONE end="[;&|]"me=e-1 end="$" contains=@shExprList1
Doug Kearnsf57c0652025-04-30 20:04:28 +0200313syn region shNoQuote start='\S' skip='\%(\\\\\)*\\.' end='\ze\s' end="\ze['"]" contained contains=shBracketExpr,shDerefSimple,shDeref,shEscape
Bram Moolenaar91c49372016-05-08 09:50:29 +0200314syn match shAstQuote contained '\*\ze"' nextgroup=shString
Bram Moolenaar541f92d2015-06-19 13:27:23 +0200315syn match shTestOpr contained '[^-+/%]\zs=' skipwhite nextgroup=shTestDoubleQuote,shTestSingleQuote,shTestPattern
Bram Moolenaarb4ff5182015-11-10 21:15:48 +0100316syn match shTestOpr contained "<=\|>=\|!=\|==\|=\~\|-.\>\|-\(nt\|ot\|ef\|eq\|ne\|lt\|le\|gt\|ge\)\>\|[!<>]"
Bram Moolenaar9964e462007-05-05 17:54:07 +0000317syn match shTestPattern contained '\w\+'
Bram Moolenaar91c49372016-05-08 09:50:29 +0200318syn region shTestDoubleQuote contained start='\%(\%(\\\\\)*\\\)\@<!"' skip=+\\\\\|\\"+ end='"' contains=shDeref,shDerefSimple,shDerefSpecial
Bram Moolenaarb0d45e72017-11-05 18:19:24 +0100319syn match shTestSingleQuote contained '\\.' nextgroup=shTestSingleQuote
Bram Moolenaar9964e462007-05-05 17:54:07 +0000320syn match shTestSingleQuote contained "'[^']*'"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000321if exists("b:is_kornshell") || exists("b:is_bash")
Aliaksei Budavei48fa3192024-12-30 10:23:50 +0100322 syn region shDblBrace matchgroup=Delimiter start="\[\[\s\@=" skip=+\%(\\\\\)*\\$+ end="\]\]" contains=@shTestList,shAstQuote,shNoQuote,shComment
Bram Moolenaarb4ff5182015-11-10 21:15:48 +0100323 syn region shDblParen matchgroup=Delimiter start="((" skip=+\%(\\\\\)*\\$+ end="))" contains=@shTestList,shComment
Bram Moolenaar071d4272004-06-13 20:20:40 +0000324endif
325
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000326" Character Class In Range: {{{1
327" =========================
Aliaksei Budavei48fa3192024-12-30 10:23:50 +0100328syn match shCharClassOther contained "\[:\w\{-}:\]"
Doug Kearns839b79e2025-05-10 20:57:10 +0200329syn match shCharClass contained "\[:\%(alnum\|alpha\|blank\|cntrl\|digit\|graph\|lower\|print\|punct\|space\|upper\|xdigit\):\]"
Aliaksei Budavei48fa3192024-12-30 10:23:50 +0100330syn match shCollSymb contained "\[\..\{-}\.\]"
331syn match shEqClass contained "\[=.\{-}=\]"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000332
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000333" Loops: do, if, while, until {{{1
334" ======
Bram Moolenaarb4ff5182015-11-10 21:15:48 +0100335ShFoldIfDoFor syn region shDo transparent matchgroup=shConditional start="\<do\>" matchgroup=shConditional end="\<done\>" contains=@shLoopList
336ShFoldIfDoFor syn region shIf transparent matchgroup=shConditional start="\<if\_s" matchgroup=shConditional skip=+-fi\>+ end="\<;\_s*then\>" end="\<fi\>" contains=@shIfList
337ShFoldIfDoFor syn region shFor matchgroup=shLoop start="\<for\ze\_s\s*\%(((\)\@!" end="\<in\>" end="\<do\>"me=e-2 contains=@shLoopList,shDblParen skipwhite nextgroup=shCurlyIn
Bram Moolenaar23515b42020-11-29 14:36:24 +0100338if exists("b:is_kornshell") || exists("b:is_bash")
339 ShFoldIfDoFor syn region shForPP matchgroup=shLoop start='\<for\>\_s*((' end='))' contains=@shForList
340endif
Bram Moolenaarb4ff5182015-11-10 21:15:48 +0100341
Bram Moolenaar51ad4ea2018-04-06 11:14:11 +0200342if exists("b:is_kornshell") || exists("b:is_bash") || exists("b:is_posix")
Bram Moolenaarc236c162008-07-13 17:41:49 +0000343 syn cluster shCaseList add=shRepeat
344 syn cluster shFunctionList add=shRepeat
Bram Moolenaar51ad4ea2018-04-06 11:14:11 +0200345 syn region shRepeat matchgroup=shLoop start="\<while\_s" end="\<do\>"me=e-2 contains=@shLoopList,shDblParen,shDblBrace
346 syn region shRepeat matchgroup=shLoop start="\<until\_s" end="\<do\>"me=e-2 contains=@shLoopList,shDblParen,shDblBrace
347 if !exists("b:is_posix")
348 syn region shCaseEsac matchgroup=shConditional start="\<select\s" matchgroup=shConditional end="\<in\>" end="\<do\>" contains=@shLoopList
349 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000350else
Bram Moolenaarc236c162008-07-13 17:41:49 +0000351 syn region shRepeat matchgroup=shLoop start="\<while\_s" end="\<do\>"me=e-2 contains=@shLoopList
352 syn region shRepeat matchgroup=shLoop start="\<until\_s" end="\<do\>"me=e-2 contains=@shLoopList
Bram Moolenaar071d4272004-06-13 20:20:40 +0000353endif
Bram Moolenaar572cb562005-08-05 21:35:02 +0000354syn region shCurlyIn contained matchgroup=Delimiter start="{" end="}" contains=@shCurlyList
355syn match shComma contained ","
Bram Moolenaar071d4272004-06-13 20:20:40 +0000356
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000357" Case: case...esac {{{1
Bram Moolenaar071d4272004-06-13 20:20:40 +0000358" ====
Bram Moolenaard2855f52018-07-31 22:23:58 +0200359syn match shCaseBar contained skipwhite "\(^\|[^\\]\)\(\\\\\)*\zs|" nextgroup=shCase,shCaseStart,shCaseBar,shComment,shCaseExSingleQuote,shCaseSingleQuote,shCaseDoubleQuote
360syn match shCaseStart contained skipwhite skipnl "(" nextgroup=shCase,shCaseBar
Aliaksei Budavei48fa3192024-12-30 10:23:50 +0100361syn match shCaseLabel contained skipwhite "\%(\\.\|[-a-zA-Z0-9_*.]\)\+" contains=shBracketExpr
Bram Moolenaarb0d45e72017-11-05 18:19:24 +0100362if exists("b:is_bash")
Bram Moolenaard2855f52018-07-31 22:23:58 +0200363 ShFoldIfDoFor syn region shCase contained skipwhite skipnl matchgroup=shSnglCase start="\%(\\.\|[^#$()'" \t]\)\{-}\zs)" end=";;" end=";&" end=";;&" end="esac"me=s-1 contains=@shCaseList nextgroup=shCaseStart,shCase,shComment
Bram Moolenaar6ba83ba2022-06-12 22:15:57 +0100364elseif exists("b:is_kornshell")
365 ShFoldIfDoFor syn region shCase contained skipwhite skipnl matchgroup=shSnglCase start="\%(\\.\|[^#$()'" \t]\)\{-}\zs)" end=";;" end=";&" end="esac"me=s-1 contains=@shCaseList nextgroup=shCaseStart,shCase,shComment
Eisuke Kawashima54cb5142025-01-18 10:11:28 +0100366else
Bram Moolenaard2855f52018-07-31 22:23:58 +0200367 ShFoldIfDoFor syn region shCase contained skipwhite skipnl matchgroup=shSnglCase start="\%(\\.\|[^#$()'" \t]\)\{-}\zs)" end=";;" end="esac"me=s-1 contains=@shCaseList nextgroup=shCaseStart,shCase,shComment
Bram Moolenaarb0d45e72017-11-05 18:19:24 +0100368endif
Bram Moolenaard2855f52018-07-31 22:23:58 +0200369ShFoldIfDoFor syn region shCaseEsac matchgroup=shConditional start="\<case\>" end="\<esac\>" contains=@shCaseEsacList
Bram Moolenaarb4ff5182015-11-10 21:15:48 +0100370
Bram Moolenaardf177f62005-02-22 08:39:57 +0000371syn keyword shCaseIn contained skipwhite skipnl in nextgroup=shCase,shCaseStart,shCaseBar,shComment,shCaseExSingleQuote,shCaseSingleQuote,shCaseDoubleQuote
Bram Moolenaar6ba83ba2022-06-12 22:15:57 +0100372if exists("b:is_bash") || exists("b:is_kornshell")
Bram Moolenaar4b22cdb2010-08-02 22:12:46 +0200373 syn region shCaseExSingleQuote matchgroup=shQuote start=+\$'+ skip=+\\\\\|\\.+ end=+'+ contains=shStringSpecial,shSpecial skipwhite skipnl nextgroup=shCaseBar contained
Bram Moolenaar6be7f872012-01-20 21:08:56 +0100374elseif !exists("g:sh_no_error")
Bram Moolenaardf177f62005-02-22 08:39:57 +0000375 syn region shCaseExSingleQuote matchgroup=Error start=+\$'+ skip=+\\\\\|\\.+ end=+'+ contains=shStringSpecial skipwhite skipnl nextgroup=shCaseBar contained
376endif
Bram Moolenaar4b22cdb2010-08-02 22:12:46 +0200377syn region shCaseSingleQuote matchgroup=shQuote start=+'+ end=+'+ contains=shStringSpecial skipwhite skipnl nextgroup=shCaseBar contained
378syn region shCaseDoubleQuote matchgroup=shQuote start=+"+ skip=+\\\\\|\\.+ end=+"+ contains=@shDblQuoteList,shStringSpecial skipwhite skipnl nextgroup=shCaseBar contained
Bram Moolenaar071d4272004-06-13 20:20:40 +0000379syn region shCaseCommandSub start=+`+ skip=+\\\\\|\\.+ end=+`+ contains=@shCommandSubList skipwhite skipnl nextgroup=shCaseBar contained
Aliaksei Budavei48fa3192024-12-30 10:23:50 +0100380call s:GenerateBracketExpressionItems({'itemGroup': 'shCaseRange', 'bracketGroup': 'shBracketExprDelim', 'extraArgs': 'skip=+\\\\+ contained'})
Bram Moolenaar97d62492012-11-15 21:28:22 +0100381if exists("b:is_bash")
Doug Kearns839b79e2025-05-10 20:57:10 +0200382 syn match shCharClass "\[:\%(alnum\|alpha\|ascii\|blank\|cntrl\|digit\|graph\|lower\|print\|punct\|space\|upper\|word\|xdigit\):\]" contained
383elseif exists("b:is_kornshell")
384 syn match shCharClass "\[:\%(alnum\|alpha\|blank\|cntrl\|digit\|graph\|lower\|print\|punct\|space\|upper\|word\|xdigit\):\]" contained
Bram Moolenaar97d62492012-11-15 21:28:22 +0100385endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000386" Misc: {{{1
387"======
Bram Moolenaar071d4272004-06-13 20:20:40 +0000388syn match shWrapLineOperator "\\$"
Bram Moolenaar93a1df22018-09-10 11:51:50 +0200389syn region shCommandSubBQ start="`" skip="\\\\\|\\." end="`" contains=shBQComment,@shCommandSubList
Bram Moolenaar1d9215b2020-01-25 13:27:42 +0100390"COMBAK: see ksh13:50
Bram Moolenaarb730f0c2018-11-25 03:56:26 +0100391"syn match shEscape contained '\%(^\)\@!\%(\\\\\)*\\.' nextgroup=shSingleQuote,shDoubleQuote,shComment
Bram Moolenaar1d9215b2020-01-25 13:27:42 +0100392"COMBAK: see sh11:27
Bram Moolenaarb730f0c2018-11-25 03:56:26 +0100393syn match shEscape contained '\%(^\)\@!\%(\\\\\)*\\.' nextgroup=shComment
Bram Moolenaar1d9215b2020-01-25 13:27:42 +0100394"COMBAK: see ksh13:53
395"syn match shEscape contained '\%(^\)\@!\%(\\\\\)*\\.'
Bram Moolenaar071d4272004-06-13 20:20:40 +0000396
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000397" $() and $(()): {{{1
Bram Moolenaar071d4272004-06-13 20:20:40 +0000398" $(..) is not supported by sh (Bourne shell). However, apparently
399" some systems (HP?) have as their /bin/sh a (link to) Korn shell
400" (ie. Posix compliant shell). /bin/ksh should work for those
401" systems too, however, so the following syntax will flag $(..) as
402" an Error under /bin/sh. By consensus of vimdev'ers!
Bram Moolenaarb0d45e72017-11-05 18:19:24 +0100403if exists("b:is_kornshell") || exists("b:is_bash") || exists("b:is_posix")
Doug Kearns6099db92025-04-03 21:13:39 +0200404 syn region shCommandSub matchgroup=shCmdSubRegion start="\$((\@!" skip='\\\\\|\\.' end=")" contains=@shCommandSubList
Johnothan Kingadd31ba2024-01-22 11:19:54 -0800405 if exists("b:is_kornshell")
406 syn region shSubshare matchgroup=shCmdSubRegion start="\${\ze[ \t\n<]" skip='\\\\\|\\.' end="\zs[ \t\n;]}" contains=@shCommandSubList
407 syn region shValsub matchgroup=shCmdSubRegion start="\${|" skip='\\\\\|\\.' end="}" contains=@shCommandSubList
408 endif
Bram Moolenaarc236c162008-07-13 17:41:49 +0000409 syn region shArithmetic matchgroup=shArithRegion start="\$((" skip='\\\\\|\\.' end="))" contains=@shArithList
Bram Moolenaar61d35bd2012-03-28 20:51:51 +0200410 syn region shArithmetic matchgroup=shArithRegion start="\$\[" skip='\\\\\|\\.' end="\]" contains=@shArithList
Bram Moolenaar071d4272004-06-13 20:20:40 +0000411 syn match shSkipInitWS contained "^\s\+"
Bram Moolenaar6ba83ba2022-06-12 22:15:57 +0100412 syn region shArithParen matchgroup=shArithRegion contained start="(" end=")" contains=@shArithParenList
Bram Moolenaar6be7f872012-01-20 21:08:56 +0100413elseif !exists("g:sh_no_error")
Bram Moolenaardf177f62005-02-22 08:39:57 +0000414 syn region shCommandSub matchgroup=Error start="\$(" end=")" contains=@shCommandSubList
Bram Moolenaar071d4272004-06-13 20:20:40 +0000415endif
dkearns1bdc9432024-03-05 05:14:08 +1100416syn region shCmdParenRegion matchgroup=shCmdSubRegion start="((\@!" skip='\\\\\|\\.' end=")" contains=@shCommandSubList
Bram Moolenaar071d4272004-06-13 20:20:40 +0000417
418if exists("b:is_bash")
419 syn cluster shCommandSubList add=bashSpecialVariables,bashStatement
420 syn cluster shCaseList add=bashAdminStatement,bashStatement
Eisuke Kawashima54cb5142025-01-18 10:11:28 +0100421 syn keyword bashSpecialVariables contained auto_resume BASH BASH_ALIASES BASH_ARGC BASH_ARGV BASH_CMDS BASH_COMMAND BASH_ENV BASH_EXECUTION_STRING BASH_LINENO BASHOPTS BASHPID BASH_REMATCH BASH_SOURCE BASH_SUBSHELL BASH_VERSINFO BASH_VERSION BASH_XTRACEFD CDPATH COLUMNS COMP_CWORD COMP_KEY COMP_LINE COMP_POINT COMPREPLY COMP_TYPE COMP_WORDBREAKS COMP_WORDS COPROC COPROC_PID DIRSTACK EMACS ENV EUID FCEDIT FIGNORE FUNCNAME FUNCNEST GLOBIGNORE GROUPS histchars HISTCMD HISTCONTROL HISTFILE HISTFILESIZE HISTIGNORE HISTSIZE HISTTIMEFORMAT HOME HOSTFILE HOSTNAME HOSTTYPE IFS IGNOREEOF INPUTRC LANG LC_ALL LC_COLLATE LC_CTYPE LC_MESSAGES LC_NUMERIC LINENO LINES MACHTYPE MAIL MAILCHECK MAILPATH MAPFILE OLDPWD OPTARG OPTERR OPTIND OSTYPE PATH PIPESTATUS POSIXLY_CORRECT PPID PROMPT_COMMAND PS0 PS1 PS2 PS3 PS4 PWD RANDOM READLINE_LINE READLINE_POINT REPLY SECONDS SHELL SHELLOPTS SHLVL TIMEFORMAT TIMEOUT TMPDIR UID
Bram Moolenaar5ed11532022-07-06 13:18:11 +0100422 syn keyword bashStatement chmod clear complete du egrep expr fgrep find gnufind gnugrep grep head less ls mkdir mv rm rmdir rpm sed sleep sort strip tail
Bram Moolenaar071d4272004-06-13 20:20:40 +0000423 syn keyword bashAdminStatement daemon killall killproc nice reload restart start status stop
Bram Moolenaar97d62492012-11-15 21:28:22 +0100424 syn keyword bashStatement command compgen
Bram Moolenaar071d4272004-06-13 20:20:40 +0000425endif
426
Bram Moolenaar51ad4ea2018-04-06 11:14:11 +0200427if exists("b:is_kornshell") || exists("b:is_posix")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000428 syn cluster shCommandSubList add=kshSpecialVariables,kshStatement
429 syn cluster shCaseList add=kshStatement
430 syn keyword kshSpecialVariables contained CDPATH COLUMNS EDITOR ENV ERRNO FCEDIT FPATH HISTFILE HISTSIZE HOME IFS LINENO LINES MAIL MAILCHECK MAILPATH OLDPWD OPTARG OPTIND PATH PPID PS1 PS2 PS3 PS4 PWD RANDOM REPLY SECONDS SHELL TMOUT VISUAL
Bram Moolenaar5ed11532022-07-06 13:18:11 +0100431 syn keyword kshStatement cat chmod clear cp du egrep expr fgrep find grep head killall less ls mkdir mv nice printenv rm rmdir sed sort strip stty tail tput
Bram Moolenaar97d62492012-11-15 21:28:22 +0100432 syn keyword kshStatement command setgroups setsenv
Bram Moolenaar071d4272004-06-13 20:20:40 +0000433endif
434
435syn match shSource "^\.\s"
436syn match shSource "\s\.\s"
Bram Moolenaar5c736222010-01-06 20:54:52 +0100437"syn region shColon start="^\s*:" end="$" end="\s#"me=e-2 contains=@shColonList
Bram Moolenaar6be7f872012-01-20 21:08:56 +0100438"syn region shColon start="^\s*\zs:" end="$" end="\s#"me=e-2
Bram Moolenaar51ad4ea2018-04-06 11:14:11 +0200439if exists("b:is_kornshell") || exists("b:is_posix")
Bram Moolenaar91c49372016-05-08 09:50:29 +0200440 syn match shColon '^\s*\zs:'
441endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000442
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000443" String And Character Constants: {{{1
444"================================
Bram Moolenaar7db8f6f2016-03-29 23:12:46 +0200445syn match shNumber "\<\d\+\>#\="
Bram Moolenaarbc8801c2016-08-02 21:04:33 +0200446syn match shNumber "\<-\=\.\=\d\+\>#\="
Bram Moolenaar802a0d92016-06-26 16:17:58 +0200447syn match shCtrlSeq "\\\d\d\d\|\\[abcfnrtv0]" contained
Bram Moolenaar6ba83ba2022-06-12 22:15:57 +0100448if exists("b:is_bash") || exists("b:is_kornshell")
Bram Moolenaar802a0d92016-06-26 16:17:58 +0200449 syn match shSpecial "[^\\]\(\\\\\)*\zs\\\o\o\o\|\\x\x\x\|\\c[^"]\|\\[abefnrtv]" contained
450 syn match shSpecial "^\(\\\\\)*\zs\\\o\o\o\|\\x\x\x\|\\c[^"]\|\\[abefnrtv]" contained
Bram Moolenaare4a3bcf2016-08-26 19:52:37 +0200451 syn region shExSingleQuote matchgroup=shQuote start=+\$'+ skip=+\\\\\|\\.+ end=+'+ contains=shStringSpecial,shSpecial nextgroup=shSpecialNxt
452 syn region shExDoubleQuote matchgroup=shQuote start=+\$"+ skip=+\\\\\|\\.\|\\"+ end=+"+ contains=@shDblQuoteList,shStringSpecial,shSpecial nextgroup=shSpecialNxt
Bram Moolenaar6be7f872012-01-20 21:08:56 +0100453elseif !exists("g:sh_no_error")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000454 syn region shExSingleQuote matchGroup=Error start=+\$'+ skip=+\\\\\|\\.+ end=+'+ contains=shStringSpecial
Bram Moolenaare90ee312010-08-05 22:08:47 +0200455 syn region shExDoubleQuote matchGroup=Error start=+\$"+ skip=+\\\\\|\\.+ end=+"+ contains=shStringSpecial
Bram Moolenaardf177f62005-02-22 08:39:57 +0000456endif
Bram Moolenaard2855f52018-07-31 22:23:58 +0200457syn region shSingleQuote matchgroup=shQuote start=+'+ end=+'+ contains=@Spell nextgroup=shSpecialStart,shSpecialSQ
Bram Moolenaard2ea7cf2021-05-30 20:54:13 +0200458syn region shDoubleQuote matchgroup=shQuote start=+\%(\%(\\\\\)*\\\)\@<!"+ skip=+\\.+ end=+"+ contains=@shDblQuoteList,shStringSpecial,@Spell nextgroup=shSpecialStart
Bram Moolenaar802a0d92016-06-26 16:17:58 +0200459syn match shStringSpecial "[^[:print:] \t]" contained
Bram Moolenaard2ea7cf2021-05-30 20:54:13 +0200460syn match shStringSpecial "[^\\]\zs\%(\\\\\)*\(\\[\\"'`$()#]\)\+" nextgroup=shComment
461syn match shSpecialSQ "[^\\]\zs\%(\\\\\)*\(\\[\\"'`$()#]\)\+" contained nextgroup=shBkslshSnglQuote,@shNoZSList
462syn match shSpecialDQ "[^\\]\zs\%(\\\\\)*\(\\[\\"'`$()#]\)\+" contained nextgroup=shBkslshDblQuote,@shNoZSList
Bram Moolenaar51ad4ea2018-04-06 11:14:11 +0200463syn match shSpecialStart "\%(\\\\\)*\\[\\"'`$()#]" contained nextgroup=shBkslshSnglQuote,shBkslshDblQuote,@shNoZSList
Bram Moolenaar60cce2f2015-10-13 23:21:27 +0200464syn match shSpecial "^\%(\\\\\)*\\[\\"'`$()#]"
Bram Moolenaarb0d45e72017-11-05 18:19:24 +0100465syn match shSpecialNoZS contained "\%(\\\\\)*\\[\\"'`$()#]"
Bram Moolenaare4a3bcf2016-08-26 19:52:37 +0200466syn match shSpecialNxt contained "\\[\\"'`$()#]"
Bram Moolenaar47e13952020-05-12 22:49:12 +0200467"syn region shBkslshSnglQuote contained matchgroup=shQuote start=+'+ end=+'+ contains=@Spell nextgroup=shSpecialStart
468"syn region shBkslshDblQuote contained matchgroup=shQuote start=+"+ skip=+\\"+ end=+"+ contains=@shDblQuoteList,shStringSpecial,@Spell nextgroup=shSpecialStart
Bram Moolenaar071d4272004-06-13 20:20:40 +0000469
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000470" Comments: {{{1
471"==========
Bram Moolenaar5c736222010-01-06 20:54:52 +0100472syn cluster shCommentGroup contains=shTodo,@Spell
Bram Moolenaar6d5ad4c2016-10-27 17:00:16 +0200473if exists("b:is_bash")
474 syn match shTodo contained "\<\%(COMBAK\|FIXME\|TODO\|XXX\)\ze:\=\>"
475else
476 syn keyword shTodo contained COMBAK FIXME TODO XXX
477endif
Bram Moolenaar5c736222010-01-06 20:54:52 +0100478syn match shComment "^\s*\zs#.*$" contains=@shCommentGroup
479syn match shComment "\s\zs#.*$" contains=@shCommentGroup
Bram Moolenaar97d62492012-11-15 21:28:22 +0100480syn match shComment contained "#.*$" contains=@shCommentGroup
Bram Moolenaar113cb512021-11-07 20:27:04 +0000481syn match shQuickComment contained "#.*$" contains=@shCommentGroup
Bram Moolenaar93a1df22018-09-10 11:51:50 +0200482syn match shBQComment contained "#.\{-}\ze`" contains=@shCommentGroup
Bram Moolenaar071d4272004-06-13 20:20:40 +0000483
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000484" Here Documents: {{{1
Bram Moolenaard2ea7cf2021-05-30 20:54:13 +0200485" (modified by Felipe Contreras)
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000486" =========================================
Bram Moolenaar86b48162022-12-06 18:20:10 +0000487ShFoldHereDoc syn region shHereDoc matchgroup=shHereDoc01 start="<<\s*\z([^ \t|>]\+\)" matchgroup=shHereDoc01 end="^\z1$" contains=@shDblQuoteList
Bram Moolenaar71badf92023-04-22 22:40:14 +0100488ShFoldHereDoc syn region shHereDoc matchgroup=shHereDoc02 start="<<-\s*\z([^ \t|>]\+\)" matchgroup=shHereDoc02 end="^\t*\z1$" contains=@shDblQuoteList
Bram Moolenaar86b48162022-12-06 18:20:10 +0000489ShFoldHereDoc syn region shHereDoc matchgroup=shHereDoc03 start="<<\s*\\\z([^ \t|>]\+\)" matchgroup=shHereDoc03 end="^\z1$"
Bram Moolenaar71badf92023-04-22 22:40:14 +0100490ShFoldHereDoc syn region shHereDoc matchgroup=shHereDoc04 start="<<-\s*\\\z([^ \t|>]\+\)" matchgroup=shHereDoc04 end="^\t*\z1$"
Bram Moolenaar86b48162022-12-06 18:20:10 +0000491ShFoldHereDoc syn region shHereDoc matchgroup=shHereDoc05 start="<<\s*'\z([^']\+\)'" matchgroup=shHereDoc05 end="^\z1$"
Bram Moolenaar71badf92023-04-22 22:40:14 +0100492ShFoldHereDoc syn region shHereDoc matchgroup=shHereDoc06 start="<<-\s*'\z([^']\+\)'" matchgroup=shHereDoc06 end="^\t*\z1$"
Bram Moolenaar86b48162022-12-06 18:20:10 +0000493ShFoldHereDoc syn region shHereDoc matchgroup=shHereDoc07 start="<<\s*\"\z([^"]\+\)\"" matchgroup=shHereDoc07 end="^\z1$"
Bram Moolenaar71badf92023-04-22 22:40:14 +0100494ShFoldHereDoc syn region shHereDoc matchgroup=shHereDoc08 start="<<-\s*\"\z([^"]\+\)\"" matchgroup=shHereDoc08 end="^\t*\z1$"
Bram Moolenaar86b48162022-12-06 18:20:10 +0000495ShFoldHereDoc syn region shHereDoc matchgroup=shHereDoc09 start="<<\s*\\\_$\_s*\z([^ \t|>]\+\)" matchgroup=shHereDoc09 end="^\z1$" contains=@shDblQuoteList
Bram Moolenaar71badf92023-04-22 22:40:14 +0100496ShFoldHereDoc syn region shHereDoc matchgroup=shHereDoc10 start="<<-\s*\\\_$\_s*\z([^ \t|>]\+\)" matchgroup=shHereDoc10 end="^\t*\z1$" contains=@shDblQuoteList
Bram Moolenaar86b48162022-12-06 18:20:10 +0000497ShFoldHereDoc syn region shHereDoc matchgroup=shHereDoc11 start="<<\s*\\\_$\_s*\\\z([^ \t|>]\+\)" matchgroup=shHereDoc11 end="^\z1$"
Bram Moolenaar71badf92023-04-22 22:40:14 +0100498ShFoldHereDoc syn region shHereDoc matchgroup=shHereDoc12 start="<<-\s*\\\_$\_s*\\\z([^ \t|>]\+\)" matchgroup=shHereDoc12 end="^\t*\z1$"
Bram Moolenaar86b48162022-12-06 18:20:10 +0000499ShFoldHereDoc syn region shHereDoc matchgroup=shHereDoc13 start="<<\s*\\\_$\_s*'\z([^']\+\)'" matchgroup=shHereDoc13 end="^\z1$"
Bram Moolenaar71badf92023-04-22 22:40:14 +0100500ShFoldHereDoc syn region shHereDoc matchgroup=shHereDoc14 start="<<-\s*\\\_$\_s*'\z([^']\+\)'" matchgroup=shHereDoc14 end="^\t*\z1$"
Bram Moolenaar86b48162022-12-06 18:20:10 +0000501ShFoldHereDoc syn region shHereDoc matchgroup=shHereDoc15 start="<<\s*\\\_$\_s*\"\z([^"]\+\)\"" matchgroup=shHereDoc15 end="^\z1$"
Bram Moolenaar71badf92023-04-22 22:40:14 +0100502ShFoldHereDoc syn region shHereDoc matchgroup=shHereDoc16 start="<<-\s*\\\_$\_s*\"\z([^"]\+\)\"" matchgroup=shHereDoc16 end="^\t*\z1$"
Bram Moolenaar23515b42020-11-29 14:36:24 +0100503
Bram Moolenaar071d4272004-06-13 20:20:40 +0000504
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000505" Here Strings: {{{1
506" =============
Bram Moolenaar6d5ad4c2016-10-27 17:00:16 +0200507" available for: bash; ksh (really should be ksh93 only) but not if its a posix
Bram Moolenaar690afe12017-01-28 18:34:47 +0100508if exists("b:is_bash") || (exists("b:is_kornshell") && !exists("b:is_posix"))
Bram Moolenaare4a3bcf2016-08-26 19:52:37 +0200509 syn match shHereString "<<<" skipwhite nextgroup=shCmdParenRegion
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000510endif
511
512" Identifiers: {{{1
513"=============
Bram Moolenaarc236c162008-07-13 17:41:49 +0000514syn match shSetOption "\s\zs[-+][a-zA-Z0-9]\+\>" contained
Bram Moolenaar23515b42020-11-29 14:36:24 +0100515syn match shVariable "\<\h\w*\ze=" nextgroup=shVarAssign
Aliaksei Budavei48fa3192024-12-30 10:23:50 +0100516if exists("b:is_bash")
517 " The subscript form for array values, e.g. "foo=([2]=10 [4]=100)".
Doug Kearns87947a92025-05-06 17:59:25 +0200518 syn region shArrayValue contained start="\[\%(..\{-}\]=\)\@=" end="\]=\@=" contains=@shArrayValueList nextgroup=shVarAssign
Aliaksei Budavei48fa3192024-12-30 10:23:50 +0100519 syn cluster shArrayValueList contains=shArithmetic,shArithParen,shCommandSub,shDeref,shDerefSimple,shExpr,shNumber,shExSingleQuote,shExDoubleQuote,shSingleQuote,shDoubleQuote,shSpecial,shParen,bashSpecialVariables,shParenError
Doug Kearns87947a92025-05-06 17:59:25 +0200520 syn region shArrayRegion contained matchgroup=shShellVariables start="(" skip='\\\\\|\\.' end=")" contains=@shArrayValueList,shArrayValue,shComment
521elseif exists("b:is_kornshell")
522 " The subscript form for array values, e.g. "foo=([2]=10 [4]=100)".
523 syn region shArrayValue contained start="\[\%(..\{-}\]=\)\@=" end="\]=\@=" contains=@shArrayValueList nextgroup=shVarAssign
524 syn cluster shArrayValueList contains=shArithmetic,shArithParen,shCommandSub,shDeref,shDerefSimple,shExpr,shNumber,shExSingleQuote,shExDoubleQuote,shSingleQuote,shDoubleQuote,shSpecial,shParen,kshSpecialVariables,shParenError
525 syn region shArrayRegion contained matchgroup=shShellVariables start="(" skip='\\\\\|\\.' end=")" contains=@shArrayValueList,shArrayValue,shComment,shArrayRegion
Aliaksei Budavei48fa3192024-12-30 10:23:50 +0100526endif
527if exists("b:is_bash") || exists("b:is_kornshell")
528 syn match shVariable "\<\h\w*\%(\[..\{-}\]\)\=\ze\%([|^&*/%+-]\|[<^]<\|[>^]>\)\==" contains=shDerefVarArray nextgroup=shVarAssign
529 syn match shVarAssign contained "\%([|^&*/%+-]\|[<^]<\|[>^]>\)\==" nextgroup=shArrayRegion,shPattern,shDeref,shDerefSimple,shDoubleQuote,shExDoubleQuote,shSingleQuote,shExSingleQuote,shVar
Aliaksei Budavei48fa3192024-12-30 10:23:50 +0100530else
531 syn match shVarAssign contained "=" nextgroup=shPattern,shDeref,shDerefSimple,shDoubleQuote,shExDoubleQuote,shSingleQuote,shExSingleQuote,shVar
532endif
Bram Moolenaarb730f0c2018-11-25 03:56:26 +0100533syn match shVar contained "\h\w*"
Bram Moolenaarbc488a72013-07-05 21:01:22 +0200534syn region shAtExpr contained start="@(" end=")" contains=@shIdList
Bram Moolenaar071d4272004-06-13 20:20:40 +0000535if exists("b:is_bash")
Bram Moolenaarb730f0c2018-11-25 03:56:26 +0100536 syn match shSet "^\s*set\ze\s\+$"
Bram Moolenaar6ba83ba2022-06-12 22:15:57 +0100537 syn region shSetList oneline matchgroup=shSet start="\<\%(declare\|local\|export\)\>\ze[/a-zA-Z_]\@!" end="$" matchgroup=shSetListDelim end="\ze[}|);&]" matchgroup=NONE end="\ze\s\+#\|=" contains=@shIdList
Bram Moolenaarb730f0c2018-11-25 03:56:26 +0100538 syn region shSetList oneline matchgroup=shSet start="\<\%(set\|unset\)\>[/a-zA-Z_]\@!" end="\ze[;|#)]\|$" matchgroup=shSetListDelim end="\ze[}|);&]" matchgroup=NONE end="\ze\s\+=" contains=@shIdList nextgroup=shComment
Bram Moolenaar51ad4ea2018-04-06 11:14:11 +0200539elseif exists("b:is_kornshell") || exists("b:is_posix")
Bram Moolenaarb730f0c2018-11-25 03:56:26 +0100540 syn match shSet "^\s*set\ze\s\+$"
Bram Moolenaard58a3bf2020-09-28 21:48:16 +0200541 if exists("b:is_dash")
Bram Moolenaar6ba83ba2022-06-12 22:15:57 +0100542 syn region shSetList oneline matchgroup=shSet start="\<\%(local\)\>\ze[/]\@!" end="$" matchgroup=shSetListDelim end="\ze[}|);&]" matchgroup=NONE end="\ze\s\+[#=]" contains=@shIdList
Bram Moolenaard58a3bf2020-09-28 21:48:16 +0200543 endif
Bram Moolenaar6ba83ba2022-06-12 22:15:57 +0100544 syn region shSetList oneline matchgroup=shSet start="\<\(export\)\>\ze[/]\@!" end="$" matchgroup=shSetListDelim end="\ze[}|);&]" matchgroup=NONE end="\ze\s\+[#=]" contains=@shIdList
Bram Moolenaarb730f0c2018-11-25 03:56:26 +0100545 syn region shSetList oneline matchgroup=shSet start="\<\%(set\|unset\>\)\ze[/a-zA-Z_]\@!" end="\ze[;|#)]\|$" matchgroup=shSetListDelim end="\ze[}|);&]" matchgroup=NONE end="\ze\s\+[#=]" contains=@shIdList nextgroup=shComment
Bram Moolenaar071d4272004-06-13 20:20:40 +0000546else
Bram Moolenaarb730f0c2018-11-25 03:56:26 +0100547 syn region shSetList oneline matchgroup=shSet start="\<\(set\|export\|unset\)\>\ze[/a-zA-Z_]\@!" end="\ze[;|#)]\|$" matchgroup=shSetListDelim end="\ze[}|);&]" matchgroup=NONE end="\ze\s\+[#=]" contains=@shIdList
Bram Moolenaar071d4272004-06-13 20:20:40 +0000548endif
549
Bram Moolenaar6ba83ba2022-06-12 22:15:57 +0100550" KornShell namespace: {{{1
551if exists("b:is_kornshell")
552 syn keyword shFunctionKey namespace skipwhite skipnl nextgroup=shFunctionTwo
553endif
554
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000555" Functions: {{{1
Bram Moolenaar690afe12017-01-28 18:34:47 +0100556if !exists("b:is_posix")
Bram Moolenaarc236c162008-07-13 17:41:49 +0000557 syn keyword shFunctionKey function skipwhite skipnl nextgroup=shFunctionTwo
558endif
559
560if exists("b:is_bash")
Eisuke Kawashima54cb5142025-01-18 10:11:28 +0100561 syn keyword shFunctionKey coproc
Bram Moolenaar91c49372016-05-08 09:50:29 +0200562 ShFoldFunctions syn region shFunctionOne matchgroup=shFunction start="^\s*[A-Za-z_0-9:][-a-zA-Z_0-9:]*\s*()\_s*{" end="}" contains=@shFunctionList skipwhite skipnl nextgroup=shFunctionStart,shQuickComment
563 ShFoldFunctions syn region shFunctionTwo matchgroup=shFunction start="\%(do\)\@!\&\<[A-Za-z_0-9:][-a-zA-Z_0-9:]*\>\s*\%(()\)\=\_s*{" end="}" contains=shFunctionKey,@shFunctionList contained skipwhite skipnl nextgroup=shFunctionStart,shQuickComment
564 ShFoldFunctions syn region shFunctionThree matchgroup=shFunction start="^\s*[A-Za-z_0-9:][-a-zA-Z_0-9:]*\s*()\_s*(" end=")" contains=@shFunctionList skipwhite skipnl nextgroup=shFunctionStart,shQuickComment
565 ShFoldFunctions syn region shFunctionFour matchgroup=shFunction start="\%(do\)\@!\&\<[A-Za-z_0-9:][-a-zA-Z_0-9:]*\>\s*\%(()\)\=\_s*)" end=")" contains=shFunctionKey,@shFunctionList contained skipwhite skipnl nextgroup=shFunctionStart,shQuickComment
Bram Moolenaar071d4272004-06-13 20:20:40 +0000566else
Bram Moolenaar91c49372016-05-08 09:50:29 +0200567 ShFoldFunctions syn region shFunctionOne matchgroup=shFunction start="^\s*\h\w*\s*()\_s*{" end="}" contains=@shFunctionList skipwhite skipnl nextgroup=shFunctionStart,shQuickComment
568 ShFoldFunctions syn region shFunctionTwo matchgroup=shFunction start="\%(do\)\@!\&\<\h\w*\>\s*\%(()\)\=\_s*{" end="}" contains=shFunctionKey,@shFunctionList contained skipwhite skipnl nextgroup=shFunctionStart,shQuickComment
569 ShFoldFunctions syn region shFunctionThree matchgroup=shFunction start="^\s*\h\w*\s*()\_s*(" end=")" contains=@shFunctionList skipwhite skipnl nextgroup=shFunctionStart,shQuickComment
570 ShFoldFunctions syn region shFunctionFour matchgroup=shFunction start="\%(do\)\@!\&\<\h\w*\>\s*\%(()\)\=\_s*(" end=")" contains=shFunctionKey,@shFunctionList contained skipwhite skipnl nextgroup=shFunctionStart,shQuickComment
Bram Moolenaar071d4272004-06-13 20:20:40 +0000571endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000572
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000573" Parameter Dereferencing: {{{1
574" ========================
Bram Moolenaarbe4e0162023-02-02 13:59:48 +0000575" Note: sh04 failure with following line
576"if !exists("g:sh_no_error") && !(exists("b:is_bash") || exists("b:is_kornshell") || exists("b:is_posix"))
577if !exists("g:sh_no_error")
Bram Moolenaar91c49372016-05-08 09:50:29 +0200578 syn match shDerefWordError "[^}$[~]" contained
Bram Moolenaar6be7f872012-01-20 21:08:56 +0100579endif
Bram Moolenaarb0d45e72017-11-05 18:19:24 +0100580syn match shDerefSimple "\$\%(\h\w*\|\d\)" nextgroup=@shNoZSList
Johnothan Kingadd31ba2024-01-22 11:19:54 -0800581if exists("b:is_kornshell")
582 syn region shDeref matchgroup=PreProc start="\${\ze[^ \t\n<|]" end="}" contains=@shDerefList,shDerefVarArray nextgroup=shSpecialStart
583else
584 syn region shDeref matchgroup=PreProc start="\${" end="}" contains=@shDerefList,shDerefVarArray nextgroup=shSpecialStart
585endif
Bram Moolenaarb0d45e72017-11-05 18:19:24 +0100586syn match shDerefSimple "\$[-#*@!?]" nextgroup=@shNoZSList
587syn match shDerefSimple "\$\$" nextgroup=@shNoZSList
Bram Moolenaar47e13952020-05-12 22:49:12 +0200588syn match shDerefSimple "\${\d}" nextgroup=@shNoZSList nextgroup=shSpecialStart
Bram Moolenaar51ad4ea2018-04-06 11:14:11 +0200589if exists("b:is_bash") || exists("b:is_kornshell") || exists("b:is_posix")
Bram Moolenaar47e13952020-05-12 22:49:12 +0200590 syn region shDeref matchgroup=PreProc start="\${##\=" end="}" contains=@shDerefList nextgroup=@shSpecialNoZS,shSpecialStart
591 syn region shDeref matchgroup=PreProc start="\${\$\$" end="}" contains=@shDerefList nextgroup=@shSpecialNoZS,shSpecialStart
Bram Moolenaar071d4272004-06-13 20:20:40 +0000592endif
593
Bram Moolenaar6ba83ba2022-06-12 22:15:57 +0100594" ksh: ${.sh.*} variables: {{{1
595" ========================================
596if exists("b:is_kornshell")
Bram Moolenaar6ba83ba2022-06-12 22:15:57 +0100597 syn match shDerefVar contained "\.\+" nextgroup=@shDerefVarList
598endif
599
Bram Moolenaarb4ff5182015-11-10 21:15:48 +0100600" ksh: ${!var[*]} array index list syntax: {{{1
601" ========================================
Bram Moolenaar51ad4ea2018-04-06 11:14:11 +0200602if exists("b:is_kornshell") || exists("b:is_posix")
Bram Moolenaarb4ff5182015-11-10 21:15:48 +0100603 syn region shDeref matchgroup=PreProc start="\${!" end="}" contains=@shDerefVarArray
604endif
605
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000606" bash: ${!prefix*} and ${#parameter}: {{{1
607" ====================================
Bram Moolenaar071d4272004-06-13 20:20:40 +0000608if exists("b:is_bash")
Bram Moolenaard58a3bf2020-09-28 21:48:16 +0200609 syn region shDeref matchgroup=PreProc start="\${!" end="\*\=}" contains=@shDerefList,shDerefOffset
Bram Moolenaarbc8801c2016-08-02 21:04:33 +0200610 syn match shDerefVar contained "{\@<=!\h\w*" nextgroup=@shDerefVarList
Bram Moolenaar071d4272004-06-13 20:20:40 +0000611endif
Bram Moolenaarb4ff5182015-11-10 21:15:48 +0100612if exists("b:is_kornshell")
Bram Moolenaarbc8801c2016-08-02 21:04:33 +0200613 syn match shDerefVar contained "{\@<=!\h\w*[[:alnum:]_.]*" nextgroup=@shDerefVarList
Bram Moolenaarb4ff5182015-11-10 21:15:48 +0100614endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000615
Bram Moolenaard58a3bf2020-09-28 21:48:16 +0200616syn match shDerefSpecial contained "{\@<=[-*@?0]" nextgroup=shDerefOp,shDerefOffset,shDerefOpError
Bram Moolenaar071d4272004-06-13 20:20:40 +0000617syn match shDerefSpecial contained "\({[#!]\)\@<=[[:alnum:]*@_]\+" nextgroup=@shDerefVarList,shDerefOp
Bram Moolenaarbc8801c2016-08-02 21:04:33 +0200618syn match shDerefVar contained "{\@<=\h\w*" nextgroup=@shDerefVarList
Bram Moolenaare4a3bcf2016-08-26 19:52:37 +0200619syn match shDerefVar contained '\d' nextgroup=@shDerefVarList
Bram Moolenaar51ad4ea2018-04-06 11:14:11 +0200620if exists("b:is_kornshell") || exists("b:is_posix")
Bram Moolenaarbc8801c2016-08-02 21:04:33 +0200621 syn match shDerefVar contained "{\@<=\h\w*[[:alnum:]_.]*" nextgroup=@shDerefVarList
Bram Moolenaarb4ff5182015-11-10 21:15:48 +0100622endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000623
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000624" sh ksh bash : ${var[... ]...} array reference: {{{1
Lucien Grondince3b0132023-11-04 09:41:37 +0100625syn region shDerefVarArray contained matchgroup=shDeref start="\[" end="]" contains=@shCommandSubList nextgroup=shDerefOp,shDerefOpError,shDerefOffset
Bram Moolenaar071d4272004-06-13 20:20:40 +0000626
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000627" Special ${parameter OPERATOR word} handling: {{{1
Bram Moolenaare2719092015-01-10 15:09:25 +0100628" sh ksh bash : ${parameter:-word} word is default value
629" sh ksh bash : ${parameter:=word} assign word as default value
630" sh ksh bash : ${parameter:?word} display word if parameter is null
631" sh ksh bash : ${parameter:+word} use word if parameter is not null, otherwise nothing
632" ksh bash : ${parameter#pattern} remove small left pattern
633" ksh bash : ${parameter##pattern} remove large left pattern
634" ksh bash : ${parameter%pattern} remove small right pattern
635" ksh bash : ${parameter%%pattern} remove large right pattern
636" bash : ${parameter^pattern} Case modification
637" bash : ${parameter^^pattern} Case modification
638" bash : ${parameter,pattern} Case modification
639" bash : ${parameter,,pattern} Case modification
Bram Moolenaard58a3bf2020-09-28 21:48:16 +0200640" bash : ${@:start:qty} display command line arguments from start to start+qty-1 (inferred)
Bram Moolenaardd60c362023-02-27 15:49:53 +0000641" bash : ${parameter@operator} transforms parameter (operator∈[uULqEPARa])
Bram Moolenaar071d4272004-06-13 20:20:40 +0000642syn cluster shDerefPatternList contains=shDerefPattern,shDerefString
Bram Moolenaar6be7f872012-01-20 21:08:56 +0100643if !exists("g:sh_no_error")
644 syn match shDerefOpError contained ":[[:punct:]]"
645endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000646syn match shDerefOp contained ":\=[-=?]" nextgroup=@shDerefPatternList
647syn match shDerefOp contained ":\=+" nextgroup=@shDerefPatternList
Bram Moolenaar51ad4ea2018-04-06 11:14:11 +0200648if exists("b:is_bash") || exists("b:is_kornshell") || exists("b:is_posix")
Bram Moolenaare4a3bcf2016-08-26 19:52:37 +0200649 syn match shDerefOp contained "#\{1,2}" nextgroup=@shDerefPatternList
650 syn match shDerefOp contained "%\{1,2}" nextgroup=@shDerefPatternList
Aliaksei Budavei48fa3192024-12-30 10:23:50 +0100651 syn match shDerefPattern contained "[^{}]\+" contains=shDeref,shDerefSimple,shDerefPattern,shDerefString,shCommandSub,shDerefEscape nextgroup=shDerefPattern skipnl
Bram Moolenaar071d4272004-06-13 20:20:40 +0000652 syn region shDerefPattern contained start="{" end="}" contains=shDeref,shDerefSimple,shDerefString,shCommandSub nextgroup=shDerefPattern
Aliaksei Budavei48fa3192024-12-30 10:23:50 +0100653 " Match parametric bracket expressions with a leading whitespace character.
654 syn region shDerefPattern contained matchgroup=shBracketExprDelim start="\[" end="\]" contains=@shBracketExprList,shDoubleQuote nextgroup=shDerefPattern
655 call s:GenerateBracketExpressionItems({'itemGroup': 'shDerefPattern', 'bracketGroup': 'shBracketExprDelim', 'extraArgs': 'contained nextgroup=shDerefPattern'})
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +0000656 syn match shDerefEscape contained '\%(\\\\\)*\\.'
Bram Moolenaar071d4272004-06-13 20:20:40 +0000657endif
Bram Moolenaard960d762011-09-21 19:22:10 +0200658if exists("b:is_bash")
659 syn match shDerefOp contained "[,^]\{1,2}" nextgroup=@shDerefPatternList
Bram Moolenaardd60c362023-02-27 15:49:53 +0000660 syn match shDerefOp contained "@[uULQEPAKa]"
Bram Moolenaard960d762011-09-21 19:22:10 +0200661endif
Doug Kearnsfe228672025-05-05 20:10:11 +0200662syn region shDerefString contained matchgroup=shDerefDelim start=+\%(\\\)\@<!'+ end=+'+
Bram Moolenaar4b22cdb2010-08-02 22:12:46 +0200663syn region shDerefString contained matchgroup=shDerefDelim start=+\%(\\\)\@<!"+ skip=+\\"+ end=+"+ contains=@shDblQuoteList,shStringSpecial
Bram Moolenaarc236c162008-07-13 17:41:49 +0000664syn match shDerefString contained "\\["']" nextgroup=shDerefPattern
Bram Moolenaar071d4272004-06-13 20:20:40 +0000665
Bram Moolenaard58a3bf2020-09-28 21:48:16 +0200666if exists("b:is_bash") || exists("b:is_kornshell") || exists("b:is_posix")
667 " bash ksh posix : ${parameter:offset}
668 " bash ksh posix : ${parameter:offset:length}
669 syn region shDerefOffset contained start=':[^-=?+]' end='\ze:' end='\ze}' contains=shDeref,shDerefSimple,shDerefEscape nextgroup=shDerefLen,shDeref,shDerefSimple
670 syn region shDerefOffset contained start=':\s-' end='\ze:' end='\ze}' contains=shDeref,shDerefSimple,shDerefEscape nextgroup=shDerefLen,shDeref,shDerefSimple
Bram Moolenaard2855f52018-07-31 22:23:58 +0200671 syn match shDerefLen contained ":[^}]\+" contains=shDeref,shDerefSimple,shArithmetic
Bram Moolenaard58a3bf2020-09-28 21:48:16 +0200672endif
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +0000673
Bram Moolenaard58a3bf2020-09-28 21:48:16 +0200674if exists("b:is_bash")
Aliaksei Budavei48fa3192024-12-30 10:23:50 +0100675 " bash : ${parameter/pattern/string}
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +0000676 " bash : ${parameter//pattern/string}
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +0000677 syn match shDerefPPS contained '/\{1,2}' nextgroup=shDerefPPSleft
Bram Moolenaard58a3bf2020-09-28 21:48:16 +0200678 syn region shDerefPPSleft contained start='.' skip=@\%(\\\\\)*\\/@ matchgroup=shDerefOp end='/' end='\ze}' end='"' nextgroup=shDerefPPSright contains=@shPPSLeftList
Bram Moolenaarb730f0c2018-11-25 03:56:26 +0100679 syn region shDerefPPSright contained start='.' skip=@\%(\\\\\)\+@ end='\ze}' contains=@shPPSRightList
Bram Moolenaaracb4f222016-01-10 15:59:26 +0100680
Aliaksei Budavei48fa3192024-12-30 10:23:50 +0100681 " bash : ${parameter/#pattern/string}
682 " bash : ${parameter/%pattern/string}
683 syn match shDerefPSR contained '/[#%]' nextgroup=shDerefPSRleft,shDoubleQuote,shSingleQuote
684 syn region shDerefPSRleft contained start='[^"']' skip=@\%(\\\\\)*\\/@ matchgroup=shDerefOp end='/' end='\ze}' nextgroup=shDerefPSRright contains=shBracketExpr
Bram Moolenaaracb4f222016-01-10 15:59:26 +0100685 syn region shDerefPSRright contained start='.' skip=@\%(\\\\\)\+@ end='\ze}'
Bram Moolenaar071d4272004-06-13 20:20:40 +0000686endif
687
Bram Moolenaarc236c162008-07-13 17:41:49 +0000688" Arithmetic Parenthesized Expressions: {{{1
Bram Moolenaarbc488a72013-07-05 21:01:22 +0200689"syn region shParen matchgroup=shArithRegion start='[^$]\zs(\%(\ze[^(]\|$\)' end=')' contains=@shArithParenList
690syn region shParen matchgroup=shArithRegion start='\$\@!(\%(\ze[^(]\|$\)' end=')' contains=@shArithParenList
Bram Moolenaarc236c162008-07-13 17:41:49 +0000691
Bram Moolenaar93a1df22018-09-10 11:51:50 +0200692" Additional sh Keywords: {{{1
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000693" ===================
Bram Moolenaar071d4272004-06-13 20:20:40 +0000694syn keyword shStatement break cd chdir continue eval exec exit kill newgrp pwd read readonly return shift test trap ulimit umask wait
695syn keyword shConditional contained elif else then
Bram Moolenaar6be7f872012-01-20 21:08:56 +0100696if !exists("g:sh_no_error")
697 syn keyword shCondError elif else then
698endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000699
Bram Moolenaar93a1df22018-09-10 11:51:50 +0200700" Additional ksh Keywords and Aliases: {{{1
701" ===================================
Bram Moolenaarb730f0c2018-11-25 03:56:26 +0100702if exists("b:is_kornshell") || exists("b:is_posix")
703 syn keyword shStatement bg builtin disown enum export false fg getconf getopts hist jobs let printf sleep true unalias whence
704 syn keyword shStatement typeset skipwhite nextgroup=shSetOption
Bram Moolenaar93a1df22018-09-10 11:51:50 +0200705 syn keyword shStatement autoload compound fc float functions hash history integer nameref nohup r redirect source stop suspend times type
Bram Moolenaar690afe12017-01-28 18:34:47 +0100706 if exists("b:is_posix")
Bram Moolenaarc236c162008-07-13 17:41:49 +0000707 syn keyword shStatement command
708 else
709 syn keyword shStatement time
710 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000711
Bram Moolenaar93a1df22018-09-10 11:51:50 +0200712" Additional bash Keywords: {{{1
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000713" =====================
Bram Moolenaarb730f0c2018-11-25 03:56:26 +0100714elseif exists("b:is_bash")
Eisuke Kawashima54cb5142025-01-18 10:11:28 +0100715 syn keyword shStatement bg builtin disown export false fg getopts jobs let printf true unalias
Bram Moolenaarb730f0c2018-11-25 03:56:26 +0100716 syn keyword shStatement typeset nextgroup=shSetOption
717 syn keyword shStatement fc hash history source suspend times type
Eisuke Kawashima54cb5142025-01-18 10:11:28 +0100718 syn keyword shStatement bind caller compopt declare dirs enable help logout local mapfile popd pushd readarray shopt typeset
Bram Moolenaarb730f0c2018-11-25 03:56:26 +0100719else
720 syn keyword shStatement login newgrp
Bram Moolenaar071d4272004-06-13 20:20:40 +0000721endif
722
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000723" Synchronization: {{{1
724" ================
Bram Moolenaar03413f42016-04-12 21:07:15 +0200725if !exists("g:sh_minlines")
726 let s:sh_minlines = 200
727else
728 let s:sh_minlines= g:sh_minlines
Bram Moolenaar071d4272004-06-13 20:20:40 +0000729endif
Bram Moolenaar03413f42016-04-12 21:07:15 +0200730if !exists("g:sh_maxlines")
731 let s:sh_maxlines = 2*s:sh_minlines
732 if s:sh_maxlines < 25
733 let s:sh_maxlines= 25
734 endif
735else
736 let s:sh_maxlines= g:sh_maxlines
Bram Moolenaar071d4272004-06-13 20:20:40 +0000737endif
Bram Moolenaar03413f42016-04-12 21:07:15 +0200738exec "syn sync minlines=" . s:sh_minlines . " maxlines=" . s:sh_maxlines
Bram Moolenaar071d4272004-06-13 20:20:40 +0000739syn sync match shCaseEsacSync grouphere shCaseEsac "\<case\>"
740syn sync match shCaseEsacSync groupthere shCaseEsac "\<esac\>"
741syn sync match shDoSync grouphere shDo "\<do\>"
742syn sync match shDoSync groupthere shDo "\<done\>"
743syn sync match shForSync grouphere shFor "\<for\>"
744syn sync match shForSync groupthere shFor "\<in\>"
745syn sync match shIfSync grouphere shIf "\<if\>"
746syn sync match shIfSync groupthere shIf "\<fi\>"
747syn sync match shUntilSync grouphere shRepeat "\<until\>"
748syn sync match shWhileSync grouphere shRepeat "\<while\>"
749
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000750" Default Highlighting: {{{1
751" =====================
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200752if !exists("skip_sh_syntax_inits")
753 hi def link shArithRegion shShellVariables
Aliaksei Budavei48fa3192024-12-30 10:23:50 +0100754 hi def link shArrayValue shDeref
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200755 hi def link shAstQuote shDoubleQuote
756 hi def link shAtExpr shSetList
Bram Moolenaard2855f52018-07-31 22:23:58 +0200757 hi def link shBkslshSnglQuote shSingleQuote
758 hi def link shBkslshDblQuote shDOubleQuote
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200759 hi def link shBeginHere shRedir
760 hi def link shCaseBar shConditional
761 hi def link shCaseCommandSub shCommandSub
762 hi def link shCaseDoubleQuote shDoubleQuote
763 hi def link shCaseIn shConditional
764 hi def link shQuote shOperator
765 hi def link shCaseSingleQuote shSingleQuote
766 hi def link shCaseStart shConditional
767 hi def link shCmdSubRegion shShellVariables
768 hi def link shColon shComment
769 hi def link shDerefOp shOperator
770 hi def link shDerefPOL shDerefOp
771 hi def link shDerefPPS shDerefOp
772 hi def link shDerefPSR shDerefOp
773 hi def link shDeref shShellVariables
774 hi def link shDerefDelim shOperator
775 hi def link shDerefSimple shDeref
776 hi def link shDerefSpecial shDeref
777 hi def link shDerefString shDoubleQuote
778 hi def link shDerefVar shDeref
779 hi def link shDoubleQuote shString
780 hi def link shEcho shString
781 hi def link shEchoDelim shOperator
782 hi def link shEchoQuote shString
783 hi def link shForPP shLoop
784 hi def link shFunction Function
785 hi def link shEmbeddedEcho shString
786 hi def link shEscape shCommandSub
787 hi def link shExDoubleQuote shDoubleQuote
788 hi def link shExSingleQuote shSingleQuote
789 hi def link shHereDoc shString
790 hi def link shHereString shRedir
791 hi def link shHerePayload shHereDoc
792 hi def link shLoop shStatement
793 hi def link shSpecialNxt shSpecial
794 hi def link shNoQuote shDoubleQuote
795 hi def link shOption shCommandSub
796 hi def link shPattern shString
797 hi def link shParen shArithmetic
798 hi def link shPosnParm shShellVariables
799 hi def link shQuickComment shComment
Bram Moolenaar93a1df22018-09-10 11:51:50 +0200800 hi def link shBQComment shComment
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200801 hi def link shRange shOperator
802 hi def link shRedir shOperator
803 hi def link shSetListDelim shOperator
804 hi def link shSetOption shOption
805 hi def link shSingleQuote shString
806 hi def link shSource shOperator
807 hi def link shStringSpecial shSpecial
Bram Moolenaar51ad4ea2018-04-06 11:14:11 +0200808 hi def link shSpecialStart shSpecial
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200809 hi def link shSubShRegion shOperator
810 hi def link shTestOpr shConditional
811 hi def link shTestPattern shString
812 hi def link shTestDoubleQuote shString
813 hi def link shTestSingleQuote shString
814 hi def link shTouchCmd shStatement
815 hi def link shVariable shSetList
816 hi def link shWrapLineOperator shOperator
Bram Moolenaar071d4272004-06-13 20:20:40 +0000817
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200818 if exists("b:is_bash")
819 hi def link bashAdminStatement shStatement
820 hi def link bashSpecialVariables shShellVariables
821 hi def link bashStatement shStatement
822 hi def link shCharClass shSpecial
Bram Moolenaard58a3bf2020-09-28 21:48:16 +0200823 hi def link shDerefOffset shDerefOp
824 hi def link shDerefLen shDerefOffset
Bram Moolenaar6be7f872012-01-20 21:08:56 +0100825 endif
Bram Moolenaar51ad4ea2018-04-06 11:14:11 +0200826 if exists("b:is_kornshell") || exists("b:is_posix")
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200827 hi def link kshSpecialVariables shShellVariables
828 hi def link kshStatement shStatement
829 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000830
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200831 if !exists("g:sh_no_error")
832 hi def link shCaseError Error
833 hi def link shCondError Error
834 hi def link shCurlyError Error
835 hi def link shDerefOpError Error
836 hi def link shDerefWordError Error
837 hi def link shDoError Error
838 hi def link shEsacError Error
839 hi def link shIfError Error
840 hi def link shInError Error
841 hi def link shParenError Error
842 hi def link shTestError Error
Bram Moolenaar51ad4ea2018-04-06 11:14:11 +0200843 if exists("b:is_kornshell") || exists("b:is_posix")
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200844 hi def link shDTestError Error
845 endif
846 endif
847
848 hi def link shArithmetic Special
Aliaksei Budavei48fa3192024-12-30 10:23:50 +0100849 hi def link shBracketExprDelim Delimiter
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200850 hi def link shCharClass Identifier
Aliaksei Budavei48fa3192024-12-30 10:23:50 +0100851 hi def link shCollSymb shCharClass
852 hi def link shEqClass shCharClass
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200853 hi def link shSnglCase Statement
854 hi def link shCommandSub Special
Bram Moolenaard2855f52018-07-31 22:23:58 +0200855 hi def link shCommandSubBQ shCommandSub
Johnothan Kingadd31ba2024-01-22 11:19:54 -0800856 hi def link shSubshare shCommandSub
857 hi def link shValsub shCommandSub
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200858 hi def link shComment Comment
859 hi def link shConditional Conditional
860 hi def link shCtrlSeq Special
861 hi def link shExprRegion Delimiter
862 hi def link shFunctionKey Function
863 hi def link shFunctionName Function
864 hi def link shNumber Number
865 hi def link shOperator Operator
866 hi def link shRepeat Repeat
867 hi def link shSet Statement
868 hi def link shSetList Identifier
869 hi def link shShellVariables PreProc
870 hi def link shSpecial Special
Bram Moolenaard2855f52018-07-31 22:23:58 +0200871 hi def link shSpecialDQ Special
872 hi def link shSpecialSQ Special
Bram Moolenaarb0d45e72017-11-05 18:19:24 +0100873 hi def link shSpecialNoZS shSpecial
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200874 hi def link shStatement Statement
875 hi def link shString String
876 hi def link shTodo Todo
877 hi def link shAlias Identifier
878 hi def link shHereDoc01 shRedir
879 hi def link shHereDoc02 shRedir
880 hi def link shHereDoc03 shRedir
881 hi def link shHereDoc04 shRedir
882 hi def link shHereDoc05 shRedir
883 hi def link shHereDoc06 shRedir
884 hi def link shHereDoc07 shRedir
885 hi def link shHereDoc08 shRedir
886 hi def link shHereDoc09 shRedir
887 hi def link shHereDoc10 shRedir
888 hi def link shHereDoc11 shRedir
889 hi def link shHereDoc12 shRedir
890 hi def link shHereDoc13 shRedir
891 hi def link shHereDoc14 shRedir
892 hi def link shHereDoc15 shRedir
Bram Moolenaar23515b42020-11-29 14:36:24 +0100893 hi def link shHereDoc16 shRedir
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200894endif
Bram Moolenaarb4ff5182015-11-10 21:15:48 +0100895
896" Delete shell folding commands {{{1
897" =============================
898delc ShFoldFunctions
899delc ShFoldHereDoc
900delc ShFoldIfDoFor
Bram Moolenaar071d4272004-06-13 20:20:40 +0000901
Aliaksei Budavei48fa3192024-12-30 10:23:50 +0100902" Delete the bracket expression function {{{1
903" ======================================
904delfun s:GenerateBracketExpressionItems
905
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000906" Set Current Syntax: {{{1
907" ===================
Bram Moolenaar071d4272004-06-13 20:20:40 +0000908if exists("b:is_bash")
909 let b:current_syntax = "bash"
910elseif exists("b:is_kornshell")
911 let b:current_syntax = "ksh"
Bram Moolenaar51ad4ea2018-04-06 11:14:11 +0200912elseif exists("b:is_posix")
913 let b:current_syntax = "posix"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000914else
915 let b:current_syntax = "sh"
916endif
917
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000918" vim: ts=16 fdm=marker