blob: c04b16fa0e90210f306ac9ad963f778dc721c291 [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
Bram Moolenaar71badf92023-04-22 22:40:14 +010016" Version: 208
Christian Brabandtf9ca1392024-02-19 20:37:11 +010017" Former URL: http://www.drchip.org/astronaut/vim/index.html#SYNTAX_SH
Bram Moolenaare2719092015-01-10 15:09:25 +010018" For options and settings, please use: :help ft-sh-syntax
Bram Moolenaar23515b42020-11-29 14:36:24 +010019" 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 +000020
Bram Moolenaarf37506f2016-08-31 22:22:10 +020021" quit when a syntax file was already loaded {{{1
Bram Moolenaar89bcfda2016-08-30 23:26:57 +020022if exists("b:current_syntax")
Bram Moolenaar071d4272004-06-13 20:20:40 +000023 finish
24endif
25
Mohamed Akram51a06ec2025-03-21 17:52:08 +010026" Ensure this is set unless we find another shell
27let b:is_sh = 1
28
Bram Moolenaard2ea7cf2021-05-30 20:54:13 +020029" If the shell script itself specifies which shell to use, use it
Aliaksei Budavei5c84d122025-04-10 21:52:14 +020030let s:shebang = getline(1)
31
32if s:shebang =~ '^#!.\{-2,}\<ksh\>'
Bram Moolenaar91c49372016-05-08 09:50:29 +020033 let b:is_kornshell = 1
Aliaksei Budavei5c84d122025-04-10 21:52:14 +020034elseif s:shebang =~ '^#!.\{-2,}\<bash\>'
Bram Moolenaar91c49372016-05-08 09:50:29 +020035 let b:is_bash = 1
Aliaksei Budavei5c84d122025-04-10 21:52:14 +020036elseif s:shebang =~ '^#!.\{-2,}\<dash\>'
Bram Moolenaard58a3bf2020-09-28 21:48:16 +020037 let b:is_dash = 1
Bram Moolenaard4755bb2004-09-02 19:12:26 +000038" handling /bin/sh with is_kornshell/is_sh {{{1
Bram Moolenaard2ea7cf2021-05-30 20:54:13 +020039" b:is_sh will be set when "#! /bin/sh" is found;
Bram Moolenaar071d4272004-06-13 20:20:40 +000040" However, it often is just a masquerade by bash (typically Linux)
41" or kornshell (typically workstations with Posix "sh").
Mohamed Akram51a06ec2025-03-21 17:52:08 +010042" So, when the user sets "g:is_kornshell", "g:is_bash",
43" "g:is_posix" or "g:is_dash", a b:is_sh is converted into
44" b:is_kornshell/b:is_bash/b:is_posix/b:is_dash, respectively.
45elseif !exists("b:is_kornshell") && !exists("b:is_bash") && !exists("b:is_posix") && !exists("b:is_dash")
46 if exists("g:is_kornshell")
47 let b:is_kornshell= 1
48 elseif exists("g:is_bash")
49 let b:is_bash= 1
50 elseif exists("g:is_dash")
51 let b:is_dash= 1
52 elseif exists("g:is_posix")
53 let b:is_posix= 1
54 elseif exists("g:is_sh")
55 let b:is_sh= 1
56 else
57 " user did not specify which shell to use, and
58 " the script itself does not specify which shell to use. FYI: /bin/sh is ambiguous.
59 " Assuming /bin/sh is executable, and if its a link, find out what it links to.
60 let s:shell = ""
61 if executable("/bin/sh")
62 let s:shell = resolve("/bin/sh")
63 elseif executable("/usr/bin/sh")
64 let s:shell = resolve("/usr/bin/sh")
Bram Moolenaar7fc904b2006-04-13 20:37:35 +000065 endif
Mohamed Akram51a06ec2025-03-21 17:52:08 +010066 if s:shell =~ '\<ksh\>'
67 let b:is_kornshell= 1
68 elseif s:shell =~ '\<bash\>'
69 let b:is_bash = 1
70 elseif s:shell =~ '\<dash\>'
71 let b:is_dash = 1
Bram Moolenaar071d4272004-06-13 20:20:40 +000072 else
Mohamed Akram51a06ec2025-03-21 17:52:08 +010073 let b:is_posix = 1
Bram Moolenaar071d4272004-06-13 20:20:40 +000074 endif
Mohamed Akram51a06ec2025-03-21 17:52:08 +010075 unlet s:shell
76 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +000077endif
78
Aliaksei Budavei5c84d122025-04-10 21:52:14 +020079unlet s:shebang
80
Bram Moolenaard58a3bf2020-09-28 21:48:16 +020081" if b:is_dash, set b:is_posix too
82if exists("b:is_dash")
83 let b:is_posix= 1
84endif
85
Mohamed Akram51a06ec2025-03-21 17:52:08 +010086if exists("b:is_kornshell") || exists("b:is_bash")
87 if exists("b:is_sh")
88 unlet b:is_sh
89 endif
90endif
91
Bram Moolenaarcd71fa32005-03-11 22:46:48 +000092" set up default g:sh_fold_enabled {{{1
Bram Moolenaarb4ff5182015-11-10 21:15:48 +010093" ================================
Bram Moolenaar071d4272004-06-13 20:20:40 +000094if !exists("g:sh_fold_enabled")
95 let g:sh_fold_enabled= 0
Bram Moolenaar293ee4d2004-12-09 21:34:53 +000096elseif g:sh_fold_enabled != 0 && !has("folding")
97 let g:sh_fold_enabled= 0
Bram Moolenaarcd71fa32005-03-11 22:46:48 +000098 echomsg "Ignoring g:sh_fold_enabled=".g:sh_fold_enabled."; need to re-compile vim for +fold support"
99endif
Bram Moolenaar86b48162022-12-06 18:20:10 +0000100let s:sh_fold_functions= and(g:sh_fold_enabled,1)
101let s:sh_fold_heredoc = and(g:sh_fold_enabled,2)
102let s:sh_fold_ifdofor = and(g:sh_fold_enabled,4)
Bram Moolenaarcd71fa32005-03-11 22:46:48 +0000103if g:sh_fold_enabled && &fdm == "manual"
Bram Moolenaar97d62492012-11-15 21:28:22 +0100104 " Given that the user provided g:sh_fold_enabled
105 " AND g:sh_fold_enabled is manual (usual default)
106 " implies a desire for syntax-based folding
107 setl fdm=syntax
Bram Moolenaar071d4272004-06-13 20:20:40 +0000108endif
109
Bram Moolenaard2ea7cf2021-05-30 20:54:13 +0200110" set up the syntax-highlighting for iskeyword
Bram Moolenaar723dd942019-04-04 13:11:03 +0200111if (v:version == 704 && has("patch-7.4.1142")) || v:version > 704
Bram Moolenaard2ea7cf2021-05-30 20:54:13 +0200112 if !exists("g:sh_syntax_isk") || (exists("g:sh_syntax_isk") && g:sh_syntax_isk)
113 if exists("b:is_bash")
114 exe "syn iskeyword ".&iskeyword.",-,:"
115 else
116 exe "syn iskeyword ".&iskeyword.",-"
117 endif
Bram Moolenaar91c49372016-05-08 09:50:29 +0200118 endif
Bram Moolenaare0fa3742016-02-20 15:47:01 +0100119endif
120
Bram Moolenaarb4ff5182015-11-10 21:15:48 +0100121" Set up folding commands for shell {{{1
122" =================================
Bram Moolenaar86b48162022-12-06 18:20:10 +0000123sil! delc ShFoldFunctions
124sil! delc ShFoldHereDoc
125sil! delc ShFoldIfDoFor
Bram Moolenaarb4ff5182015-11-10 21:15:48 +0100126if s:sh_fold_functions
127 com! -nargs=* ShFoldFunctions <args> fold
128else
129 com! -nargs=* ShFoldFunctions <args>
130endif
131if s:sh_fold_heredoc
132 com! -nargs=* ShFoldHereDoc <args> fold
133else
134 com! -nargs=* ShFoldHereDoc <args>
135endif
136if s:sh_fold_ifdofor
137 com! -nargs=* ShFoldIfDoFor <args> fold
138else
139 com! -nargs=* ShFoldIfDoFor <args>
140endif
141
Aliaksei Budavei48fa3192024-12-30 10:23:50 +0100142" Generate bracket expression items {{{1
143" =================================
144" Note that the following function can be invoked as many times as necessary
145" provided that these constraints hold for the passed dictionary argument:
146" - every time a unique group-name value is assigned to the "itemGroup" key;
147" - only ONCE either the "extraArgs" key is not entered or it is entered and
148" its value does not have "contained" among other optional arguments (":help
149" :syn-arguments").
150fun! s:GenerateBracketExpressionItems(dict) abort
151 let itemGroup = a:dict.itemGroup
152 let bracketGroup = a:dict.bracketGroup
153 let invGroup = itemGroup . 'Inv'
154 let skipLeftBracketGroup = itemGroup . 'SkipLeftBracket'
155 let skipRightBracketGroup = itemGroup . 'SkipRightBracket'
156 let extraArgs = has_key(a:dict, 'extraArgs') ? a:dict.extraArgs : ''
157
158 " Make the leading "[!^]" stand out in a NON-matching expression.
159 exec 'syn match ' . invGroup . ' contained "\[\@<=[!^]"'
160
161 " Set up indirections for unbalanced-bracket highlighting.
162 exec 'syn region ' . skipRightBracketGroup . ' contained matchgroup=' . bracketGroup . ' start="\[\%([!^]\=\\\=\]\)\@=" matchgroup=shCollSymb end="\[\.[^]]\{-}\][^]]\{-}\.\]" matchgroup=' . itemGroup . ' end="\]" contains=@shBracketExprList,shDoubleQuote,' . invGroup
163 exec 'syn region ' . skipLeftBracketGroup . ' contained matchgroup=' . bracketGroup . ' start="\[\%([!^]\=\\\=\]\)\@=" skip="[!^]\=\\\=\]\%(\[[^]]\+\]\|[^]]\)\{-}\%(\[[:.=]\@!\)\@=" matchgroup=' . itemGroup . ' end="\[[:.=]\@!" contains=@shBracketExprList,shDoubleQuote,' . invGroup
164
165 " Look for a general matching expression.
166 exec 'syn region ' . itemGroup . ' matchgroup=' . bracketGroup . ' start="\[\S\@=" end="\]" contains=@shBracketExprList,shDoubleQuote ' . extraArgs
167 " Look for a general NON-matching expression.
168 exec 'syn region ' . itemGroup . ' matchgroup=' . bracketGroup . ' start="\[[!^]\@=" end="\]" contains=@shBracketExprList,shDoubleQuote,' . invGroup . ' ' . extraArgs
169
170 " Accommodate unbalanced brackets in bracket expressions. The supported
171 " syntax for a plain "]" can be: "[]ws]" and "[^]ws]"; or, "[ws[.xs]ys.]zs]"
172 " and "[^ws[.xs]ys.]zs]"; see §9.3.5 RE Bracket Expression (in XBD).
173 exec 'syn region ' . itemGroup . ' matchgroup=NONE start="\[[!^]\=\\\=\]" matchgroup=' . bracketGroup . ' end="\]" contains=@shBracketExprList,shDoubleQuote,' . skipRightBracketGroup . ' ' . extraArgs
174 " Strive to handle "[]...[]" etc.
175 exec 'syn region ' . itemGroup . ' matchgroup=NONE start="\[[!^]\=\\\=\]\%(\[[^]]\+\]\|[^]]\)\{-}\[[:.=]\@!" matchgroup=' . bracketGroup . ' end="\]" contains=@shBracketExprList,shDoubleQuote,' . skipLeftBracketGroup . ' ' . extraArgs
176
177 if !exists("g:skip_sh_syntax_inits")
178 exec 'hi def link ' . skipLeftBracketGroup . ' ' . itemGroup
179 exec 'hi def link ' . skipRightBracketGroup . ' ' . itemGroup
180 exec 'hi def link ' . invGroup . ' Underlined'
181 endif
182endfun
183
184call s:GenerateBracketExpressionItems({'itemGroup': 'shBracketExpr', 'bracketGroup': 'shBracketExprDelim'})
185
Bram Moolenaarcd71fa32005-03-11 22:46:48 +0000186" sh syntax is case sensitive {{{1
Bram Moolenaar071d4272004-06-13 20:20:40 +0000187syn case match
188
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000189" Clusters: contains=@... clusters {{{1
Bram Moolenaar071d4272004-06-13 20:20:40 +0000190"==================================
Bram Moolenaar5c736222010-01-06 20:54:52 +0100191syn cluster shErrorList contains=shDoError,shIfError,shInError,shCaseError,shEsacError,shCurlyError,shParenError,shTestError,shOK
Bram Moolenaar51ad4ea2018-04-06 11:14:11 +0200192if exists("b:is_kornshell") || exists("b:is_bash")
Bram Moolenaarc236c162008-07-13 17:41:49 +0000193 syn cluster ErrorList add=shDTestError
194endif
Aliaksei Budavei48fa3192024-12-30 10:23:50 +0100195syn 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 +0000196syn cluster shArithList contains=@shArithParenList,shParenError
Aliaksei Budavei48fa3192024-12-30 10:23:50 +0100197syn cluster shBracketExprList contains=shCharClassOther,shCharClass,shCollSymb,shEqClass
Bram Moolenaard2855f52018-07-31 22:23:58 +0200198syn 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 -0800199syn 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 +0100200if exists("b:is_kornshell") || exists("b:is_bash")
Lucien Grondin1858e2b2023-11-02 20:33:56 +0100201 syn cluster shCaseList add=shForPP,shDblParen
Bram Moolenaar23515b42020-11-29 14:36:24 +0100202endif
Aliaksei Budavei48fa3192024-12-30 10:23:50 +0100203syn 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 +0000204syn cluster shCurlyList contains=shNumber,shComma,shDeref,shDerefSimple,shDerefSpecial
Bram Moolenaar6ba83ba2022-06-12 22:15:57 +0100205" 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 -0800206syn cluster shDblQuoteList contains=shArithmetic,shCommandSub,shCommandSubBQ,shSubshare,shValsub,shDeref,shDerefSimple,shEscape,shPosnParm,shCtrlSeq,shSpecial,shSpecialDQ
Bram Moolenaaracb4f222016-01-10 15:59:26 +0100207syn cluster shDerefList contains=shDeref,shDerefSimple,shDerefVar,shDerefSpecial,shDerefWordError,shDerefPSR,shDerefPPS
Bram Moolenaard58a3bf2020-09-28 21:48:16 +0200208syn cluster shDerefVarList contains=shDerefOffset,shDerefOp,shDerefVarArray,shDerefOpError
Aliaksei Budavei48fa3192024-12-30 10:23:50 +0100209syn cluster shEchoList contains=shArithmetic,shBracketExpr,shCommandSub,shCommandSubBQ,shDerefVarArray,shSubshare,shValsub,shDeref,shDerefSimple,shEscape,shExSingleQuote,shExDoubleQuote,shSingleQuote,shDoubleQuote,shCtrlSeq,shEchoQuote
210syn cluster shExprList1 contains=shBracketExpr,shNumber,shOperator,shExSingleQuote,shExDoubleQuote,shSingleQuote,shDoubleQuote,shExpr,shDblBrace,shDeref,shDerefSimple,shCtrlSeq
Bram Moolenaar383f9bc2005-01-19 22:18:32 +0000211syn cluster shExprList2 contains=@shExprList1,@shCaseList,shTest
Aliaksei Budavei48fa3192024-12-30 10:23:50 +0100212syn 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 +0000213if exists("b:is_kornshell") || exists("b:is_bash")
Bram Moolenaar23515b42020-11-29 14:36:24 +0100214 syn cluster shFunctionList add=shRepeat,shDblBrace,shDblParen,shForPP
Bram Moolenaar6ba83ba2022-06-12 22:15:57 +0100215 syn cluster shDerefList add=shCommandSubList,shEchoDeref
Bram Moolenaar7263a772007-05-10 17:35:54 +0000216endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000217syn cluster shHereBeginList contains=@shCommandSubList
218syn cluster shHereList contains=shBeginHere,shHerePayload
219syn cluster shHereListDQ contains=shBeginHere,@shDblQuoteList,shHerePayload
Aliaksei Budavei48fa3192024-12-30 10:23:50 +0100220syn 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 +0200221syn cluster shIfList contains=@shLoopList,shDblBrace,shDblParen,shFunctionKey,shFunctionOne,shFunctionTwo
Bram Moolenaar23515b42020-11-29 14:36:24 +0100222syn cluster shLoopList contains=@shCaseList,@shErrorList,shCaseEsac,shConditional,shDblBrace,shExpr,shFor,shIf,shOption,shSet,shTest,shTestOpr,shTouch
223if exists("b:is_kornshell") || exists("b:is_bash")
Lucien Grondina390e982023-10-28 21:40:48 +0200224 syn cluster shLoopList add=shForPP,shDblParen
Bram Moolenaar23515b42020-11-29 14:36:24 +0100225endif
Aliaksei Budavei48fa3192024-12-30 10:23:50 +0100226syn 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 +0000227syn cluster shPPSRightList contains=shDeref,shDerefSimple,shEscape,shPosnParm
Aliaksei Budavei48fa3192024-12-30 10:23:50 +0100228syn 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
229syn 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 +0100230syn cluster shNoZSList contains=shSpecialNoZS
Johnothan Kingadd31ba2024-01-22 11:19:54 -0800231syn cluster shForList contains=shTestOpr,shNumber,shDerefSimple,shDeref,shCommandSub,shCommandSubBQ,shSubshare,shValsub,shArithmetic
Bram Moolenaarb4ff5182015-11-10 21:15:48 +0100232
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000233" Echo: {{{1
Bram Moolenaar071d4272004-06-13 20:20:40 +0000234" ====
235" This one is needed INSIDE a CommandSub, so that `echo bla` be correct
Johnothan Kingadd31ba2024-01-22 11:19:54 -0800236if exists("b:is_kornshell")
237 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
238 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
239else
240 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
241 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
242endif
Bram Moolenaar6ba83ba2022-06-12 22:15:57 +0100243if exists("b:is_kornshell") || exists("b:is_bash") || exists("b:is_posix")
244 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
245 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
246endif
Bram Moolenaar5c736222010-01-06 20:54:52 +0100247syn match shEchoQuote contained '\%(\\\\\)*\\["`'()]'
Bram Moolenaar071d4272004-06-13 20:20:40 +0000248
Bram Moolenaarc236c162008-07-13 17:41:49 +0000249" This must be after the strings, so that ... \" will be correct
Aliaksei Budavei48fa3192024-12-30 10:23:50 +0100250syn 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 +0000251
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000252" Alias: {{{1
Bram Moolenaar071d4272004-06-13 20:20:40 +0000253" =====
Bram Moolenaar51ad4ea2018-04-06 11:14:11 +0200254if exists("b:is_kornshell") || exists("b:is_bash") || exists("b:is_posix")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000255 syn match shStatement "\<alias\>"
Bram Moolenaarbe4e0162023-02-02 13:59:48 +0000256 syn region shAlias matchgroup=shStatement start="\<alias\>\s\+\(\h[-._[:alnum:]]*\)\@=" skip="\\$" end="\>\|`"
257 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="="
Bram Moolenaarb4ff5182015-11-10 21:15:48 +0100260
261 " Touch: {{{1
262 " =====
Bram Moolenaar6d5ad4c2016-10-27 17:00:16 +0200263 syn match shTouch '\<touch\>[^;#]*' skipwhite nextgroup=shComment contains=shTouchCmd,shDoubleQuote,shSingleQuote,shDeref,shDerefSimple
Bram Moolenaarb4ff5182015-11-10 21:15:48 +0100264 syn match shTouchCmd '\<touch\>' contained
Bram Moolenaar071d4272004-06-13 20:20:40 +0000265endif
266
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000267" Error Codes: {{{1
268" ============
Bram Moolenaar6be7f872012-01-20 21:08:56 +0100269if !exists("g:sh_no_error")
Bram Moolenaare2719092015-01-10 15:09:25 +0100270 syn match shDoError "\<done\>"
271 syn match shIfError "\<fi\>"
272 syn match shInError "\<in\>"
273 syn match shCaseError ";;"
274 syn match shEsacError "\<esac\>"
275 syn match shCurlyError "}"
276 syn match shParenError ")"
277 syn match shOK '\.\(done\|fi\|in\|esac\)'
Bram Moolenaar51ad4ea2018-04-06 11:14:11 +0200278 if exists("b:is_kornshell") || exists("b:is_bash")
Bram Moolenaare2719092015-01-10 15:09:25 +0100279 syn match shDTestError "]]"
Bram Moolenaar6be7f872012-01-20 21:08:56 +0100280 endif
Bram Moolenaare2719092015-01-10 15:09:25 +0100281 syn match shTestError "]"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000282endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000283
Bram Moolenaarc236c162008-07-13 17:41:49 +0000284" Options: {{{1
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000285" ====================
Bram Moolenaar7db8f6f2016-03-29 23:12:46 +0200286syn match shOption "\s\zs[-+][-_a-zA-Z#@]\+"
Bram Moolenaar1d9215b2020-01-25 13:27:42 +0100287syn match shOption "\s\zs--[^ \t$=`'"|);]\+"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000288
Bram Moolenaar7263a772007-05-10 17:35:54 +0000289" File Redirection Highlighted As Operators: {{{1
290"===========================================
291syn match shRedir "\d\=>\(&[-0-9]\)\="
292syn match shRedir "\d\=>>-\="
293syn match shRedir "\d\=<\(&[-0-9]\)\="
294syn match shRedir "\d<<-\="
295
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000296" Operators: {{{1
297" ==========
Bram Moolenaar7263a772007-05-10 17:35:54 +0000298syn match shOperator "<<\|>>" contained
Bram Moolenaarc236c162008-07-13 17:41:49 +0000299syn match shOperator "[!&;|]" contained
Bram Moolenaar541f92d2015-06-19 13:27:23 +0200300syn match shOperator "[-=/*+%]\==" skipwhite nextgroup=shPattern
Bram Moolenaare90ee312010-08-05 22:08:47 +0200301syn match shPattern "\<\S\+\())\)\@=" contained contains=shExSingleQuote,shSingleQuote,shExDoubleQuote,shDoubleQuote,shDeref
Bram Moolenaar071d4272004-06-13 20:20:40 +0000302
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000303" Subshells: {{{1
304" ==========
Bram Moolenaare4a3bcf2016-08-26 19:52:37 +0200305syn region shExpr transparent matchgroup=shExprRegion start="{" end="}" contains=@shExprList2 nextgroup=shSpecialNxt
306syn region shSubSh transparent matchgroup=shSubShRegion start="[^(]\zs(" end=")" contains=@shSubShList nextgroup=shSpecialNxt
Bram Moolenaar071d4272004-06-13 20:20:40 +0000307
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000308" Tests: {{{1
309"=======
Aliaksei Budavei48fa3192024-12-30 10:23:50 +0100310syn region shExpr matchgroup=shRange start="\[\s\@=" skip=+\\\\\|\\$\|\[+ end="\]" contains=@shTestList,shSpecial
Bram Moolenaar5c736222010-01-06 20:54:52 +0100311syn 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 +0200312syn region shNoQuote start='\S' skip='\%(\\\\\)*\\.' end='\ze\s' end="\ze['"]" contained contains=shBracketExpr,shDerefSimple,shDeref,shEscape
Bram Moolenaar91c49372016-05-08 09:50:29 +0200313syn match shAstQuote contained '\*\ze"' nextgroup=shString
Bram Moolenaar541f92d2015-06-19 13:27:23 +0200314syn match shTestOpr contained '[^-+/%]\zs=' skipwhite nextgroup=shTestDoubleQuote,shTestSingleQuote,shTestPattern
Bram Moolenaarb4ff5182015-11-10 21:15:48 +0100315syn match shTestOpr contained "<=\|>=\|!=\|==\|=\~\|-.\>\|-\(nt\|ot\|ef\|eq\|ne\|lt\|le\|gt\|ge\)\>\|[!<>]"
Bram Moolenaar9964e462007-05-05 17:54:07 +0000316syn match shTestPattern contained '\w\+'
Bram Moolenaar91c49372016-05-08 09:50:29 +0200317syn region shTestDoubleQuote contained start='\%(\%(\\\\\)*\\\)\@<!"' skip=+\\\\\|\\"+ end='"' contains=shDeref,shDerefSimple,shDerefSpecial
Bram Moolenaarb0d45e72017-11-05 18:19:24 +0100318syn match shTestSingleQuote contained '\\.' nextgroup=shTestSingleQuote
Bram Moolenaar9964e462007-05-05 17:54:07 +0000319syn match shTestSingleQuote contained "'[^']*'"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000320if exists("b:is_kornshell") || exists("b:is_bash")
Aliaksei Budavei48fa3192024-12-30 10:23:50 +0100321 syn region shDblBrace matchgroup=Delimiter start="\[\[\s\@=" skip=+\%(\\\\\)*\\$+ end="\]\]" contains=@shTestList,shAstQuote,shNoQuote,shComment
Bram Moolenaarb4ff5182015-11-10 21:15:48 +0100322 syn region shDblParen matchgroup=Delimiter start="((" skip=+\%(\\\\\)*\\$+ end="))" contains=@shTestList,shComment
Bram Moolenaar071d4272004-06-13 20:20:40 +0000323endif
324
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000325" Character Class In Range: {{{1
326" =========================
Aliaksei Budavei48fa3192024-12-30 10:23:50 +0100327syn match shCharClassOther contained "\[:\w\{-}:\]"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000328syn match shCharClass contained "\[:\(backspace\|escape\|return\|xdigit\|alnum\|alpha\|blank\|cntrl\|digit\|graph\|lower\|print\|punct\|space\|upper\|tab\):\]"
Aliaksei Budavei48fa3192024-12-30 10:23:50 +0100329syn match shCollSymb contained "\[\..\{-}\.\]"
330syn match shEqClass contained "\[=.\{-}=\]"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000331
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000332" Loops: do, if, while, until {{{1
333" ======
Bram Moolenaarb4ff5182015-11-10 21:15:48 +0100334ShFoldIfDoFor syn region shDo transparent matchgroup=shConditional start="\<do\>" matchgroup=shConditional end="\<done\>" contains=@shLoopList
335ShFoldIfDoFor syn region shIf transparent matchgroup=shConditional start="\<if\_s" matchgroup=shConditional skip=+-fi\>+ end="\<;\_s*then\>" end="\<fi\>" contains=@shIfList
336ShFoldIfDoFor 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 +0100337if exists("b:is_kornshell") || exists("b:is_bash")
338 ShFoldIfDoFor syn region shForPP matchgroup=shLoop start='\<for\>\_s*((' end='))' contains=@shForList
339endif
Bram Moolenaarb4ff5182015-11-10 21:15:48 +0100340
Bram Moolenaar51ad4ea2018-04-06 11:14:11 +0200341if exists("b:is_kornshell") || exists("b:is_bash") || exists("b:is_posix")
Bram Moolenaarc236c162008-07-13 17:41:49 +0000342 syn cluster shCaseList add=shRepeat
343 syn cluster shFunctionList add=shRepeat
Bram Moolenaar51ad4ea2018-04-06 11:14:11 +0200344 syn region shRepeat matchgroup=shLoop start="\<while\_s" end="\<do\>"me=e-2 contains=@shLoopList,shDblParen,shDblBrace
345 syn region shRepeat matchgroup=shLoop start="\<until\_s" end="\<do\>"me=e-2 contains=@shLoopList,shDblParen,shDblBrace
346 if !exists("b:is_posix")
347 syn region shCaseEsac matchgroup=shConditional start="\<select\s" matchgroup=shConditional end="\<in\>" end="\<do\>" contains=@shLoopList
348 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000349else
Bram Moolenaarc236c162008-07-13 17:41:49 +0000350 syn region shRepeat matchgroup=shLoop start="\<while\_s" end="\<do\>"me=e-2 contains=@shLoopList
351 syn region shRepeat matchgroup=shLoop start="\<until\_s" end="\<do\>"me=e-2 contains=@shLoopList
Bram Moolenaar071d4272004-06-13 20:20:40 +0000352endif
Bram Moolenaar572cb562005-08-05 21:35:02 +0000353syn region shCurlyIn contained matchgroup=Delimiter start="{" end="}" contains=@shCurlyList
354syn match shComma contained ","
Bram Moolenaar071d4272004-06-13 20:20:40 +0000355
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000356" Case: case...esac {{{1
Bram Moolenaar071d4272004-06-13 20:20:40 +0000357" ====
Bram Moolenaard2855f52018-07-31 22:23:58 +0200358syn match shCaseBar contained skipwhite "\(^\|[^\\]\)\(\\\\\)*\zs|" nextgroup=shCase,shCaseStart,shCaseBar,shComment,shCaseExSingleQuote,shCaseSingleQuote,shCaseDoubleQuote
359syn match shCaseStart contained skipwhite skipnl "(" nextgroup=shCase,shCaseBar
Aliaksei Budavei48fa3192024-12-30 10:23:50 +0100360syn match shCaseLabel contained skipwhite "\%(\\.\|[-a-zA-Z0-9_*.]\)\+" contains=shBracketExpr
Bram Moolenaarb0d45e72017-11-05 18:19:24 +0100361if exists("b:is_bash")
Bram Moolenaard2855f52018-07-31 22:23:58 +0200362 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 +0100363elseif exists("b:is_kornshell")
364 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 +0100365else
Bram Moolenaard2855f52018-07-31 22:23:58 +0200366 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 +0100367endif
Bram Moolenaard2855f52018-07-31 22:23:58 +0200368ShFoldIfDoFor syn region shCaseEsac matchgroup=shConditional start="\<case\>" end="\<esac\>" contains=@shCaseEsacList
Bram Moolenaarb4ff5182015-11-10 21:15:48 +0100369
Bram Moolenaardf177f62005-02-22 08:39:57 +0000370syn keyword shCaseIn contained skipwhite skipnl in nextgroup=shCase,shCaseStart,shCaseBar,shComment,shCaseExSingleQuote,shCaseSingleQuote,shCaseDoubleQuote
Bram Moolenaar6ba83ba2022-06-12 22:15:57 +0100371if exists("b:is_bash") || exists("b:is_kornshell")
Bram Moolenaar4b22cdb2010-08-02 22:12:46 +0200372 syn region shCaseExSingleQuote matchgroup=shQuote start=+\$'+ skip=+\\\\\|\\.+ end=+'+ contains=shStringSpecial,shSpecial skipwhite skipnl nextgroup=shCaseBar contained
Bram Moolenaar6be7f872012-01-20 21:08:56 +0100373elseif !exists("g:sh_no_error")
Bram Moolenaardf177f62005-02-22 08:39:57 +0000374 syn region shCaseExSingleQuote matchgroup=Error start=+\$'+ skip=+\\\\\|\\.+ end=+'+ contains=shStringSpecial skipwhite skipnl nextgroup=shCaseBar contained
375endif
Bram Moolenaar4b22cdb2010-08-02 22:12:46 +0200376syn region shCaseSingleQuote matchgroup=shQuote start=+'+ end=+'+ contains=shStringSpecial skipwhite skipnl nextgroup=shCaseBar contained
377syn region shCaseDoubleQuote matchgroup=shQuote start=+"+ skip=+\\\\\|\\.+ end=+"+ contains=@shDblQuoteList,shStringSpecial skipwhite skipnl nextgroup=shCaseBar contained
Bram Moolenaar071d4272004-06-13 20:20:40 +0000378syn region shCaseCommandSub start=+`+ skip=+\\\\\|\\.+ end=+`+ contains=@shCommandSubList skipwhite skipnl nextgroup=shCaseBar contained
Aliaksei Budavei48fa3192024-12-30 10:23:50 +0100379call s:GenerateBracketExpressionItems({'itemGroup': 'shCaseRange', 'bracketGroup': 'shBracketExprDelim', 'extraArgs': 'skip=+\\\\+ contained'})
Bram Moolenaar97d62492012-11-15 21:28:22 +0100380if exists("b:is_bash")
Bram Moolenaar97d62492012-11-15 21:28:22 +0100381 syn match shCharClass '\[:\%(alnum\|alpha\|ascii\|blank\|cntrl\|digit\|graph\|lower\|print\|punct\|space\|upper\|word\|or\|xdigit\):\]' contained
Bram Moolenaar97d62492012-11-15 21:28:22 +0100382endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000383" Misc: {{{1
384"======
Bram Moolenaar071d4272004-06-13 20:20:40 +0000385syn match shWrapLineOperator "\\$"
Bram Moolenaar93a1df22018-09-10 11:51:50 +0200386syn region shCommandSubBQ start="`" skip="\\\\\|\\." end="`" contains=shBQComment,@shCommandSubList
Bram Moolenaar1d9215b2020-01-25 13:27:42 +0100387"COMBAK: see ksh13:50
Bram Moolenaarb730f0c2018-11-25 03:56:26 +0100388"syn match shEscape contained '\%(^\)\@!\%(\\\\\)*\\.' nextgroup=shSingleQuote,shDoubleQuote,shComment
Bram Moolenaar1d9215b2020-01-25 13:27:42 +0100389"COMBAK: see sh11:27
Bram Moolenaarb730f0c2018-11-25 03:56:26 +0100390syn match shEscape contained '\%(^\)\@!\%(\\\\\)*\\.' nextgroup=shComment
Bram Moolenaar1d9215b2020-01-25 13:27:42 +0100391"COMBAK: see ksh13:53
392"syn match shEscape contained '\%(^\)\@!\%(\\\\\)*\\.'
Bram Moolenaar071d4272004-06-13 20:20:40 +0000393
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000394" $() and $(()): {{{1
Bram Moolenaar071d4272004-06-13 20:20:40 +0000395" $(..) is not supported by sh (Bourne shell). However, apparently
396" some systems (HP?) have as their /bin/sh a (link to) Korn shell
397" (ie. Posix compliant shell). /bin/ksh should work for those
398" systems too, however, so the following syntax will flag $(..) as
399" an Error under /bin/sh. By consensus of vimdev'ers!
Bram Moolenaarb0d45e72017-11-05 18:19:24 +0100400if exists("b:is_kornshell") || exists("b:is_bash") || exists("b:is_posix")
Doug Kearns6099db92025-04-03 21:13:39 +0200401 syn region shCommandSub matchgroup=shCmdSubRegion start="\$((\@!" skip='\\\\\|\\.' end=")" contains=@shCommandSubList
Johnothan Kingadd31ba2024-01-22 11:19:54 -0800402 if exists("b:is_kornshell")
403 syn region shSubshare matchgroup=shCmdSubRegion start="\${\ze[ \t\n<]" skip='\\\\\|\\.' end="\zs[ \t\n;]}" contains=@shCommandSubList
404 syn region shValsub matchgroup=shCmdSubRegion start="\${|" skip='\\\\\|\\.' end="}" contains=@shCommandSubList
405 endif
Bram Moolenaarc236c162008-07-13 17:41:49 +0000406 syn region shArithmetic matchgroup=shArithRegion start="\$((" skip='\\\\\|\\.' end="))" contains=@shArithList
Bram Moolenaar61d35bd2012-03-28 20:51:51 +0200407 syn region shArithmetic matchgroup=shArithRegion start="\$\[" skip='\\\\\|\\.' end="\]" contains=@shArithList
Bram Moolenaar071d4272004-06-13 20:20:40 +0000408 syn match shSkipInitWS contained "^\s\+"
Bram Moolenaar6ba83ba2022-06-12 22:15:57 +0100409 syn region shArithParen matchgroup=shArithRegion contained start="(" end=")" contains=@shArithParenList
Bram Moolenaar6be7f872012-01-20 21:08:56 +0100410elseif !exists("g:sh_no_error")
Bram Moolenaardf177f62005-02-22 08:39:57 +0000411 syn region shCommandSub matchgroup=Error start="\$(" end=")" contains=@shCommandSubList
Bram Moolenaar071d4272004-06-13 20:20:40 +0000412endif
dkearns1bdc9432024-03-05 05:14:08 +1100413syn region shCmdParenRegion matchgroup=shCmdSubRegion start="((\@!" skip='\\\\\|\\.' end=")" contains=@shCommandSubList
Bram Moolenaar071d4272004-06-13 20:20:40 +0000414
415if exists("b:is_bash")
416 syn cluster shCommandSubList add=bashSpecialVariables,bashStatement
417 syn cluster shCaseList add=bashAdminStatement,bashStatement
Eisuke Kawashima54cb5142025-01-18 10:11:28 +0100418 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 +0100419 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 +0000420 syn keyword bashAdminStatement daemon killall killproc nice reload restart start status stop
Bram Moolenaar97d62492012-11-15 21:28:22 +0100421 syn keyword bashStatement command compgen
Bram Moolenaar071d4272004-06-13 20:20:40 +0000422endif
423
Bram Moolenaar51ad4ea2018-04-06 11:14:11 +0200424if exists("b:is_kornshell") || exists("b:is_posix")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000425 syn cluster shCommandSubList add=kshSpecialVariables,kshStatement
426 syn cluster shCaseList add=kshStatement
427 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 +0100428 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 +0100429 syn keyword kshStatement command setgroups setsenv
Bram Moolenaar071d4272004-06-13 20:20:40 +0000430endif
431
432syn match shSource "^\.\s"
433syn match shSource "\s\.\s"
Bram Moolenaar5c736222010-01-06 20:54:52 +0100434"syn region shColon start="^\s*:" end="$" end="\s#"me=e-2 contains=@shColonList
Bram Moolenaar6be7f872012-01-20 21:08:56 +0100435"syn region shColon start="^\s*\zs:" end="$" end="\s#"me=e-2
Bram Moolenaar51ad4ea2018-04-06 11:14:11 +0200436if exists("b:is_kornshell") || exists("b:is_posix")
Bram Moolenaar91c49372016-05-08 09:50:29 +0200437 syn match shColon '^\s*\zs:'
438endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000439
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000440" String And Character Constants: {{{1
441"================================
Bram Moolenaar7db8f6f2016-03-29 23:12:46 +0200442syn match shNumber "\<\d\+\>#\="
Bram Moolenaarbc8801c2016-08-02 21:04:33 +0200443syn match shNumber "\<-\=\.\=\d\+\>#\="
Bram Moolenaar802a0d92016-06-26 16:17:58 +0200444syn match shCtrlSeq "\\\d\d\d\|\\[abcfnrtv0]" contained
Bram Moolenaar6ba83ba2022-06-12 22:15:57 +0100445if exists("b:is_bash") || exists("b:is_kornshell")
Bram Moolenaar802a0d92016-06-26 16:17:58 +0200446 syn match shSpecial "[^\\]\(\\\\\)*\zs\\\o\o\o\|\\x\x\x\|\\c[^"]\|\\[abefnrtv]" contained
447 syn match shSpecial "^\(\\\\\)*\zs\\\o\o\o\|\\x\x\x\|\\c[^"]\|\\[abefnrtv]" contained
Bram Moolenaare4a3bcf2016-08-26 19:52:37 +0200448 syn region shExSingleQuote matchgroup=shQuote start=+\$'+ skip=+\\\\\|\\.+ end=+'+ contains=shStringSpecial,shSpecial nextgroup=shSpecialNxt
449 syn region shExDoubleQuote matchgroup=shQuote start=+\$"+ skip=+\\\\\|\\.\|\\"+ end=+"+ contains=@shDblQuoteList,shStringSpecial,shSpecial nextgroup=shSpecialNxt
Bram Moolenaar6be7f872012-01-20 21:08:56 +0100450elseif !exists("g:sh_no_error")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000451 syn region shExSingleQuote matchGroup=Error start=+\$'+ skip=+\\\\\|\\.+ end=+'+ contains=shStringSpecial
Bram Moolenaare90ee312010-08-05 22:08:47 +0200452 syn region shExDoubleQuote matchGroup=Error start=+\$"+ skip=+\\\\\|\\.+ end=+"+ contains=shStringSpecial
Bram Moolenaardf177f62005-02-22 08:39:57 +0000453endif
Bram Moolenaard2855f52018-07-31 22:23:58 +0200454syn region shSingleQuote matchgroup=shQuote start=+'+ end=+'+ contains=@Spell nextgroup=shSpecialStart,shSpecialSQ
Bram Moolenaard2ea7cf2021-05-30 20:54:13 +0200455syn region shDoubleQuote matchgroup=shQuote start=+\%(\%(\\\\\)*\\\)\@<!"+ skip=+\\.+ end=+"+ contains=@shDblQuoteList,shStringSpecial,@Spell nextgroup=shSpecialStart
Bram Moolenaar802a0d92016-06-26 16:17:58 +0200456syn match shStringSpecial "[^[:print:] \t]" contained
Bram Moolenaard2ea7cf2021-05-30 20:54:13 +0200457syn match shStringSpecial "[^\\]\zs\%(\\\\\)*\(\\[\\"'`$()#]\)\+" nextgroup=shComment
458syn match shSpecialSQ "[^\\]\zs\%(\\\\\)*\(\\[\\"'`$()#]\)\+" contained nextgroup=shBkslshSnglQuote,@shNoZSList
459syn match shSpecialDQ "[^\\]\zs\%(\\\\\)*\(\\[\\"'`$()#]\)\+" contained nextgroup=shBkslshDblQuote,@shNoZSList
Bram Moolenaar51ad4ea2018-04-06 11:14:11 +0200460syn match shSpecialStart "\%(\\\\\)*\\[\\"'`$()#]" contained nextgroup=shBkslshSnglQuote,shBkslshDblQuote,@shNoZSList
Bram Moolenaar60cce2f2015-10-13 23:21:27 +0200461syn match shSpecial "^\%(\\\\\)*\\[\\"'`$()#]"
Bram Moolenaarb0d45e72017-11-05 18:19:24 +0100462syn match shSpecialNoZS contained "\%(\\\\\)*\\[\\"'`$()#]"
Bram Moolenaare4a3bcf2016-08-26 19:52:37 +0200463syn match shSpecialNxt contained "\\[\\"'`$()#]"
Bram Moolenaar47e13952020-05-12 22:49:12 +0200464"syn region shBkslshSnglQuote contained matchgroup=shQuote start=+'+ end=+'+ contains=@Spell nextgroup=shSpecialStart
465"syn region shBkslshDblQuote contained matchgroup=shQuote start=+"+ skip=+\\"+ end=+"+ contains=@shDblQuoteList,shStringSpecial,@Spell nextgroup=shSpecialStart
Bram Moolenaar071d4272004-06-13 20:20:40 +0000466
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000467" Comments: {{{1
468"==========
Bram Moolenaar5c736222010-01-06 20:54:52 +0100469syn cluster shCommentGroup contains=shTodo,@Spell
Bram Moolenaar6d5ad4c2016-10-27 17:00:16 +0200470if exists("b:is_bash")
471 syn match shTodo contained "\<\%(COMBAK\|FIXME\|TODO\|XXX\)\ze:\=\>"
472else
473 syn keyword shTodo contained COMBAK FIXME TODO XXX
474endif
Bram Moolenaar5c736222010-01-06 20:54:52 +0100475syn match shComment "^\s*\zs#.*$" contains=@shCommentGroup
476syn match shComment "\s\zs#.*$" contains=@shCommentGroup
Bram Moolenaar97d62492012-11-15 21:28:22 +0100477syn match shComment contained "#.*$" contains=@shCommentGroup
Bram Moolenaar113cb512021-11-07 20:27:04 +0000478syn match shQuickComment contained "#.*$" contains=@shCommentGroup
Bram Moolenaar93a1df22018-09-10 11:51:50 +0200479syn match shBQComment contained "#.\{-}\ze`" contains=@shCommentGroup
Bram Moolenaar071d4272004-06-13 20:20:40 +0000480
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000481" Here Documents: {{{1
Bram Moolenaard2ea7cf2021-05-30 20:54:13 +0200482" (modified by Felipe Contreras)
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000483" =========================================
Bram Moolenaar86b48162022-12-06 18:20:10 +0000484ShFoldHereDoc syn region shHereDoc matchgroup=shHereDoc01 start="<<\s*\z([^ \t|>]\+\)" matchgroup=shHereDoc01 end="^\z1$" contains=@shDblQuoteList
Bram Moolenaar71badf92023-04-22 22:40:14 +0100485ShFoldHereDoc syn region shHereDoc matchgroup=shHereDoc02 start="<<-\s*\z([^ \t|>]\+\)" matchgroup=shHereDoc02 end="^\t*\z1$" contains=@shDblQuoteList
Bram Moolenaar86b48162022-12-06 18:20:10 +0000486ShFoldHereDoc syn region shHereDoc matchgroup=shHereDoc03 start="<<\s*\\\z([^ \t|>]\+\)" matchgroup=shHereDoc03 end="^\z1$"
Bram Moolenaar71badf92023-04-22 22:40:14 +0100487ShFoldHereDoc syn region shHereDoc matchgroup=shHereDoc04 start="<<-\s*\\\z([^ \t|>]\+\)" matchgroup=shHereDoc04 end="^\t*\z1$"
Bram Moolenaar86b48162022-12-06 18:20:10 +0000488ShFoldHereDoc syn region shHereDoc matchgroup=shHereDoc05 start="<<\s*'\z([^']\+\)'" matchgroup=shHereDoc05 end="^\z1$"
Bram Moolenaar71badf92023-04-22 22:40:14 +0100489ShFoldHereDoc syn region shHereDoc matchgroup=shHereDoc06 start="<<-\s*'\z([^']\+\)'" matchgroup=shHereDoc06 end="^\t*\z1$"
Bram Moolenaar86b48162022-12-06 18:20:10 +0000490ShFoldHereDoc syn region shHereDoc matchgroup=shHereDoc07 start="<<\s*\"\z([^"]\+\)\"" matchgroup=shHereDoc07 end="^\z1$"
Bram Moolenaar71badf92023-04-22 22:40:14 +0100491ShFoldHereDoc syn region shHereDoc matchgroup=shHereDoc08 start="<<-\s*\"\z([^"]\+\)\"" matchgroup=shHereDoc08 end="^\t*\z1$"
Bram Moolenaar86b48162022-12-06 18:20:10 +0000492ShFoldHereDoc syn region shHereDoc matchgroup=shHereDoc09 start="<<\s*\\\_$\_s*\z([^ \t|>]\+\)" matchgroup=shHereDoc09 end="^\z1$" contains=@shDblQuoteList
Bram Moolenaar71badf92023-04-22 22:40:14 +0100493ShFoldHereDoc syn region shHereDoc matchgroup=shHereDoc10 start="<<-\s*\\\_$\_s*\z([^ \t|>]\+\)" matchgroup=shHereDoc10 end="^\t*\z1$" contains=@shDblQuoteList
Bram Moolenaar86b48162022-12-06 18:20:10 +0000494ShFoldHereDoc syn region shHereDoc matchgroup=shHereDoc11 start="<<\s*\\\_$\_s*\\\z([^ \t|>]\+\)" matchgroup=shHereDoc11 end="^\z1$"
Bram Moolenaar71badf92023-04-22 22:40:14 +0100495ShFoldHereDoc syn region shHereDoc matchgroup=shHereDoc12 start="<<-\s*\\\_$\_s*\\\z([^ \t|>]\+\)" matchgroup=shHereDoc12 end="^\t*\z1$"
Bram Moolenaar86b48162022-12-06 18:20:10 +0000496ShFoldHereDoc syn region shHereDoc matchgroup=shHereDoc13 start="<<\s*\\\_$\_s*'\z([^']\+\)'" matchgroup=shHereDoc13 end="^\z1$"
Bram Moolenaar71badf92023-04-22 22:40:14 +0100497ShFoldHereDoc syn region shHereDoc matchgroup=shHereDoc14 start="<<-\s*\\\_$\_s*'\z([^']\+\)'" matchgroup=shHereDoc14 end="^\t*\z1$"
Bram Moolenaar86b48162022-12-06 18:20:10 +0000498ShFoldHereDoc syn region shHereDoc matchgroup=shHereDoc15 start="<<\s*\\\_$\_s*\"\z([^"]\+\)\"" matchgroup=shHereDoc15 end="^\z1$"
Bram Moolenaar71badf92023-04-22 22:40:14 +0100499ShFoldHereDoc syn region shHereDoc matchgroup=shHereDoc16 start="<<-\s*\\\_$\_s*\"\z([^"]\+\)\"" matchgroup=shHereDoc16 end="^\t*\z1$"
Bram Moolenaar23515b42020-11-29 14:36:24 +0100500
Bram Moolenaar071d4272004-06-13 20:20:40 +0000501
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000502" Here Strings: {{{1
503" =============
Bram Moolenaar6d5ad4c2016-10-27 17:00:16 +0200504" available for: bash; ksh (really should be ksh93 only) but not if its a posix
Bram Moolenaar690afe12017-01-28 18:34:47 +0100505if exists("b:is_bash") || (exists("b:is_kornshell") && !exists("b:is_posix"))
Bram Moolenaare4a3bcf2016-08-26 19:52:37 +0200506 syn match shHereString "<<<" skipwhite nextgroup=shCmdParenRegion
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000507endif
508
509" Identifiers: {{{1
510"=============
Bram Moolenaarc236c162008-07-13 17:41:49 +0000511syn match shSetOption "\s\zs[-+][a-zA-Z0-9]\+\>" contained
Bram Moolenaar23515b42020-11-29 14:36:24 +0100512syn match shVariable "\<\h\w*\ze=" nextgroup=shVarAssign
Aliaksei Budavei48fa3192024-12-30 10:23:50 +0100513if exists("b:is_bash")
514 " The subscript form for array values, e.g. "foo=([2]=10 [4]=100)".
Doug Kearns87947a92025-05-06 17:59:25 +0200515 syn region shArrayValue contained start="\[\%(..\{-}\]=\)\@=" end="\]=\@=" contains=@shArrayValueList nextgroup=shVarAssign
Aliaksei Budavei48fa3192024-12-30 10:23:50 +0100516 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 +0200517 syn region shArrayRegion contained matchgroup=shShellVariables start="(" skip='\\\\\|\\.' end=")" contains=@shArrayValueList,shArrayValue,shComment
518elseif exists("b:is_kornshell")
519 " The subscript form for array values, e.g. "foo=([2]=10 [4]=100)".
520 syn region shArrayValue contained start="\[\%(..\{-}\]=\)\@=" end="\]=\@=" contains=@shArrayValueList nextgroup=shVarAssign
521 syn cluster shArrayValueList contains=shArithmetic,shArithParen,shCommandSub,shDeref,shDerefSimple,shExpr,shNumber,shExSingleQuote,shExDoubleQuote,shSingleQuote,shDoubleQuote,shSpecial,shParen,kshSpecialVariables,shParenError
522 syn region shArrayRegion contained matchgroup=shShellVariables start="(" skip='\\\\\|\\.' end=")" contains=@shArrayValueList,shArrayValue,shComment,shArrayRegion
Aliaksei Budavei48fa3192024-12-30 10:23:50 +0100523endif
524if exists("b:is_bash") || exists("b:is_kornshell")
525 syn match shVariable "\<\h\w*\%(\[..\{-}\]\)\=\ze\%([|^&*/%+-]\|[<^]<\|[>^]>\)\==" contains=shDerefVarArray nextgroup=shVarAssign
526 syn match shVarAssign contained "\%([|^&*/%+-]\|[<^]<\|[>^]>\)\==" nextgroup=shArrayRegion,shPattern,shDeref,shDerefSimple,shDoubleQuote,shExDoubleQuote,shSingleQuote,shExSingleQuote,shVar
Aliaksei Budavei48fa3192024-12-30 10:23:50 +0100527else
528 syn match shVarAssign contained "=" nextgroup=shPattern,shDeref,shDerefSimple,shDoubleQuote,shExDoubleQuote,shSingleQuote,shExSingleQuote,shVar
529endif
Bram Moolenaarb730f0c2018-11-25 03:56:26 +0100530syn match shVar contained "\h\w*"
Bram Moolenaarbc488a72013-07-05 21:01:22 +0200531syn region shAtExpr contained start="@(" end=")" contains=@shIdList
Bram Moolenaar071d4272004-06-13 20:20:40 +0000532if exists("b:is_bash")
Bram Moolenaarb730f0c2018-11-25 03:56:26 +0100533 syn match shSet "^\s*set\ze\s\+$"
Bram Moolenaar6ba83ba2022-06-12 22:15:57 +0100534 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 +0100535 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 +0200536elseif exists("b:is_kornshell") || exists("b:is_posix")
Bram Moolenaarb730f0c2018-11-25 03:56:26 +0100537 syn match shSet "^\s*set\ze\s\+$"
Bram Moolenaard58a3bf2020-09-28 21:48:16 +0200538 if exists("b:is_dash")
Bram Moolenaar6ba83ba2022-06-12 22:15:57 +0100539 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 +0200540 endif
Bram Moolenaar6ba83ba2022-06-12 22:15:57 +0100541 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 +0100542 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 +0000543else
Bram Moolenaarb730f0c2018-11-25 03:56:26 +0100544 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 +0000545endif
546
Bram Moolenaar6ba83ba2022-06-12 22:15:57 +0100547" KornShell namespace: {{{1
548if exists("b:is_kornshell")
549 syn keyword shFunctionKey namespace skipwhite skipnl nextgroup=shFunctionTwo
550endif
551
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000552" Functions: {{{1
Bram Moolenaar690afe12017-01-28 18:34:47 +0100553if !exists("b:is_posix")
Bram Moolenaarc236c162008-07-13 17:41:49 +0000554 syn keyword shFunctionKey function skipwhite skipnl nextgroup=shFunctionTwo
555endif
556
557if exists("b:is_bash")
Eisuke Kawashima54cb5142025-01-18 10:11:28 +0100558 syn keyword shFunctionKey coproc
Bram Moolenaar91c49372016-05-08 09:50:29 +0200559 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
560 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
561 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
562 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 +0000563else
Bram Moolenaar91c49372016-05-08 09:50:29 +0200564 ShFoldFunctions syn region shFunctionOne matchgroup=shFunction start="^\s*\h\w*\s*()\_s*{" end="}" contains=@shFunctionList skipwhite skipnl nextgroup=shFunctionStart,shQuickComment
565 ShFoldFunctions syn region shFunctionTwo matchgroup=shFunction start="\%(do\)\@!\&\<\h\w*\>\s*\%(()\)\=\_s*{" end="}" contains=shFunctionKey,@shFunctionList contained skipwhite skipnl nextgroup=shFunctionStart,shQuickComment
566 ShFoldFunctions syn region shFunctionThree matchgroup=shFunction start="^\s*\h\w*\s*()\_s*(" end=")" contains=@shFunctionList skipwhite skipnl nextgroup=shFunctionStart,shQuickComment
567 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 +0000568endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000569
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000570" Parameter Dereferencing: {{{1
571" ========================
Bram Moolenaarbe4e0162023-02-02 13:59:48 +0000572" Note: sh04 failure with following line
573"if !exists("g:sh_no_error") && !(exists("b:is_bash") || exists("b:is_kornshell") || exists("b:is_posix"))
574if !exists("g:sh_no_error")
Bram Moolenaar91c49372016-05-08 09:50:29 +0200575 syn match shDerefWordError "[^}$[~]" contained
Bram Moolenaar6be7f872012-01-20 21:08:56 +0100576endif
Bram Moolenaarb0d45e72017-11-05 18:19:24 +0100577syn match shDerefSimple "\$\%(\h\w*\|\d\)" nextgroup=@shNoZSList
Johnothan Kingadd31ba2024-01-22 11:19:54 -0800578if exists("b:is_kornshell")
579 syn region shDeref matchgroup=PreProc start="\${\ze[^ \t\n<|]" end="}" contains=@shDerefList,shDerefVarArray nextgroup=shSpecialStart
580else
581 syn region shDeref matchgroup=PreProc start="\${" end="}" contains=@shDerefList,shDerefVarArray nextgroup=shSpecialStart
582endif
Bram Moolenaarb0d45e72017-11-05 18:19:24 +0100583syn match shDerefSimple "\$[-#*@!?]" nextgroup=@shNoZSList
584syn match shDerefSimple "\$\$" nextgroup=@shNoZSList
Bram Moolenaar47e13952020-05-12 22:49:12 +0200585syn match shDerefSimple "\${\d}" nextgroup=@shNoZSList nextgroup=shSpecialStart
Bram Moolenaar51ad4ea2018-04-06 11:14:11 +0200586if exists("b:is_bash") || exists("b:is_kornshell") || exists("b:is_posix")
Bram Moolenaar47e13952020-05-12 22:49:12 +0200587 syn region shDeref matchgroup=PreProc start="\${##\=" end="}" contains=@shDerefList nextgroup=@shSpecialNoZS,shSpecialStart
588 syn region shDeref matchgroup=PreProc start="\${\$\$" end="}" contains=@shDerefList nextgroup=@shSpecialNoZS,shSpecialStart
Bram Moolenaar071d4272004-06-13 20:20:40 +0000589endif
590
Bram Moolenaar6ba83ba2022-06-12 22:15:57 +0100591" ksh: ${.sh.*} variables: {{{1
592" ========================================
593if exists("b:is_kornshell")
Bram Moolenaar6ba83ba2022-06-12 22:15:57 +0100594 syn match shDerefVar contained "\.\+" nextgroup=@shDerefVarList
595endif
596
Bram Moolenaarb4ff5182015-11-10 21:15:48 +0100597" ksh: ${!var[*]} array index list syntax: {{{1
598" ========================================
Bram Moolenaar51ad4ea2018-04-06 11:14:11 +0200599if exists("b:is_kornshell") || exists("b:is_posix")
Bram Moolenaarb4ff5182015-11-10 21:15:48 +0100600 syn region shDeref matchgroup=PreProc start="\${!" end="}" contains=@shDerefVarArray
601endif
602
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000603" bash: ${!prefix*} and ${#parameter}: {{{1
604" ====================================
Bram Moolenaar071d4272004-06-13 20:20:40 +0000605if exists("b:is_bash")
Bram Moolenaard58a3bf2020-09-28 21:48:16 +0200606 syn region shDeref matchgroup=PreProc start="\${!" end="\*\=}" contains=@shDerefList,shDerefOffset
Bram Moolenaarbc8801c2016-08-02 21:04:33 +0200607 syn match shDerefVar contained "{\@<=!\h\w*" nextgroup=@shDerefVarList
Bram Moolenaar071d4272004-06-13 20:20:40 +0000608endif
Bram Moolenaarb4ff5182015-11-10 21:15:48 +0100609if exists("b:is_kornshell")
Bram Moolenaarbc8801c2016-08-02 21:04:33 +0200610 syn match shDerefVar contained "{\@<=!\h\w*[[:alnum:]_.]*" nextgroup=@shDerefVarList
Bram Moolenaarb4ff5182015-11-10 21:15:48 +0100611endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000612
Bram Moolenaard58a3bf2020-09-28 21:48:16 +0200613syn match shDerefSpecial contained "{\@<=[-*@?0]" nextgroup=shDerefOp,shDerefOffset,shDerefOpError
Bram Moolenaar071d4272004-06-13 20:20:40 +0000614syn match shDerefSpecial contained "\({[#!]\)\@<=[[:alnum:]*@_]\+" nextgroup=@shDerefVarList,shDerefOp
Bram Moolenaarbc8801c2016-08-02 21:04:33 +0200615syn match shDerefVar contained "{\@<=\h\w*" nextgroup=@shDerefVarList
Bram Moolenaare4a3bcf2016-08-26 19:52:37 +0200616syn match shDerefVar contained '\d' nextgroup=@shDerefVarList
Bram Moolenaar51ad4ea2018-04-06 11:14:11 +0200617if exists("b:is_kornshell") || exists("b:is_posix")
Bram Moolenaarbc8801c2016-08-02 21:04:33 +0200618 syn match shDerefVar contained "{\@<=\h\w*[[:alnum:]_.]*" nextgroup=@shDerefVarList
Bram Moolenaarb4ff5182015-11-10 21:15:48 +0100619endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000620
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000621" sh ksh bash : ${var[... ]...} array reference: {{{1
Lucien Grondince3b0132023-11-04 09:41:37 +0100622syn region shDerefVarArray contained matchgroup=shDeref start="\[" end="]" contains=@shCommandSubList nextgroup=shDerefOp,shDerefOpError,shDerefOffset
Bram Moolenaar071d4272004-06-13 20:20:40 +0000623
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000624" Special ${parameter OPERATOR word} handling: {{{1
Bram Moolenaare2719092015-01-10 15:09:25 +0100625" sh ksh bash : ${parameter:-word} word is default value
626" sh ksh bash : ${parameter:=word} assign word as default value
627" sh ksh bash : ${parameter:?word} display word if parameter is null
628" sh ksh bash : ${parameter:+word} use word if parameter is not null, otherwise nothing
629" ksh bash : ${parameter#pattern} remove small left pattern
630" ksh bash : ${parameter##pattern} remove large left pattern
631" ksh bash : ${parameter%pattern} remove small right pattern
632" ksh bash : ${parameter%%pattern} remove large right pattern
633" bash : ${parameter^pattern} Case modification
634" bash : ${parameter^^pattern} Case modification
635" bash : ${parameter,pattern} Case modification
636" bash : ${parameter,,pattern} Case modification
Bram Moolenaard58a3bf2020-09-28 21:48:16 +0200637" bash : ${@:start:qty} display command line arguments from start to start+qty-1 (inferred)
Bram Moolenaardd60c362023-02-27 15:49:53 +0000638" bash : ${parameter@operator} transforms parameter (operator∈[uULqEPARa])
Bram Moolenaar071d4272004-06-13 20:20:40 +0000639syn cluster shDerefPatternList contains=shDerefPattern,shDerefString
Bram Moolenaar6be7f872012-01-20 21:08:56 +0100640if !exists("g:sh_no_error")
641 syn match shDerefOpError contained ":[[:punct:]]"
642endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000643syn match shDerefOp contained ":\=[-=?]" nextgroup=@shDerefPatternList
644syn match shDerefOp contained ":\=+" nextgroup=@shDerefPatternList
Bram Moolenaar51ad4ea2018-04-06 11:14:11 +0200645if exists("b:is_bash") || exists("b:is_kornshell") || exists("b:is_posix")
Bram Moolenaare4a3bcf2016-08-26 19:52:37 +0200646 syn match shDerefOp contained "#\{1,2}" nextgroup=@shDerefPatternList
647 syn match shDerefOp contained "%\{1,2}" nextgroup=@shDerefPatternList
Aliaksei Budavei48fa3192024-12-30 10:23:50 +0100648 syn match shDerefPattern contained "[^{}]\+" contains=shDeref,shDerefSimple,shDerefPattern,shDerefString,shCommandSub,shDerefEscape nextgroup=shDerefPattern skipnl
Bram Moolenaar071d4272004-06-13 20:20:40 +0000649 syn region shDerefPattern contained start="{" end="}" contains=shDeref,shDerefSimple,shDerefString,shCommandSub nextgroup=shDerefPattern
Aliaksei Budavei48fa3192024-12-30 10:23:50 +0100650 " Match parametric bracket expressions with a leading whitespace character.
651 syn region shDerefPattern contained matchgroup=shBracketExprDelim start="\[" end="\]" contains=@shBracketExprList,shDoubleQuote nextgroup=shDerefPattern
652 call s:GenerateBracketExpressionItems({'itemGroup': 'shDerefPattern', 'bracketGroup': 'shBracketExprDelim', 'extraArgs': 'contained nextgroup=shDerefPattern'})
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +0000653 syn match shDerefEscape contained '\%(\\\\\)*\\.'
Bram Moolenaar071d4272004-06-13 20:20:40 +0000654endif
Bram Moolenaard960d762011-09-21 19:22:10 +0200655if exists("b:is_bash")
656 syn match shDerefOp contained "[,^]\{1,2}" nextgroup=@shDerefPatternList
Bram Moolenaardd60c362023-02-27 15:49:53 +0000657 syn match shDerefOp contained "@[uULQEPAKa]"
Bram Moolenaard960d762011-09-21 19:22:10 +0200658endif
Doug Kearnsfe228672025-05-05 20:10:11 +0200659syn region shDerefString contained matchgroup=shDerefDelim start=+\%(\\\)\@<!'+ end=+'+
Bram Moolenaar4b22cdb2010-08-02 22:12:46 +0200660syn region shDerefString contained matchgroup=shDerefDelim start=+\%(\\\)\@<!"+ skip=+\\"+ end=+"+ contains=@shDblQuoteList,shStringSpecial
Bram Moolenaarc236c162008-07-13 17:41:49 +0000661syn match shDerefString contained "\\["']" nextgroup=shDerefPattern
Bram Moolenaar071d4272004-06-13 20:20:40 +0000662
Bram Moolenaard58a3bf2020-09-28 21:48:16 +0200663if exists("b:is_bash") || exists("b:is_kornshell") || exists("b:is_posix")
664 " bash ksh posix : ${parameter:offset}
665 " bash ksh posix : ${parameter:offset:length}
666 syn region shDerefOffset contained start=':[^-=?+]' end='\ze:' end='\ze}' contains=shDeref,shDerefSimple,shDerefEscape nextgroup=shDerefLen,shDeref,shDerefSimple
667 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 +0200668 syn match shDerefLen contained ":[^}]\+" contains=shDeref,shDerefSimple,shArithmetic
Bram Moolenaard58a3bf2020-09-28 21:48:16 +0200669endif
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +0000670
Bram Moolenaard58a3bf2020-09-28 21:48:16 +0200671if exists("b:is_bash")
Aliaksei Budavei48fa3192024-12-30 10:23:50 +0100672 " bash : ${parameter/pattern/string}
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +0000673 " bash : ${parameter//pattern/string}
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +0000674 syn match shDerefPPS contained '/\{1,2}' nextgroup=shDerefPPSleft
Bram Moolenaard58a3bf2020-09-28 21:48:16 +0200675 syn region shDerefPPSleft contained start='.' skip=@\%(\\\\\)*\\/@ matchgroup=shDerefOp end='/' end='\ze}' end='"' nextgroup=shDerefPPSright contains=@shPPSLeftList
Bram Moolenaarb730f0c2018-11-25 03:56:26 +0100676 syn region shDerefPPSright contained start='.' skip=@\%(\\\\\)\+@ end='\ze}' contains=@shPPSRightList
Bram Moolenaaracb4f222016-01-10 15:59:26 +0100677
Aliaksei Budavei48fa3192024-12-30 10:23:50 +0100678 " bash : ${parameter/#pattern/string}
679 " bash : ${parameter/%pattern/string}
680 syn match shDerefPSR contained '/[#%]' nextgroup=shDerefPSRleft,shDoubleQuote,shSingleQuote
681 syn region shDerefPSRleft contained start='[^"']' skip=@\%(\\\\\)*\\/@ matchgroup=shDerefOp end='/' end='\ze}' nextgroup=shDerefPSRright contains=shBracketExpr
Bram Moolenaaracb4f222016-01-10 15:59:26 +0100682 syn region shDerefPSRright contained start='.' skip=@\%(\\\\\)\+@ end='\ze}'
Bram Moolenaar071d4272004-06-13 20:20:40 +0000683endif
684
Bram Moolenaarc236c162008-07-13 17:41:49 +0000685" Arithmetic Parenthesized Expressions: {{{1
Bram Moolenaarbc488a72013-07-05 21:01:22 +0200686"syn region shParen matchgroup=shArithRegion start='[^$]\zs(\%(\ze[^(]\|$\)' end=')' contains=@shArithParenList
687syn region shParen matchgroup=shArithRegion start='\$\@!(\%(\ze[^(]\|$\)' end=')' contains=@shArithParenList
Bram Moolenaarc236c162008-07-13 17:41:49 +0000688
Bram Moolenaar93a1df22018-09-10 11:51:50 +0200689" Additional sh Keywords: {{{1
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000690" ===================
Bram Moolenaar071d4272004-06-13 20:20:40 +0000691syn keyword shStatement break cd chdir continue eval exec exit kill newgrp pwd read readonly return shift test trap ulimit umask wait
692syn keyword shConditional contained elif else then
Bram Moolenaar6be7f872012-01-20 21:08:56 +0100693if !exists("g:sh_no_error")
694 syn keyword shCondError elif else then
695endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000696
Bram Moolenaar93a1df22018-09-10 11:51:50 +0200697" Additional ksh Keywords and Aliases: {{{1
698" ===================================
Bram Moolenaarb730f0c2018-11-25 03:56:26 +0100699if exists("b:is_kornshell") || exists("b:is_posix")
700 syn keyword shStatement bg builtin disown enum export false fg getconf getopts hist jobs let printf sleep true unalias whence
701 syn keyword shStatement typeset skipwhite nextgroup=shSetOption
Bram Moolenaar93a1df22018-09-10 11:51:50 +0200702 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 +0100703 if exists("b:is_posix")
Bram Moolenaarc236c162008-07-13 17:41:49 +0000704 syn keyword shStatement command
705 else
706 syn keyword shStatement time
707 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000708
Bram Moolenaar93a1df22018-09-10 11:51:50 +0200709" Additional bash Keywords: {{{1
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000710" =====================
Bram Moolenaarb730f0c2018-11-25 03:56:26 +0100711elseif exists("b:is_bash")
Eisuke Kawashima54cb5142025-01-18 10:11:28 +0100712 syn keyword shStatement bg builtin disown export false fg getopts jobs let printf true unalias
Bram Moolenaarb730f0c2018-11-25 03:56:26 +0100713 syn keyword shStatement typeset nextgroup=shSetOption
714 syn keyword shStatement fc hash history source suspend times type
Eisuke Kawashima54cb5142025-01-18 10:11:28 +0100715 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 +0100716else
717 syn keyword shStatement login newgrp
Bram Moolenaar071d4272004-06-13 20:20:40 +0000718endif
719
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000720" Synchronization: {{{1
721" ================
Bram Moolenaar03413f42016-04-12 21:07:15 +0200722if !exists("g:sh_minlines")
723 let s:sh_minlines = 200
724else
725 let s:sh_minlines= g:sh_minlines
Bram Moolenaar071d4272004-06-13 20:20:40 +0000726endif
Bram Moolenaar03413f42016-04-12 21:07:15 +0200727if !exists("g:sh_maxlines")
728 let s:sh_maxlines = 2*s:sh_minlines
729 if s:sh_maxlines < 25
730 let s:sh_maxlines= 25
731 endif
732else
733 let s:sh_maxlines= g:sh_maxlines
Bram Moolenaar071d4272004-06-13 20:20:40 +0000734endif
Bram Moolenaar03413f42016-04-12 21:07:15 +0200735exec "syn sync minlines=" . s:sh_minlines . " maxlines=" . s:sh_maxlines
Bram Moolenaar071d4272004-06-13 20:20:40 +0000736syn sync match shCaseEsacSync grouphere shCaseEsac "\<case\>"
737syn sync match shCaseEsacSync groupthere shCaseEsac "\<esac\>"
738syn sync match shDoSync grouphere shDo "\<do\>"
739syn sync match shDoSync groupthere shDo "\<done\>"
740syn sync match shForSync grouphere shFor "\<for\>"
741syn sync match shForSync groupthere shFor "\<in\>"
742syn sync match shIfSync grouphere shIf "\<if\>"
743syn sync match shIfSync groupthere shIf "\<fi\>"
744syn sync match shUntilSync grouphere shRepeat "\<until\>"
745syn sync match shWhileSync grouphere shRepeat "\<while\>"
746
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000747" Default Highlighting: {{{1
748" =====================
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200749if !exists("skip_sh_syntax_inits")
750 hi def link shArithRegion shShellVariables
Aliaksei Budavei48fa3192024-12-30 10:23:50 +0100751 hi def link shArrayValue shDeref
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200752 hi def link shAstQuote shDoubleQuote
753 hi def link shAtExpr shSetList
Bram Moolenaard2855f52018-07-31 22:23:58 +0200754 hi def link shBkslshSnglQuote shSingleQuote
755 hi def link shBkslshDblQuote shDOubleQuote
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200756 hi def link shBeginHere shRedir
757 hi def link shCaseBar shConditional
758 hi def link shCaseCommandSub shCommandSub
759 hi def link shCaseDoubleQuote shDoubleQuote
760 hi def link shCaseIn shConditional
761 hi def link shQuote shOperator
762 hi def link shCaseSingleQuote shSingleQuote
763 hi def link shCaseStart shConditional
764 hi def link shCmdSubRegion shShellVariables
765 hi def link shColon shComment
766 hi def link shDerefOp shOperator
767 hi def link shDerefPOL shDerefOp
768 hi def link shDerefPPS shDerefOp
769 hi def link shDerefPSR shDerefOp
770 hi def link shDeref shShellVariables
771 hi def link shDerefDelim shOperator
772 hi def link shDerefSimple shDeref
773 hi def link shDerefSpecial shDeref
774 hi def link shDerefString shDoubleQuote
775 hi def link shDerefVar shDeref
776 hi def link shDoubleQuote shString
777 hi def link shEcho shString
778 hi def link shEchoDelim shOperator
779 hi def link shEchoQuote shString
780 hi def link shForPP shLoop
781 hi def link shFunction Function
782 hi def link shEmbeddedEcho shString
783 hi def link shEscape shCommandSub
784 hi def link shExDoubleQuote shDoubleQuote
785 hi def link shExSingleQuote shSingleQuote
786 hi def link shHereDoc shString
787 hi def link shHereString shRedir
788 hi def link shHerePayload shHereDoc
789 hi def link shLoop shStatement
790 hi def link shSpecialNxt shSpecial
791 hi def link shNoQuote shDoubleQuote
792 hi def link shOption shCommandSub
793 hi def link shPattern shString
794 hi def link shParen shArithmetic
795 hi def link shPosnParm shShellVariables
796 hi def link shQuickComment shComment
Bram Moolenaar93a1df22018-09-10 11:51:50 +0200797 hi def link shBQComment shComment
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200798 hi def link shRange shOperator
799 hi def link shRedir shOperator
800 hi def link shSetListDelim shOperator
801 hi def link shSetOption shOption
802 hi def link shSingleQuote shString
803 hi def link shSource shOperator
804 hi def link shStringSpecial shSpecial
Bram Moolenaar51ad4ea2018-04-06 11:14:11 +0200805 hi def link shSpecialStart shSpecial
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200806 hi def link shSubShRegion shOperator
807 hi def link shTestOpr shConditional
808 hi def link shTestPattern shString
809 hi def link shTestDoubleQuote shString
810 hi def link shTestSingleQuote shString
811 hi def link shTouchCmd shStatement
812 hi def link shVariable shSetList
813 hi def link shWrapLineOperator shOperator
Bram Moolenaar071d4272004-06-13 20:20:40 +0000814
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200815 if exists("b:is_bash")
816 hi def link bashAdminStatement shStatement
817 hi def link bashSpecialVariables shShellVariables
818 hi def link bashStatement shStatement
819 hi def link shCharClass shSpecial
Bram Moolenaard58a3bf2020-09-28 21:48:16 +0200820 hi def link shDerefOffset shDerefOp
821 hi def link shDerefLen shDerefOffset
Bram Moolenaar6be7f872012-01-20 21:08:56 +0100822 endif
Bram Moolenaar51ad4ea2018-04-06 11:14:11 +0200823 if exists("b:is_kornshell") || exists("b:is_posix")
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200824 hi def link kshSpecialVariables shShellVariables
825 hi def link kshStatement shStatement
826 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000827
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200828 if !exists("g:sh_no_error")
829 hi def link shCaseError Error
830 hi def link shCondError Error
831 hi def link shCurlyError Error
832 hi def link shDerefOpError Error
833 hi def link shDerefWordError Error
834 hi def link shDoError Error
835 hi def link shEsacError Error
836 hi def link shIfError Error
837 hi def link shInError Error
838 hi def link shParenError Error
839 hi def link shTestError Error
Bram Moolenaar51ad4ea2018-04-06 11:14:11 +0200840 if exists("b:is_kornshell") || exists("b:is_posix")
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200841 hi def link shDTestError Error
842 endif
843 endif
844
845 hi def link shArithmetic Special
Aliaksei Budavei48fa3192024-12-30 10:23:50 +0100846 hi def link shBracketExprDelim Delimiter
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200847 hi def link shCharClass Identifier
Aliaksei Budavei48fa3192024-12-30 10:23:50 +0100848 hi def link shCollSymb shCharClass
849 hi def link shEqClass shCharClass
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200850 hi def link shSnglCase Statement
851 hi def link shCommandSub Special
Bram Moolenaard2855f52018-07-31 22:23:58 +0200852 hi def link shCommandSubBQ shCommandSub
Johnothan Kingadd31ba2024-01-22 11:19:54 -0800853 hi def link shSubshare shCommandSub
854 hi def link shValsub shCommandSub
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200855 hi def link shComment Comment
856 hi def link shConditional Conditional
857 hi def link shCtrlSeq Special
858 hi def link shExprRegion Delimiter
859 hi def link shFunctionKey Function
860 hi def link shFunctionName Function
861 hi def link shNumber Number
862 hi def link shOperator Operator
863 hi def link shRepeat Repeat
864 hi def link shSet Statement
865 hi def link shSetList Identifier
866 hi def link shShellVariables PreProc
867 hi def link shSpecial Special
Bram Moolenaard2855f52018-07-31 22:23:58 +0200868 hi def link shSpecialDQ Special
869 hi def link shSpecialSQ Special
Bram Moolenaarb0d45e72017-11-05 18:19:24 +0100870 hi def link shSpecialNoZS shSpecial
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200871 hi def link shStatement Statement
872 hi def link shString String
873 hi def link shTodo Todo
874 hi def link shAlias Identifier
875 hi def link shHereDoc01 shRedir
876 hi def link shHereDoc02 shRedir
877 hi def link shHereDoc03 shRedir
878 hi def link shHereDoc04 shRedir
879 hi def link shHereDoc05 shRedir
880 hi def link shHereDoc06 shRedir
881 hi def link shHereDoc07 shRedir
882 hi def link shHereDoc08 shRedir
883 hi def link shHereDoc09 shRedir
884 hi def link shHereDoc10 shRedir
885 hi def link shHereDoc11 shRedir
886 hi def link shHereDoc12 shRedir
887 hi def link shHereDoc13 shRedir
888 hi def link shHereDoc14 shRedir
889 hi def link shHereDoc15 shRedir
Bram Moolenaar23515b42020-11-29 14:36:24 +0100890 hi def link shHereDoc16 shRedir
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200891endif
Bram Moolenaarb4ff5182015-11-10 21:15:48 +0100892
893" Delete shell folding commands {{{1
894" =============================
895delc ShFoldFunctions
896delc ShFoldHereDoc
897delc ShFoldIfDoFor
Bram Moolenaar071d4272004-06-13 20:20:40 +0000898
Aliaksei Budavei48fa3192024-12-30 10:23:50 +0100899" Delete the bracket expression function {{{1
900" ======================================
901delfun s:GenerateBracketExpressionItems
902
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000903" Set Current Syntax: {{{1
904" ===================
Bram Moolenaar071d4272004-06-13 20:20:40 +0000905if exists("b:is_bash")
906 let b:current_syntax = "bash"
907elseif exists("b:is_kornshell")
908 let b:current_syntax = "ksh"
Bram Moolenaar51ad4ea2018-04-06 11:14:11 +0200909elseif exists("b:is_posix")
910 let b:current_syntax = "posix"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000911else
912 let b:current_syntax = "sh"
913endif
914
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000915" vim: ts=16 fdm=marker