blob: 5e0d1fd76a10c4cfe766008804fe9b4ca4a3840b [file] [log] [blame]
Bram Moolenaar071d4272004-06-13 20:20:40 +00001" Vim syntax file
2" Language: shell (sh) Korn shell (ksh) bash (sh)
Bram Moolenaar97d62492012-11-15 21:28:22 +01003" Maintainer: Charles E. Campbell <NdrOchipS@PcampbellAfamily.Mbiz>
Bram Moolenaar071d4272004-06-13 20:20:40 +00004" Previous Maintainer: Lennart Schultz <Lennart.Schultz@ecmwf.int>
Bram Moolenaar93a1df22018-09-10 11:51:50 +02005" Last Change: Sep 04, 2018
6" Version: 182
Bram Moolenaare2719092015-01-10 15:09:25 +01007" URL: http://www.drchip.org/astronaut/vim/index.html#SYNTAX_SH
8" For options and settings, please use: :help ft-sh-syntax
Bram Moolenaarb4ff5182015-11-10 21:15:48 +01009" This file includes many ideas from Eric Brunet (eric.brunet@ens.fr)
Bram Moolenaar071d4272004-06-13 20:20:40 +000010
Bram Moolenaarf37506f2016-08-31 22:22:10 +020011" quit when a syntax file was already loaded {{{1
Bram Moolenaar89bcfda2016-08-30 23:26:57 +020012if exists("b:current_syntax")
Bram Moolenaar071d4272004-06-13 20:20:40 +000013 finish
14endif
15
Bram Moolenaard960d762011-09-21 19:22:10 +020016" trying to answer the question: which shell is /bin/sh, really?
Bram Moolenaar97d62492012-11-15 21:28:22 +010017" If the user has not specified any of g:is_kornshell, g:is_bash, g:is_posix, g:is_sh, then guess.
Bram Moolenaar91c49372016-05-08 09:50:29 +020018if getline(1) =~ '\<ksh$'
19 let b:is_kornshell = 1
20elseif getline(1) =~ '\<bash$'
21 let b:is_bash = 1
22elseif getline(1) =~ '\<dash$'
23 let b:is_posix = 1
24elseif !exists("g:is_kornshell") && !exists("g:is_bash") && !exists("g:is_posix") && !exists("g:is_sh")
Bram Moolenaarbc488a72013-07-05 21:01:22 +020025 let s:shell = ""
Bram Moolenaard960d762011-09-21 19:22:10 +020026 if executable("/bin/sh")
Bram Moolenaarbc488a72013-07-05 21:01:22 +020027 let s:shell = resolve("/bin/sh")
Bram Moolenaard960d762011-09-21 19:22:10 +020028 elseif executable("/usr/bin/sh")
Bram Moolenaarbc488a72013-07-05 21:01:22 +020029 let s:shell = resolve("/usr/bin/sh")
Bram Moolenaard960d762011-09-21 19:22:10 +020030 endif
Bram Moolenaar91c49372016-05-08 09:50:29 +020031 if s:shell =~ 'ksh$'
32 let b:is_kornshell= 1
33 elseif s:shell =~ 'bash$'
34 let b:is_bash = 1
Bram Moolenaarbc488a72013-07-05 21:01:22 +020035 elseif s:shell =~ 'dash$'
Bram Moolenaar91c49372016-05-08 09:50:29 +020036 let b:is_posix = 1
Bram Moolenaarbc488a72013-07-05 21:01:22 +020037 endif
38 unlet s:shell
Bram Moolenaard960d762011-09-21 19:22:10 +020039endif
40
Bram Moolenaard4755bb2004-09-02 19:12:26 +000041" handling /bin/sh with is_kornshell/is_sh {{{1
Bram Moolenaar071d4272004-06-13 20:20:40 +000042" b:is_sh is set when "#! /bin/sh" is found;
43" However, it often is just a masquerade by bash (typically Linux)
44" or kornshell (typically workstations with Posix "sh").
Bram Moolenaard960d762011-09-21 19:22:10 +020045" So, when the user sets "g:is_bash", "g:is_kornshell",
46" or "g:is_posix", a b:is_sh is converted into b:is_bash/b:is_kornshell,
Bram Moolenaar071d4272004-06-13 20:20:40 +000047" respectively.
48if !exists("b:is_kornshell") && !exists("b:is_bash")
Bram Moolenaar7fc904b2006-04-13 20:37:35 +000049 if exists("g:is_posix") && !exists("g:is_kornshell")
50 let g:is_kornshell= g:is_posix
51 endif
52 if exists("g:is_kornshell")
Bram Moolenaar071d4272004-06-13 20:20:40 +000053 let b:is_kornshell= 1
54 if exists("b:is_sh")
55 unlet b:is_sh
56 endif
Bram Moolenaar7fc904b2006-04-13 20:37:35 +000057 elseif exists("g:is_bash")
Bram Moolenaar071d4272004-06-13 20:20:40 +000058 let b:is_bash= 1
59 if exists("b:is_sh")
60 unlet b:is_sh
61 endif
62 else
63 let b:is_sh= 1
64 endif
65endif
66
Bram Moolenaarcd71fa32005-03-11 22:46:48 +000067" set up default g:sh_fold_enabled {{{1
Bram Moolenaarb4ff5182015-11-10 21:15:48 +010068" ================================
Bram Moolenaar071d4272004-06-13 20:20:40 +000069if !exists("g:sh_fold_enabled")
70 let g:sh_fold_enabled= 0
Bram Moolenaar293ee4d2004-12-09 21:34:53 +000071elseif g:sh_fold_enabled != 0 && !has("folding")
72 let g:sh_fold_enabled= 0
Bram Moolenaarcd71fa32005-03-11 22:46:48 +000073 echomsg "Ignoring g:sh_fold_enabled=".g:sh_fold_enabled."; need to re-compile vim for +fold support"
74endif
Bram Moolenaarc236c162008-07-13 17:41:49 +000075if !exists("s:sh_fold_functions")
Bram Moolenaar97d62492012-11-15 21:28:22 +010076 let s:sh_fold_functions= and(g:sh_fold_enabled,1)
Bram Moolenaarc236c162008-07-13 17:41:49 +000077endif
78if !exists("s:sh_fold_heredoc")
Bram Moolenaar97d62492012-11-15 21:28:22 +010079 let s:sh_fold_heredoc = and(g:sh_fold_enabled,2)
Bram Moolenaarc236c162008-07-13 17:41:49 +000080endif
81if !exists("s:sh_fold_ifdofor")
Bram Moolenaar97d62492012-11-15 21:28:22 +010082 let s:sh_fold_ifdofor = and(g:sh_fold_enabled,4)
Bram Moolenaarc236c162008-07-13 17:41:49 +000083endif
Bram Moolenaarcd71fa32005-03-11 22:46:48 +000084if g:sh_fold_enabled && &fdm == "manual"
Bram Moolenaar97d62492012-11-15 21:28:22 +010085 " Given that the user provided g:sh_fold_enabled
86 " AND g:sh_fold_enabled is manual (usual default)
87 " implies a desire for syntax-based folding
88 setl fdm=syntax
Bram Moolenaar071d4272004-06-13 20:20:40 +000089endif
90
Bram Moolenaare0fa3742016-02-20 15:47:01 +010091" set up the syntax-highlighting iskeyword
Bram Moolenaar91c49372016-05-08 09:50:29 +020092if has("patch-7.4.1142")
93 if exists("b:is_bash")
94 exe "syn iskeyword ".&iskeyword.",-,:"
95 else
96 exe "syn iskeyword ".&iskeyword.",-"
97 endif
Bram Moolenaare0fa3742016-02-20 15:47:01 +010098endif
99
Bram Moolenaarb4ff5182015-11-10 21:15:48 +0100100" Set up folding commands for shell {{{1
101" =================================
102if s:sh_fold_functions
103 com! -nargs=* ShFoldFunctions <args> fold
104else
105 com! -nargs=* ShFoldFunctions <args>
106endif
107if s:sh_fold_heredoc
108 com! -nargs=* ShFoldHereDoc <args> fold
109else
110 com! -nargs=* ShFoldHereDoc <args>
111endif
112if s:sh_fold_ifdofor
113 com! -nargs=* ShFoldIfDoFor <args> fold
114else
115 com! -nargs=* ShFoldIfDoFor <args>
116endif
117
Bram Moolenaarcd71fa32005-03-11 22:46:48 +0000118" sh syntax is case sensitive {{{1
Bram Moolenaar071d4272004-06-13 20:20:40 +0000119syn case match
120
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000121" Clusters: contains=@... clusters {{{1
Bram Moolenaar071d4272004-06-13 20:20:40 +0000122"==================================
Bram Moolenaar5c736222010-01-06 20:54:52 +0100123syn cluster shErrorList contains=shDoError,shIfError,shInError,shCaseError,shEsacError,shCurlyError,shParenError,shTestError,shOK
Bram Moolenaar51ad4ea2018-04-06 11:14:11 +0200124if exists("b:is_kornshell") || exists("b:is_bash")
Bram Moolenaarc236c162008-07-13 17:41:49 +0000125 syn cluster ErrorList add=shDTestError
126endif
Bram Moolenaare4a3bcf2016-08-26 19:52:37 +0200127syn cluster shArithParenList contains=shArithmetic,shCaseEsac,shComment,shDeref,shDo,shDerefSimple,shEcho,shEscape,shNumber,shOperator,shPosnParm,shExSingleQuote,shExDoubleQuote,shHereString,shRedir,shSingleQuote,shDoubleQuote,shStatement,shVariable,shAlias,shTest,shCtrlSeq,shSpecial,shParen,bashSpecialVariables,bashStatement,shIf,shFor
Bram Moolenaarc236c162008-07-13 17:41:49 +0000128syn cluster shArithList contains=@shArithParenList,shParenError
Bram Moolenaard2855f52018-07-31 22:23:58 +0200129syn cluster shCaseEsacList contains=shCaseStart,shCaseLabel,shCase,shCaseBar,shCaseIn,shComment,shDeref,shDerefSimple,shCaseCommandSub,shCaseExSingleQuote,shCaseSingleQuote,shCaseDoubleQuote,shCtrlSeq,@shErrorList,shStringSpecial,shCaseRange
130syn cluster shCaseList contains=@shCommandSubList,shCaseEsac,shColon,shCommandSub,shCommandSubBQ,shComment,shDo,shEcho,shExpr,shFor,shForPP,shHereDoc,shIf,shHereString,shRedir,shSetList,shSource,shStatement,shVariable,shCtrlSeq
131syn cluster shCommandSubList contains=shAlias,shArithmetic,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 +0000132syn cluster shCurlyList contains=shNumber,shComma,shDeref,shDerefSimple,shDerefSpecial
Bram Moolenaard2855f52018-07-31 22:23:58 +0200133syn cluster shDblQuoteList contains=shArithmetic,shCommandSub,shCommandSubBQ,shDeref,shDerefSimple,shEscape,shPosnParm,shCtrlSeq,shSpecial,shSpecialDQ
Bram Moolenaaracb4f222016-01-10 15:59:26 +0100134syn cluster shDerefList contains=shDeref,shDerefSimple,shDerefVar,shDerefSpecial,shDerefWordError,shDerefPSR,shDerefPPS
Bram Moolenaarbc8801c2016-08-02 21:04:33 +0200135syn cluster shDerefVarList contains=shDerefOff,shDerefOp,shDerefVarArray,shDerefOpError
Bram Moolenaard2855f52018-07-31 22:23:58 +0200136syn cluster shEchoList contains=shArithmetic,shCommandSub,shCommandSubBQ,shDeref,shDerefSimple,shEscape,shExSingleQuote,shExDoubleQuote,shSingleQuote,shDoubleQuote,shCtrlSeq,shEchoQuote
Bram Moolenaare90ee312010-08-05 22:08:47 +0200137syn cluster shExprList1 contains=shCharClass,shNumber,shOperator,shExSingleQuote,shExDoubleQuote,shSingleQuote,shDoubleQuote,shExpr,shDblBrace,shDeref,shDerefSimple,shCtrlSeq
Bram Moolenaar383f9bc2005-01-19 22:18:32 +0000138syn cluster shExprList2 contains=@shExprList1,@shCaseList,shTest
Bram Moolenaard2855f52018-07-31 22:23:58 +0200139syn cluster shFunctionList contains=@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 +0000140if exists("b:is_kornshell") || exists("b:is_bash")
Bram Moolenaarc236c162008-07-13 17:41:49 +0000141 syn cluster shFunctionList add=shRepeat
Bram Moolenaar7263a772007-05-10 17:35:54 +0000142 syn cluster shFunctionList add=shDblBrace,shDblParen
143endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000144syn cluster shHereBeginList contains=@shCommandSubList
145syn cluster shHereList contains=shBeginHere,shHerePayload
146syn cluster shHereListDQ contains=shBeginHere,@shDblQuoteList,shHerePayload
Bram Moolenaard2855f52018-07-31 22:23:58 +0200147syn cluster shIdList contains=shCommandSub,shCommandSubBQ,shWrapLineOperator,shSetOption,shComment,shDeref,shDerefSimple,shHereString,shRedir,shExSingleQuote,shExDoubleQuote,shSingleQuote,shDoubleQuote,shExpr,shCtrlSeq,shStringSpecial,shAtExpr
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200148syn cluster shIfList contains=@shLoopList,shDblBrace,shDblParen,shFunctionKey,shFunctionOne,shFunctionTwo
Bram Moolenaarb4ff5182015-11-10 21:15:48 +0100149syn cluster shLoopList contains=@shCaseList,@shErrorList,shCaseEsac,shConditional,shDblBrace,shExpr,shFor,shForPP,shIf,shOption,shSet,shTest,shTestOpr,shTouch
Bram Moolenaar91c49372016-05-08 09:50:29 +0200150syn cluster shPPSRightList contains=shComment,shDeref,shDerefSimple,shEscape,shPosnParm
Bram Moolenaard2855f52018-07-31 22:23:58 +0200151syn cluster shSubShList contains=@shCommandSubList,shCommandSubBQ,shCaseEsac,shColon,shCommandSub,shComment,shDo,shEcho,shExpr,shFor,shIf,shHereString,shRedir,shSetList,shSource,shStatement,shVariable,shCtrlSeq,shOperator
152syn cluster shTestList contains=shCharClass,shCommandSub,shCommandSubBQ,shCtrlSeq,shDeref,shDerefSimple,shDoubleQuote,shSpecialDQ,shExDoubleQuote,shExpr,shExSingleQuote,shNumber,shOperator,shSingleQuote,shTest,shTestOpr
Bram Moolenaarb0d45e72017-11-05 18:19:24 +0100153syn cluster shNoZSList contains=shSpecialNoZS
Bram Moolenaar93a1df22018-09-10 11:51:50 +0200154syn cluster shForList contains=shTestOpr,shNumber,shDerefSimple,shDeref,shCommandSub,shCommandSubBQ,shArithmetic
Bram Moolenaarb4ff5182015-11-10 21:15:48 +0100155
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000156" Echo: {{{1
Bram Moolenaar071d4272004-06-13 20:20:40 +0000157" ====
158" This one is needed INSIDE a CommandSub, so that `echo bla` be correct
Bram Moolenaarbc488a72013-07-05 21:01:22 +0200159syn region shEcho matchgroup=shStatement start="\<echo\>" skip="\\$" matchgroup=shEchoDelim end="$" matchgroup=NONE end="[<>;&|()`]"me=e-1 end="\d[<>]"me=e-2 end="\s#"me=e-2 contains=@shEchoList skipwhite nextgroup=shQuickComment
160syn region shEcho 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=@shEchoList skipwhite nextgroup=shQuickComment
Bram Moolenaar5c736222010-01-06 20:54:52 +0100161syn match shEchoQuote contained '\%(\\\\\)*\\["`'()]'
Bram Moolenaar071d4272004-06-13 20:20:40 +0000162
Bram Moolenaarc236c162008-07-13 17:41:49 +0000163" This must be after the strings, so that ... \" will be correct
Bram Moolenaare90ee312010-08-05 22:08:47 +0200164syn 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=shNumber,shExSingleQuote,shSingleQuote,shDeref,shDerefSimple,shSpecialVar,shOperator,shExDoubleQuote,shDoubleQuote,shCharClass,shCtrlSeq
Bram Moolenaar071d4272004-06-13 20:20:40 +0000165
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000166" Alias: {{{1
Bram Moolenaar071d4272004-06-13 20:20:40 +0000167" =====
Bram Moolenaar51ad4ea2018-04-06 11:14:11 +0200168if exists("b:is_kornshell") || exists("b:is_bash") || exists("b:is_posix")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000169 syn match shStatement "\<alias\>"
Bram Moolenaard960d762011-09-21 19:22:10 +0200170 syn region shAlias matchgroup=shStatement start="\<alias\>\s\+\(\h[-._[:alnum:]]\+\)\@=" skip="\\$" end="\>\|`"
171 syn region shAlias matchgroup=shStatement start="\<alias\>\s\+\(\h[-._[:alnum:]]\+=\)\@=" skip="\\$" end="="
Bram Moolenaarb4ff5182015-11-10 21:15:48 +0100172
173 " Touch: {{{1
174 " =====
Bram Moolenaar6d5ad4c2016-10-27 17:00:16 +0200175 syn match shTouch '\<touch\>[^;#]*' skipwhite nextgroup=shComment contains=shTouchCmd,shDoubleQuote,shSingleQuote,shDeref,shDerefSimple
Bram Moolenaarb4ff5182015-11-10 21:15:48 +0100176 syn match shTouchCmd '\<touch\>' contained
Bram Moolenaar071d4272004-06-13 20:20:40 +0000177endif
178
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000179" Error Codes: {{{1
180" ============
Bram Moolenaar6be7f872012-01-20 21:08:56 +0100181if !exists("g:sh_no_error")
Bram Moolenaare2719092015-01-10 15:09:25 +0100182 syn match shDoError "\<done\>"
183 syn match shIfError "\<fi\>"
184 syn match shInError "\<in\>"
185 syn match shCaseError ";;"
186 syn match shEsacError "\<esac\>"
187 syn match shCurlyError "}"
188 syn match shParenError ")"
189 syn match shOK '\.\(done\|fi\|in\|esac\)'
Bram Moolenaar51ad4ea2018-04-06 11:14:11 +0200190 if exists("b:is_kornshell") || exists("b:is_bash")
Bram Moolenaare2719092015-01-10 15:09:25 +0100191 syn match shDTestError "]]"
Bram Moolenaar6be7f872012-01-20 21:08:56 +0100192 endif
Bram Moolenaare2719092015-01-10 15:09:25 +0100193 syn match shTestError "]"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000194endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000195
Bram Moolenaarc236c162008-07-13 17:41:49 +0000196" Options: {{{1
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000197" ====================
Bram Moolenaar7db8f6f2016-03-29 23:12:46 +0200198syn match shOption "\s\zs[-+][-_a-zA-Z#@]\+"
Bram Moolenaarbc488a72013-07-05 21:01:22 +0200199syn match shOption "\s\zs--[^ \t$`'"|);]\+"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000200
Bram Moolenaar7263a772007-05-10 17:35:54 +0000201" File Redirection Highlighted As Operators: {{{1
202"===========================================
203syn match shRedir "\d\=>\(&[-0-9]\)\="
204syn match shRedir "\d\=>>-\="
205syn match shRedir "\d\=<\(&[-0-9]\)\="
206syn match shRedir "\d<<-\="
207
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000208" Operators: {{{1
209" ==========
Bram Moolenaar7263a772007-05-10 17:35:54 +0000210syn match shOperator "<<\|>>" contained
Bram Moolenaarc236c162008-07-13 17:41:49 +0000211syn match shOperator "[!&;|]" contained
212syn match shOperator "\[[[^:]\|\]]" contained
Bram Moolenaar541f92d2015-06-19 13:27:23 +0200213syn match shOperator "[-=/*+%]\==" skipwhite nextgroup=shPattern
Bram Moolenaare90ee312010-08-05 22:08:47 +0200214syn match shPattern "\<\S\+\())\)\@=" contained contains=shExSingleQuote,shSingleQuote,shExDoubleQuote,shDoubleQuote,shDeref
Bram Moolenaar071d4272004-06-13 20:20:40 +0000215
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000216" Subshells: {{{1
217" ==========
Bram Moolenaare4a3bcf2016-08-26 19:52:37 +0200218syn region shExpr transparent matchgroup=shExprRegion start="{" end="}" contains=@shExprList2 nextgroup=shSpecialNxt
219syn region shSubSh transparent matchgroup=shSubShRegion start="[^(]\zs(" end=")" contains=@shSubShList nextgroup=shSpecialNxt
Bram Moolenaar071d4272004-06-13 20:20:40 +0000220
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000221" Tests: {{{1
222"=======
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200223syn region shExpr matchgroup=shRange start="\[" skip=+\\\\\|\\$\|\[+ end="\]" contains=@shTestList,shSpecial
Bram Moolenaar5c736222010-01-06 20:54:52 +0100224syn region shTest transparent matchgroup=shStatement start="\<test\s" skip=+\\\\\|\\$+ matchgroup=NONE end="[;&|]"me=e-1 end="$" contains=@shExprList1
Bram Moolenaarb0d45e72017-11-05 18:19:24 +0100225syn region shNoQuote start='\S' skip='\%(\\\\\)*\\.' end='\ze\s' end="\ze['"]" contained contains=shDerefSimple,shDeref
Bram Moolenaar91c49372016-05-08 09:50:29 +0200226syn match shAstQuote contained '\*\ze"' nextgroup=shString
Bram Moolenaar541f92d2015-06-19 13:27:23 +0200227syn match shTestOpr contained '[^-+/%]\zs=' skipwhite nextgroup=shTestDoubleQuote,shTestSingleQuote,shTestPattern
Bram Moolenaarb4ff5182015-11-10 21:15:48 +0100228syn match shTestOpr contained "<=\|>=\|!=\|==\|=\~\|-.\>\|-\(nt\|ot\|ef\|eq\|ne\|lt\|le\|gt\|ge\)\>\|[!<>]"
Bram Moolenaar9964e462007-05-05 17:54:07 +0000229syn match shTestPattern contained '\w\+'
Bram Moolenaar91c49372016-05-08 09:50:29 +0200230syn region shTestDoubleQuote contained start='\%(\%(\\\\\)*\\\)\@<!"' skip=+\\\\\|\\"+ end='"' contains=shDeref,shDerefSimple,shDerefSpecial
Bram Moolenaarb0d45e72017-11-05 18:19:24 +0100231syn match shTestSingleQuote contained '\\.' nextgroup=shTestSingleQuote
Bram Moolenaar9964e462007-05-05 17:54:07 +0000232syn match shTestSingleQuote contained "'[^']*'"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000233if exists("b:is_kornshell") || exists("b:is_bash")
Bram Moolenaar91c49372016-05-08 09:50:29 +0200234 syn region shDblBrace matchgroup=Delimiter start="\[\[" skip=+\%(\\\\\)*\\$+ end="\]\]" contains=@shTestList,shAstQuote,shNoQuote,shComment
Bram Moolenaarb4ff5182015-11-10 21:15:48 +0100235 syn region shDblParen matchgroup=Delimiter start="((" skip=+\%(\\\\\)*\\$+ end="))" contains=@shTestList,shComment
Bram Moolenaar071d4272004-06-13 20:20:40 +0000236endif
237
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000238" Character Class In Range: {{{1
239" =========================
Bram Moolenaar071d4272004-06-13 20:20:40 +0000240syn match shCharClass contained "\[:\(backspace\|escape\|return\|xdigit\|alnum\|alpha\|blank\|cntrl\|digit\|graph\|lower\|print\|punct\|space\|upper\|tab\):\]"
241
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000242" Loops: do, if, while, until {{{1
243" ======
Bram Moolenaarb4ff5182015-11-10 21:15:48 +0100244ShFoldIfDoFor syn region shDo transparent matchgroup=shConditional start="\<do\>" matchgroup=shConditional end="\<done\>" contains=@shLoopList
245ShFoldIfDoFor syn region shIf transparent matchgroup=shConditional start="\<if\_s" matchgroup=shConditional skip=+-fi\>+ end="\<;\_s*then\>" end="\<fi\>" contains=@shIfList
246ShFoldIfDoFor syn region shFor matchgroup=shLoop start="\<for\ze\_s\s*\%(((\)\@!" end="\<in\>" end="\<do\>"me=e-2 contains=@shLoopList,shDblParen skipwhite nextgroup=shCurlyIn
Bram Moolenaar93a1df22018-09-10 11:51:50 +0200247ShFoldIfDoFor syn region shForPP matchgroup=shLoop start='\<for\>\_s*((' end='))' contains=@shForList
Bram Moolenaarb4ff5182015-11-10 21:15:48 +0100248
Bram Moolenaar51ad4ea2018-04-06 11:14:11 +0200249if exists("b:is_kornshell") || exists("b:is_bash") || exists("b:is_posix")
Bram Moolenaarc236c162008-07-13 17:41:49 +0000250 syn cluster shCaseList add=shRepeat
251 syn cluster shFunctionList add=shRepeat
Bram Moolenaar51ad4ea2018-04-06 11:14:11 +0200252 syn region shRepeat matchgroup=shLoop start="\<while\_s" end="\<do\>"me=e-2 contains=@shLoopList,shDblParen,shDblBrace
253 syn region shRepeat matchgroup=shLoop start="\<until\_s" end="\<do\>"me=e-2 contains=@shLoopList,shDblParen,shDblBrace
254 if !exists("b:is_posix")
255 syn region shCaseEsac matchgroup=shConditional start="\<select\s" matchgroup=shConditional end="\<in\>" end="\<do\>" contains=@shLoopList
256 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000257else
Bram Moolenaarc236c162008-07-13 17:41:49 +0000258 syn region shRepeat matchgroup=shLoop start="\<while\_s" end="\<do\>"me=e-2 contains=@shLoopList
259 syn region shRepeat matchgroup=shLoop start="\<until\_s" end="\<do\>"me=e-2 contains=@shLoopList
Bram Moolenaar071d4272004-06-13 20:20:40 +0000260endif
Bram Moolenaar572cb562005-08-05 21:35:02 +0000261syn region shCurlyIn contained matchgroup=Delimiter start="{" end="}" contains=@shCurlyList
262syn match shComma contained ","
Bram Moolenaar071d4272004-06-13 20:20:40 +0000263
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000264" Case: case...esac {{{1
Bram Moolenaar071d4272004-06-13 20:20:40 +0000265" ====
Bram Moolenaard2855f52018-07-31 22:23:58 +0200266syn match shCaseBar contained skipwhite "\(^\|[^\\]\)\(\\\\\)*\zs|" nextgroup=shCase,shCaseStart,shCaseBar,shComment,shCaseExSingleQuote,shCaseSingleQuote,shCaseDoubleQuote
267syn match shCaseStart contained skipwhite skipnl "(" nextgroup=shCase,shCaseBar
268syn match shCaseLabel contained skipwhite "\%(\\.\|[-a-zA-Z0-9_*.]\)\+" contains=shCharClass
Bram Moolenaarb0d45e72017-11-05 18:19:24 +0100269if exists("b:is_bash")
Bram Moolenaard2855f52018-07-31 22:23:58 +0200270 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
271else
272 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 +0100273endif
Bram Moolenaard2855f52018-07-31 22:23:58 +0200274ShFoldIfDoFor syn region shCaseEsac matchgroup=shConditional start="\<case\>" end="\<esac\>" contains=@shCaseEsacList
Bram Moolenaarb4ff5182015-11-10 21:15:48 +0100275
Bram Moolenaardf177f62005-02-22 08:39:57 +0000276syn keyword shCaseIn contained skipwhite skipnl in nextgroup=shCase,shCaseStart,shCaseBar,shComment,shCaseExSingleQuote,shCaseSingleQuote,shCaseDoubleQuote
277if exists("b:is_bash")
Bram Moolenaar4b22cdb2010-08-02 22:12:46 +0200278 syn region shCaseExSingleQuote matchgroup=shQuote start=+\$'+ skip=+\\\\\|\\.+ end=+'+ contains=shStringSpecial,shSpecial skipwhite skipnl nextgroup=shCaseBar contained
Bram Moolenaar6be7f872012-01-20 21:08:56 +0100279elseif !exists("g:sh_no_error")
Bram Moolenaardf177f62005-02-22 08:39:57 +0000280 syn region shCaseExSingleQuote matchgroup=Error start=+\$'+ skip=+\\\\\|\\.+ end=+'+ contains=shStringSpecial skipwhite skipnl nextgroup=shCaseBar contained
281endif
Bram Moolenaar4b22cdb2010-08-02 22:12:46 +0200282syn region shCaseSingleQuote matchgroup=shQuote start=+'+ end=+'+ contains=shStringSpecial skipwhite skipnl nextgroup=shCaseBar contained
283syn region shCaseDoubleQuote matchgroup=shQuote start=+"+ skip=+\\\\\|\\.+ end=+"+ contains=@shDblQuoteList,shStringSpecial skipwhite skipnl nextgroup=shCaseBar contained
Bram Moolenaar071d4272004-06-13 20:20:40 +0000284syn region shCaseCommandSub start=+`+ skip=+\\\\\|\\.+ end=+`+ contains=@shCommandSubList skipwhite skipnl nextgroup=shCaseBar contained
Bram Moolenaar97d62492012-11-15 21:28:22 +0100285if exists("b:is_bash")
286 syn region shCaseRange matchgroup=Delimiter start=+\[+ skip=+\\\\+ end=+\]+ contained contains=shCharClass
287 syn match shCharClass '\[:\%(alnum\|alpha\|ascii\|blank\|cntrl\|digit\|graph\|lower\|print\|punct\|space\|upper\|word\|or\|xdigit\):\]' contained
288else
289 syn region shCaseRange matchgroup=Delimiter start=+\[+ skip=+\\\\+ end=+\]+ contained
290endif
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000291" Misc: {{{1
292"======
Bram Moolenaar071d4272004-06-13 20:20:40 +0000293syn match shWrapLineOperator "\\$"
Bram Moolenaar93a1df22018-09-10 11:51:50 +0200294syn region shCommandSubBQ start="`" skip="\\\\\|\\." end="`" contains=shBQComment,@shCommandSubList
Bram Moolenaard2855f52018-07-31 22:23:58 +0200295syn match shEscape contained '\%(^\)\@!\%(\\\\\)*\\.' nextgroup=shSingleQuote,shDoubleQuote,shComment
Bram Moolenaar071d4272004-06-13 20:20:40 +0000296
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000297" $() and $(()): {{{1
Bram Moolenaar071d4272004-06-13 20:20:40 +0000298" $(..) is not supported by sh (Bourne shell). However, apparently
299" some systems (HP?) have as their /bin/sh a (link to) Korn shell
300" (ie. Posix compliant shell). /bin/ksh should work for those
301" systems too, however, so the following syntax will flag $(..) as
302" an Error under /bin/sh. By consensus of vimdev'ers!
Bram Moolenaarb0d45e72017-11-05 18:19:24 +0100303if exists("b:is_kornshell") || exists("b:is_bash") || exists("b:is_posix")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000304 syn region shCommandSub matchgroup=shCmdSubRegion start="\$(" skip='\\\\\|\\.' end=")" contains=@shCommandSubList
Bram Moolenaarc236c162008-07-13 17:41:49 +0000305 syn region shArithmetic matchgroup=shArithRegion start="\$((" skip='\\\\\|\\.' end="))" contains=@shArithList
Bram Moolenaar61d35bd2012-03-28 20:51:51 +0200306 syn region shArithmetic matchgroup=shArithRegion start="\$\[" skip='\\\\\|\\.' end="\]" contains=@shArithList
Bram Moolenaar071d4272004-06-13 20:20:40 +0000307 syn match shSkipInitWS contained "^\s\+"
Bram Moolenaar6be7f872012-01-20 21:08:56 +0100308elseif !exists("g:sh_no_error")
Bram Moolenaardf177f62005-02-22 08:39:57 +0000309 syn region shCommandSub matchgroup=Error start="\$(" end=")" contains=@shCommandSubList
Bram Moolenaar071d4272004-06-13 20:20:40 +0000310endif
Bram Moolenaare2719092015-01-10 15:09:25 +0100311syn region shCmdParenRegion matchgroup=shCmdSubRegion start="(\ze[^(]" skip='\\\\\|\\.' end=")" contains=@shCommandSubList
Bram Moolenaar071d4272004-06-13 20:20:40 +0000312
313if exists("b:is_bash")
314 syn cluster shCommandSubList add=bashSpecialVariables,bashStatement
315 syn cluster shCaseList add=bashAdminStatement,bashStatement
Bram Moolenaard960d762011-09-21 19:22:10 +0200316 syn keyword bashSpecialVariables contained auto_resume BASH BASH_ALIASES BASH_ALIASES BASH_ARGC BASH_ARGC BASH_ARGV BASH_ARGV BASH_CMDS BASH_CMDS BASH_COMMAND BASH_COMMAND BASH_ENV BASH_EXECUTION_STRING BASH_EXECUTION_STRING BASH_LINENO BASH_LINENO BASHOPTS BASHOPTS BASHPID BASHPID BASH_REMATCH BASH_REMATCH BASH_SOURCE BASH_SOURCE BASH_SUBSHELL BASH_SUBSHELL BASH_VERSINFO BASH_VERSION BASH_XTRACEFD BASH_XTRACEFD CDPATH COLUMNS COLUMNS COMP_CWORD COMP_CWORD COMP_KEY COMP_KEY COMP_LINE COMP_LINE COMP_POINT COMP_POINT COMPREPLY COMPREPLY COMP_TYPE COMP_TYPE COMP_WORDBREAKS COMP_WORDBREAKS COMP_WORDS COMP_WORDS COPROC COPROC DIRSTACK EMACS EMACS ENV ENV EUID FCEDIT FIGNORE FUNCNAME FUNCNAME FUNCNEST FUNCNEST GLOBIGNORE GROUPS histchars HISTCMD HISTCONTROL HISTFILE HISTFILESIZE HISTIGNORE HISTSIZE HISTTIMEFORMAT HISTTIMEFORMAT HOME HOSTFILE HOSTNAME HOSTTYPE IFS IGNOREEOF INPUTRC LANG LC_ALL LC_COLLATE LC_CTYPE LC_CTYPE LC_MESSAGES LC_NUMERIC LC_NUMERIC LINENO LINES LINES MACHTYPE MAIL MAILCHECK MAILPATH MAPFILE MAPFILE OLDPWD OPTARG OPTERR OPTIND OSTYPE PATH PIPESTATUS POSIXLY_CORRECT POSIXLY_CORRECT PPID PROMPT_COMMAND PS1 PS2 PS3 PS4 PWD RANDOM READLINE_LINE READLINE_LINE READLINE_POINT READLINE_POINT REPLY SECONDS SHELL SHELL SHELLOPTS SHLVL TIMEFORMAT TIMEOUT TMPDIR TMPDIR UID
Bram Moolenaar690afe12017-01-28 18:34:47 +0100317 syn keyword bashStatement chmod clear complete du egrep expr fgrep find gnufind gnugrep grep less ls mkdir mv rm rmdir rpm sed sleep sort strip tail
Bram Moolenaar071d4272004-06-13 20:20:40 +0000318 syn keyword bashAdminStatement daemon killall killproc nice reload restart start status stop
Bram Moolenaar97d62492012-11-15 21:28:22 +0100319 syn keyword bashStatement command compgen
Bram Moolenaar071d4272004-06-13 20:20:40 +0000320endif
321
Bram Moolenaar51ad4ea2018-04-06 11:14:11 +0200322if exists("b:is_kornshell") || exists("b:is_posix")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000323 syn cluster shCommandSubList add=kshSpecialVariables,kshStatement
324 syn cluster shCaseList add=kshStatement
325 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 Moolenaarb4ff5182015-11-10 21:15:48 +0100326 syn keyword kshStatement cat chmod clear cp du egrep expr fgrep find grep killall less ls mkdir mv nice printenv rm rmdir sed sort strip stty tail tput
Bram Moolenaar97d62492012-11-15 21:28:22 +0100327 syn keyword kshStatement command setgroups setsenv
Bram Moolenaar071d4272004-06-13 20:20:40 +0000328endif
329
330syn match shSource "^\.\s"
331syn match shSource "\s\.\s"
Bram Moolenaar5c736222010-01-06 20:54:52 +0100332"syn region shColon start="^\s*:" end="$" end="\s#"me=e-2 contains=@shColonList
Bram Moolenaar6be7f872012-01-20 21:08:56 +0100333"syn region shColon start="^\s*\zs:" end="$" end="\s#"me=e-2
Bram Moolenaar51ad4ea2018-04-06 11:14:11 +0200334if exists("b:is_kornshell") || exists("b:is_posix")
Bram Moolenaar91c49372016-05-08 09:50:29 +0200335 syn match shColon '^\s*\zs:'
336endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000337
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000338" String And Character Constants: {{{1
339"================================
Bram Moolenaar7db8f6f2016-03-29 23:12:46 +0200340syn match shNumber "\<\d\+\>#\="
Bram Moolenaarbc8801c2016-08-02 21:04:33 +0200341syn match shNumber "\<-\=\.\=\d\+\>#\="
Bram Moolenaar802a0d92016-06-26 16:17:58 +0200342syn match shCtrlSeq "\\\d\d\d\|\\[abcfnrtv0]" contained
Bram Moolenaardf177f62005-02-22 08:39:57 +0000343if exists("b:is_bash")
Bram Moolenaar802a0d92016-06-26 16:17:58 +0200344 syn match shSpecial "[^\\]\(\\\\\)*\zs\\\o\o\o\|\\x\x\x\|\\c[^"]\|\\[abefnrtv]" contained
345 syn match shSpecial "^\(\\\\\)*\zs\\\o\o\o\|\\x\x\x\|\\c[^"]\|\\[abefnrtv]" contained
Bram Moolenaare4a3bcf2016-08-26 19:52:37 +0200346 syn region shExSingleQuote matchgroup=shQuote start=+\$'+ skip=+\\\\\|\\.+ end=+'+ contains=shStringSpecial,shSpecial nextgroup=shSpecialNxt
347 syn region shExDoubleQuote matchgroup=shQuote start=+\$"+ skip=+\\\\\|\\.\|\\"+ end=+"+ contains=@shDblQuoteList,shStringSpecial,shSpecial nextgroup=shSpecialNxt
Bram Moolenaar6be7f872012-01-20 21:08:56 +0100348elseif !exists("g:sh_no_error")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000349 syn region shExSingleQuote matchGroup=Error start=+\$'+ skip=+\\\\\|\\.+ end=+'+ contains=shStringSpecial
Bram Moolenaare90ee312010-08-05 22:08:47 +0200350 syn region shExDoubleQuote matchGroup=Error start=+\$"+ skip=+\\\\\|\\.+ end=+"+ contains=shStringSpecial
Bram Moolenaardf177f62005-02-22 08:39:57 +0000351endif
Bram Moolenaard2855f52018-07-31 22:23:58 +0200352syn region shSingleQuote matchgroup=shQuote start=+'+ end=+'+ contains=@Spell nextgroup=shSpecialStart,shSpecialSQ
Bram Moolenaar51ad4ea2018-04-06 11:14:11 +0200353syn region shDoubleQuote matchgroup=shQuote start=+\%(\%(\\\\\)*\\\)\@<!"+ skip=+\\"+ end=+"+ contains=@shDblQuoteList,shStringSpecial,@Spell nextgroup=shSpecialStart
Bram Moolenaard2855f52018-07-31 22:23:58 +0200354syn region shDoubleQuote matchgroup=shQuote start=+"+ skip=+\\"+ end=+"+ contained contains=@shDblQuoteList,shStringSpecial,@Spell nextgroup=shSpecialStart
Bram Moolenaar802a0d92016-06-26 16:17:58 +0200355syn match shStringSpecial "[^[:print:] \t]" contained
Bram Moolenaard2855f52018-07-31 22:23:58 +0200356syn match shStringSpecial "[^\\]\zs\%(\\\\\)*\\[\\"'`$()#]" nextgroup=shComment
357syn match shSpecialSQ "[^\\]\zs\%(\\\\\)*\\[\\"'`$()#]" contained nextgroup=shBkslshSnglQuote,@shNoZSList
358syn match shSpecialDQ "[^\\]\zs\%(\\\\\)*\\[\\"'`$()#]" contained nextgroup=shBkslshDblQuote,@shNoZSList
Bram Moolenaar51ad4ea2018-04-06 11:14:11 +0200359syn match shSpecialStart "\%(\\\\\)*\\[\\"'`$()#]" contained nextgroup=shBkslshSnglQuote,shBkslshDblQuote,@shNoZSList
Bram Moolenaar60cce2f2015-10-13 23:21:27 +0200360syn match shSpecial "^\%(\\\\\)*\\[\\"'`$()#]"
Bram Moolenaarb0d45e72017-11-05 18:19:24 +0100361syn match shSpecialNoZS contained "\%(\\\\\)*\\[\\"'`$()#]"
Bram Moolenaare4a3bcf2016-08-26 19:52:37 +0200362syn match shSpecialNxt contained "\\[\\"'`$()#]"
Bram Moolenaard2855f52018-07-31 22:23:58 +0200363syn region shBkslshSnglQuote contained matchgroup=shQuote start=+'+ end=+'+ contains=@Spell nextgroup=shSpecialStart
364syn region shBkslshDblQuote contained matchgroup=shQuote start=+"+ skip=+\\"+ end=+"+ contains=@shDblQuoteList,shStringSpecial,@Spell nextgroup=shSpecialStart
Bram Moolenaar071d4272004-06-13 20:20:40 +0000365
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000366" Comments: {{{1
367"==========
Bram Moolenaar5c736222010-01-06 20:54:52 +0100368syn cluster shCommentGroup contains=shTodo,@Spell
Bram Moolenaar6d5ad4c2016-10-27 17:00:16 +0200369if exists("b:is_bash")
370 syn match shTodo contained "\<\%(COMBAK\|FIXME\|TODO\|XXX\)\ze:\=\>"
371else
372 syn keyword shTodo contained COMBAK FIXME TODO XXX
373endif
Bram Moolenaar5c736222010-01-06 20:54:52 +0100374syn match shComment "^\s*\zs#.*$" contains=@shCommentGroup
375syn match shComment "\s\zs#.*$" contains=@shCommentGroup
Bram Moolenaar97d62492012-11-15 21:28:22 +0100376syn match shComment contained "#.*$" contains=@shCommentGroup
Bram Moolenaar5c736222010-01-06 20:54:52 +0100377syn match shQuickComment contained "#.*$"
Bram Moolenaar93a1df22018-09-10 11:51:50 +0200378syn match shBQComment contained "#.\{-}\ze`" contains=@shCommentGroup
Bram Moolenaar071d4272004-06-13 20:20:40 +0000379
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000380" Here Documents: {{{1
381" =========================================
Bram Moolenaar51ad4ea2018-04-06 11:14:11 +0200382ShFoldHereDoc syn region shHereDoc matchgroup=shHereDoc01 start="<<\s*\\\=\z([^ \t0-9|>]\+\)" matchgroup=shHereDoc01 end="^\z1\s*$" contains=@shDblQuoteList
Bram Moolenaard2855f52018-07-31 22:23:58 +0200383ShFoldHereDoc syn region shHereDoc matchgroup=shHereDoc02 start="<<\s*\"\z([^ \t|>]\+\)\"" matchgroup=shHereDoc02 end="^\z1\s*$"
Bram Moolenaar51ad4ea2018-04-06 11:14:11 +0200384ShFoldHereDoc syn region shHereDoc matchgroup=shHereDoc03 start="<<-\s*\z([^ \t0-9|>]\+\)" matchgroup=shHereDoc03 end="^\s*\z1\s*$" contains=@shDblQuoteList
Bram Moolenaard2855f52018-07-31 22:23:58 +0200385ShFoldHereDoc syn region shHereDoc matchgroup=shHereDoc04 start="<<-\s*'\z([^']\+\)'" matchgroup=shHereDoc04 end="^\s*\z1\s*$"
386ShFoldHereDoc syn region shHereDoc matchgroup=shHereDoc05 start="<<\s*'\z([^']\+\)'" matchgroup=shHereDoc05 end="^\z1\s*$"
387ShFoldHereDoc syn region shHereDoc matchgroup=shHereDoc06 start="<<-\s*\"\z([^ \t|>]\+\)\"" matchgroup=shHereDoc06 end="^\s*\z1\s*$"
Bram Moolenaar51ad4ea2018-04-06 11:14:11 +0200388ShFoldHereDoc syn region shHereDoc matchgroup=shHereDoc07 start="<<\s*\\\_$\_s*\z([^ \t0-9|>]\+\)" matchgroup=shHereDoc07 end="^\z1\s*$" contains=@shDblQuoteList
389ShFoldHereDoc syn region shHereDoc matchgroup=shHereDoc08 start="<<\s*\\\_$\_s*'\z([^ \t0-9|>]\+\)'" matchgroup=shHereDoc08 end="^\z1\s*$"
390ShFoldHereDoc syn region shHereDoc matchgroup=shHereDoc09 start="<<\s*\\\_$\_s*\"\z([^ \t0-9|>]\+\)\"" matchgroup=shHereDoc09 end="^\z1\s*$"
391ShFoldHereDoc syn region shHereDoc matchgroup=shHereDoc10 start="<<-\s*\\\_$\_s*\z([^ \t0-9|>]\+\)" matchgroup=shHereDoc10 end="^\s*\z1\s*$"
392ShFoldHereDoc syn region shHereDoc matchgroup=shHereDoc11 start="<<-\s*\\\_$\_s*\\\z([^ \t0-9|>]\+\)" matchgroup=shHereDoc11 end="^\s*\z1\s*$"
Bram Moolenaard2855f52018-07-31 22:23:58 +0200393ShFoldHereDoc syn region shHereDoc matchgroup=shHereDoc12 start="<<-\s*\\\_$\_s*'\z([^ \t|>]\+\)'" matchgroup=shHereDoc12 end="^\s*\z1\s*$"
394ShFoldHereDoc syn region shHereDoc matchgroup=shHereDoc13 start="<<-\s*\\\_$\_s*\"\z([^ \t|>]\+\)\"" matchgroup=shHereDoc13 end="^\s*\z1\s*$"
Bram Moolenaar51ad4ea2018-04-06 11:14:11 +0200395ShFoldHereDoc syn region shHereDoc matchgroup=shHereDoc14 start="<<\\\z([^ \t0-9|>]\+\)" matchgroup=shHereDoc14 end="^\z1\s*$"
396ShFoldHereDoc syn region shHereDoc matchgroup=shHereDoc15 start="<<-\s*\\\z([^ \t0-9|>]\+\)" matchgroup=shHereDoc15 end="^\s*\z1\s*$"
Bram Moolenaard2855f52018-07-31 22:23:58 +0200397ShFoldHereDoc syn region shHereDoc matchgroup=shHereDoc16 start="<<-\s*\\\z([^ \t0-9|>]\+\)" matchgroup=shHereDoc15 end="^\s*\z1\s*$"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000398
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000399" Here Strings: {{{1
400" =============
Bram Moolenaar6d5ad4c2016-10-27 17:00:16 +0200401" available for: bash; ksh (really should be ksh93 only) but not if its a posix
Bram Moolenaar690afe12017-01-28 18:34:47 +0100402if exists("b:is_bash") || (exists("b:is_kornshell") && !exists("b:is_posix"))
Bram Moolenaare4a3bcf2016-08-26 19:52:37 +0200403 syn match shHereString "<<<" skipwhite nextgroup=shCmdParenRegion
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000404endif
405
406" Identifiers: {{{1
407"=============
Bram Moolenaarc236c162008-07-13 17:41:49 +0000408syn match shSetOption "\s\zs[-+][a-zA-Z0-9]\+\>" contained
Bram Moolenaar541f92d2015-06-19 13:27:23 +0200409syn match shVariable "\<\([bwglsav]:\)\=[a-zA-Z0-9.!@_%+,]*\ze=" nextgroup=shVarAssign
410syn match shVarAssign "=" contained nextgroup=shCmdParenRegion,shPattern,shDeref,shDerefSimple,shDoubleQuote,shExDoubleQuote,shSingleQuote,shExSingleQuote
Bram Moolenaarbc488a72013-07-05 21:01:22 +0200411syn region shAtExpr contained start="@(" end=")" contains=@shIdList
Bram Moolenaar071d4272004-06-13 20:20:40 +0000412if exists("b:is_bash")
Bram Moolenaard2855f52018-07-31 22:23:58 +0200413 syn match shSet "^\s*set\ze\s*$"
Bram Moolenaarbc488a72013-07-05 21:01:22 +0200414 syn region shSetList oneline matchgroup=shSet start="\<\(declare\|typeset\|local\|export\|unset\)\>\ze[^/]" end="$" matchgroup=shSetListDelim end="\ze[}|);&]" matchgroup=NONE end="\ze\s\+#\|=" contains=@shIdList
Bram Moolenaard2855f52018-07-31 22:23:58 +0200415 syn region shSetList oneline matchgroup=shSet start="\<set\>\ze[^/]" end="\ze[;|#)]\|$" matchgroup=shSetListDelim end="\ze[}|);&]" matchgroup=NONE end="\ze\s\+=" contains=@shIdList nextgroup=shComment
Bram Moolenaar51ad4ea2018-04-06 11:14:11 +0200416elseif exists("b:is_kornshell") || exists("b:is_posix")
Bram Moolenaard2855f52018-07-31 22:23:58 +0200417 syn match shSet "^\s*set\ze\s*$"
Bram Moolenaarbc488a72013-07-05 21:01:22 +0200418 syn region shSetList oneline matchgroup=shSet start="\<\(typeset\|export\|unset\)\>\ze[^/]" end="$" matchgroup=shSetListDelim end="\ze[}|);&]" matchgroup=NONE end="\ze\s\+[#=]" contains=@shIdList
419 syn region shSetList oneline matchgroup=shSet start="\<set\>\ze[^/]" end="$" matchgroup=shSetListDelim end="\ze[}|);&]" matchgroup=NONE end="\ze\s\+[#=]" contains=@shIdList
Bram Moolenaar071d4272004-06-13 20:20:40 +0000420else
Bram Moolenaarbc488a72013-07-05 21:01:22 +0200421 syn region shSetList oneline matchgroup=shSet start="\<\(set\|export\|unset\)\>\ze[^/]" end="$" matchgroup=shSetListDelim end="\ze[}|);&]" matchgroup=NONE end="\ze\s\+[#=]" contains=@shIdList
Bram Moolenaar071d4272004-06-13 20:20:40 +0000422endif
423
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000424" Functions: {{{1
Bram Moolenaar690afe12017-01-28 18:34:47 +0100425if !exists("b:is_posix")
Bram Moolenaarc236c162008-07-13 17:41:49 +0000426 syn keyword shFunctionKey function skipwhite skipnl nextgroup=shFunctionTwo
427endif
428
429if exists("b:is_bash")
Bram Moolenaar91c49372016-05-08 09:50:29 +0200430 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
431 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
432 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
433 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 +0000434else
Bram Moolenaar91c49372016-05-08 09:50:29 +0200435 ShFoldFunctions syn region shFunctionOne matchgroup=shFunction start="^\s*\h\w*\s*()\_s*{" end="}" contains=@shFunctionList skipwhite skipnl nextgroup=shFunctionStart,shQuickComment
436 ShFoldFunctions syn region shFunctionTwo matchgroup=shFunction start="\%(do\)\@!\&\<\h\w*\>\s*\%(()\)\=\_s*{" end="}" contains=shFunctionKey,@shFunctionList contained skipwhite skipnl nextgroup=shFunctionStart,shQuickComment
437 ShFoldFunctions syn region shFunctionThree matchgroup=shFunction start="^\s*\h\w*\s*()\_s*(" end=")" contains=@shFunctionList skipwhite skipnl nextgroup=shFunctionStart,shQuickComment
438 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 +0000439endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000440
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000441" Parameter Dereferencing: {{{1
442" ========================
Bram Moolenaar6be7f872012-01-20 21:08:56 +0100443if !exists("g:sh_no_error")
Bram Moolenaar91c49372016-05-08 09:50:29 +0200444 syn match shDerefWordError "[^}$[~]" contained
Bram Moolenaar6be7f872012-01-20 21:08:56 +0100445endif
Bram Moolenaarb0d45e72017-11-05 18:19:24 +0100446syn match shDerefSimple "\$\%(\h\w*\|\d\)" nextgroup=@shNoZSList
Bram Moolenaarb4ff5182015-11-10 21:15:48 +0100447syn region shDeref matchgroup=PreProc start="\${" end="}" contains=@shDerefList,shDerefVarArray
Bram Moolenaarb0d45e72017-11-05 18:19:24 +0100448syn match shDerefSimple "\$[-#*@!?]" nextgroup=@shNoZSList
449syn match shDerefSimple "\$\$" nextgroup=@shNoZSList
450syn match shDerefSimple "\${\d}" nextgroup=@shNoZSList
Bram Moolenaar51ad4ea2018-04-06 11:14:11 +0200451if exists("b:is_bash") || exists("b:is_kornshell") || exists("b:is_posix")
Bram Moolenaarb0d45e72017-11-05 18:19:24 +0100452 syn region shDeref matchgroup=PreProc start="\${##\=" end="}" contains=@shDerefList nextgroup=@shSpecialNoZS
453 syn region shDeref matchgroup=PreProc start="\${\$\$" end="}" contains=@shDerefList nextgroup=@shSpecialNoZS
Bram Moolenaar071d4272004-06-13 20:20:40 +0000454endif
455
Bram Moolenaarb4ff5182015-11-10 21:15:48 +0100456" ksh: ${!var[*]} array index list syntax: {{{1
457" ========================================
Bram Moolenaar51ad4ea2018-04-06 11:14:11 +0200458if exists("b:is_kornshell") || exists("b:is_posix")
Bram Moolenaarb4ff5182015-11-10 21:15:48 +0100459 syn region shDeref matchgroup=PreProc start="\${!" end="}" contains=@shDerefVarArray
460endif
461
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000462" bash: ${!prefix*} and ${#parameter}: {{{1
463" ====================================
Bram Moolenaar071d4272004-06-13 20:20:40 +0000464if exists("b:is_bash")
Bram Moolenaarbc8801c2016-08-02 21:04:33 +0200465 syn region shDeref matchgroup=PreProc start="\${!" end="\*\=}" contains=@shDerefList,shDerefOff
466 syn match shDerefVar contained "{\@<=!\h\w*" nextgroup=@shDerefVarList
Bram Moolenaar071d4272004-06-13 20:20:40 +0000467endif
Bram Moolenaarb4ff5182015-11-10 21:15:48 +0100468if exists("b:is_kornshell")
Bram Moolenaarbc8801c2016-08-02 21:04:33 +0200469 syn match shDerefVar contained "{\@<=!\h\w*[[:alnum:]_.]*" nextgroup=@shDerefVarList
Bram Moolenaarb4ff5182015-11-10 21:15:48 +0100470endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000471
472syn match shDerefSpecial contained "{\@<=[-*@?0]" nextgroup=shDerefOp,shDerefOpError
473syn match shDerefSpecial contained "\({[#!]\)\@<=[[:alnum:]*@_]\+" nextgroup=@shDerefVarList,shDerefOp
Bram Moolenaarbc8801c2016-08-02 21:04:33 +0200474syn match shDerefVar contained "{\@<=\h\w*" nextgroup=@shDerefVarList
Bram Moolenaare4a3bcf2016-08-26 19:52:37 +0200475syn match shDerefVar contained '\d' nextgroup=@shDerefVarList
Bram Moolenaar51ad4ea2018-04-06 11:14:11 +0200476if exists("b:is_kornshell") || exists("b:is_posix")
Bram Moolenaarbc8801c2016-08-02 21:04:33 +0200477 syn match shDerefVar contained "{\@<=\h\w*[[:alnum:]_.]*" nextgroup=@shDerefVarList
Bram Moolenaarb4ff5182015-11-10 21:15:48 +0100478endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000479
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000480" sh ksh bash : ${var[... ]...} array reference: {{{1
Bram Moolenaare2719092015-01-10 15:09:25 +0100481syn region shDerefVarArray contained matchgroup=shDeref start="\[" end="]" contains=@shCommandSubList nextgroup=shDerefOp,shDerefOpError
Bram Moolenaar071d4272004-06-13 20:20:40 +0000482
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000483" Special ${parameter OPERATOR word} handling: {{{1
Bram Moolenaare2719092015-01-10 15:09:25 +0100484" sh ksh bash : ${parameter:-word} word is default value
485" sh ksh bash : ${parameter:=word} assign word as default value
486" sh ksh bash : ${parameter:?word} display word if parameter is null
487" sh ksh bash : ${parameter:+word} use word if parameter is not null, otherwise nothing
488" ksh bash : ${parameter#pattern} remove small left pattern
489" ksh bash : ${parameter##pattern} remove large left pattern
490" ksh bash : ${parameter%pattern} remove small right pattern
491" ksh bash : ${parameter%%pattern} remove large right pattern
492" bash : ${parameter^pattern} Case modification
493" bash : ${parameter^^pattern} Case modification
494" bash : ${parameter,pattern} Case modification
495" bash : ${parameter,,pattern} Case modification
Bram Moolenaar071d4272004-06-13 20:20:40 +0000496syn cluster shDerefPatternList contains=shDerefPattern,shDerefString
Bram Moolenaar6be7f872012-01-20 21:08:56 +0100497if !exists("g:sh_no_error")
498 syn match shDerefOpError contained ":[[:punct:]]"
499endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000500syn match shDerefOp contained ":\=[-=?]" nextgroup=@shDerefPatternList
501syn match shDerefOp contained ":\=+" nextgroup=@shDerefPatternList
Bram Moolenaar51ad4ea2018-04-06 11:14:11 +0200502if exists("b:is_bash") || exists("b:is_kornshell") || exists("b:is_posix")
Bram Moolenaare4a3bcf2016-08-26 19:52:37 +0200503 syn match shDerefOp contained "#\{1,2}" nextgroup=@shDerefPatternList
504 syn match shDerefOp contained "%\{1,2}" nextgroup=@shDerefPatternList
505 syn match shDerefPattern contained "[^{}]\+" contains=shDeref,shDerefSimple,shDerefPattern,shDerefString,shCommandSub,shDerefEscape nextgroup=shDerefPattern
Bram Moolenaar071d4272004-06-13 20:20:40 +0000506 syn region shDerefPattern contained start="{" end="}" contains=shDeref,shDerefSimple,shDerefString,shCommandSub nextgroup=shDerefPattern
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +0000507 syn match shDerefEscape contained '\%(\\\\\)*\\.'
Bram Moolenaar071d4272004-06-13 20:20:40 +0000508endif
Bram Moolenaard960d762011-09-21 19:22:10 +0200509if exists("b:is_bash")
510 syn match shDerefOp contained "[,^]\{1,2}" nextgroup=@shDerefPatternList
511endif
Bram Moolenaare4a3bcf2016-08-26 19:52:37 +0200512syn region shDerefString contained matchgroup=shDerefDelim start=+\%(\\\)\@<!'+ end=+'+ contains=shStringSpecial
Bram Moolenaar4b22cdb2010-08-02 22:12:46 +0200513syn region shDerefString contained matchgroup=shDerefDelim start=+\%(\\\)\@<!"+ skip=+\\"+ end=+"+ contains=@shDblQuoteList,shStringSpecial
Bram Moolenaarc236c162008-07-13 17:41:49 +0000514syn match shDerefString contained "\\["']" nextgroup=shDerefPattern
Bram Moolenaar071d4272004-06-13 20:20:40 +0000515
Bram Moolenaar071d4272004-06-13 20:20:40 +0000516if exists("b:is_bash")
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +0000517 " bash : ${parameter:offset}
518 " bash : ${parameter:offset:length}
Bram Moolenaard2855f52018-07-31 22:23:58 +0200519 syn region shDerefOff contained start=':[^-=?+]' end='\ze:' end='\ze}' contains=shDeref,shDerefSimple,shDerefEscape nextgroup=shDerefLen,shDeref,shDerefSimple
Bram Moolenaare4a3bcf2016-08-26 19:52:37 +0200520 syn region shDerefOff contained start=':\s-' end='\ze:' end='\ze}' contains=shDeref,shDerefSimple,shDerefEscape nextgroup=shDerefLen,shDeref,shDerefSimple
Bram Moolenaard2855f52018-07-31 22:23:58 +0200521 syn match shDerefLen contained ":[^}]\+" contains=shDeref,shDerefSimple,shArithmetic
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +0000522
523 " bash : ${parameter//pattern/string}
524 " bash : ${parameter//pattern}
525 syn match shDerefPPS contained '/\{1,2}' nextgroup=shDerefPPSleft
Bram Moolenaar97d62492012-11-15 21:28:22 +0100526 syn region shDerefPPSleft contained start='.' skip=@\%(\\\\\)*\\/@ matchgroup=shDerefOp end='/' end='\ze}' nextgroup=shDerefPPSright contains=@shCommandSubList
Bram Moolenaar91c49372016-05-08 09:50:29 +0200527 syn region shDerefPPSright contained start='.' skip=@\%(\\\\\)\+@ end='\ze}' contains=@shPPSRightList
Bram Moolenaaracb4f222016-01-10 15:59:26 +0100528
529 " bash : ${parameter/#substring/replacement}
Bram Moolenaar93a1df22018-09-10 11:51:50 +0200530 syn match shDerefPSR contained '/#' nextgroup=shDerefPSRleft,shDoubleQuote,shSingleQuote
531 syn region shDerefPSRleft contained start='[^"']' skip=@\%(\\\\\)*\\/@ matchgroup=shDerefOp end='/' end='\ze}' nextgroup=shDerefPSRright
Bram Moolenaaracb4f222016-01-10 15:59:26 +0100532 syn region shDerefPSRright contained start='.' skip=@\%(\\\\\)\+@ end='\ze}'
Bram Moolenaar071d4272004-06-13 20:20:40 +0000533endif
534
Bram Moolenaarc236c162008-07-13 17:41:49 +0000535" Arithmetic Parenthesized Expressions: {{{1
Bram Moolenaarbc488a72013-07-05 21:01:22 +0200536"syn region shParen matchgroup=shArithRegion start='[^$]\zs(\%(\ze[^(]\|$\)' end=')' contains=@shArithParenList
537syn region shParen matchgroup=shArithRegion start='\$\@!(\%(\ze[^(]\|$\)' end=')' contains=@shArithParenList
Bram Moolenaarc236c162008-07-13 17:41:49 +0000538
Bram Moolenaar93a1df22018-09-10 11:51:50 +0200539" Additional sh Keywords: {{{1
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000540" ===================
Bram Moolenaar071d4272004-06-13 20:20:40 +0000541syn keyword shStatement break cd chdir continue eval exec exit kill newgrp pwd read readonly return shift test trap ulimit umask wait
542syn keyword shConditional contained elif else then
Bram Moolenaar6be7f872012-01-20 21:08:56 +0100543if !exists("g:sh_no_error")
544 syn keyword shCondError elif else then
545endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000546
Bram Moolenaar93a1df22018-09-10 11:51:50 +0200547" Additional ksh Keywords and Aliases: {{{1
548" ===================================
Bram Moolenaar51ad4ea2018-04-06 11:14:11 +0200549if exists("b:is_kornshell") || exists("b:is_bash") || exists("b:is_posix")
Bram Moolenaar93a1df22018-09-10 11:51:50 +0200550 syn keyword shStatement bg builtin disown enum export false fg getconf getopts hist jobs let printf sleep true typeset unalias unset whence
551 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 +0100552 if exists("b:is_posix")
Bram Moolenaarc236c162008-07-13 17:41:49 +0000553 syn keyword shStatement command
554 else
555 syn keyword shStatement time
556 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000557
Bram Moolenaar93a1df22018-09-10 11:51:50 +0200558" Additional bash Keywords: {{{1
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000559" =====================
Bram Moolenaar071d4272004-06-13 20:20:40 +0000560 if exists("b:is_bash")
Bram Moolenaar93a1df22018-09-10 11:51:50 +0200561" syn keyword shStatement bind builtin dirs disown enable help logout popd pushd shopt source
562syn keyword shStatement bind builtin caller compopt declare dirs disown enable export help local logout mapfile popd pushd readarray shopt source typeset unset
Bram Moolenaar071d4272004-06-13 20:20:40 +0000563 else
564 syn keyword shStatement login newgrp
565 endif
566endif
567
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000568" Synchronization: {{{1
569" ================
Bram Moolenaar03413f42016-04-12 21:07:15 +0200570if !exists("g:sh_minlines")
571 let s:sh_minlines = 200
572else
573 let s:sh_minlines= g:sh_minlines
Bram Moolenaar071d4272004-06-13 20:20:40 +0000574endif
Bram Moolenaar03413f42016-04-12 21:07:15 +0200575if !exists("g:sh_maxlines")
576 let s:sh_maxlines = 2*s:sh_minlines
577 if s:sh_maxlines < 25
578 let s:sh_maxlines= 25
579 endif
580else
581 let s:sh_maxlines= g:sh_maxlines
Bram Moolenaar071d4272004-06-13 20:20:40 +0000582endif
Bram Moolenaar03413f42016-04-12 21:07:15 +0200583exec "syn sync minlines=" . s:sh_minlines . " maxlines=" . s:sh_maxlines
Bram Moolenaar071d4272004-06-13 20:20:40 +0000584syn sync match shCaseEsacSync grouphere shCaseEsac "\<case\>"
585syn sync match shCaseEsacSync groupthere shCaseEsac "\<esac\>"
586syn sync match shDoSync grouphere shDo "\<do\>"
587syn sync match shDoSync groupthere shDo "\<done\>"
588syn sync match shForSync grouphere shFor "\<for\>"
589syn sync match shForSync groupthere shFor "\<in\>"
590syn sync match shIfSync grouphere shIf "\<if\>"
591syn sync match shIfSync groupthere shIf "\<fi\>"
592syn sync match shUntilSync grouphere shRepeat "\<until\>"
593syn sync match shWhileSync grouphere shRepeat "\<while\>"
594
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000595" Default Highlighting: {{{1
596" =====================
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200597if !exists("skip_sh_syntax_inits")
598 hi def link shArithRegion shShellVariables
599 hi def link shAstQuote shDoubleQuote
600 hi def link shAtExpr shSetList
Bram Moolenaard2855f52018-07-31 22:23:58 +0200601 hi def link shBkslshSnglQuote shSingleQuote
602 hi def link shBkslshDblQuote shDOubleQuote
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200603 hi def link shBeginHere shRedir
604 hi def link shCaseBar shConditional
605 hi def link shCaseCommandSub shCommandSub
606 hi def link shCaseDoubleQuote shDoubleQuote
607 hi def link shCaseIn shConditional
608 hi def link shQuote shOperator
609 hi def link shCaseSingleQuote shSingleQuote
610 hi def link shCaseStart shConditional
611 hi def link shCmdSubRegion shShellVariables
612 hi def link shColon shComment
613 hi def link shDerefOp shOperator
614 hi def link shDerefPOL shDerefOp
615 hi def link shDerefPPS shDerefOp
616 hi def link shDerefPSR shDerefOp
617 hi def link shDeref shShellVariables
618 hi def link shDerefDelim shOperator
619 hi def link shDerefSimple shDeref
620 hi def link shDerefSpecial shDeref
621 hi def link shDerefString shDoubleQuote
622 hi def link shDerefVar shDeref
623 hi def link shDoubleQuote shString
624 hi def link shEcho shString
625 hi def link shEchoDelim shOperator
626 hi def link shEchoQuote shString
627 hi def link shForPP shLoop
628 hi def link shFunction Function
629 hi def link shEmbeddedEcho shString
630 hi def link shEscape shCommandSub
631 hi def link shExDoubleQuote shDoubleQuote
632 hi def link shExSingleQuote shSingleQuote
633 hi def link shHereDoc shString
634 hi def link shHereString shRedir
635 hi def link shHerePayload shHereDoc
636 hi def link shLoop shStatement
637 hi def link shSpecialNxt shSpecial
638 hi def link shNoQuote shDoubleQuote
639 hi def link shOption shCommandSub
640 hi def link shPattern shString
641 hi def link shParen shArithmetic
642 hi def link shPosnParm shShellVariables
643 hi def link shQuickComment shComment
Bram Moolenaar93a1df22018-09-10 11:51:50 +0200644 hi def link shBQComment shComment
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200645 hi def link shRange shOperator
646 hi def link shRedir shOperator
647 hi def link shSetListDelim shOperator
648 hi def link shSetOption shOption
649 hi def link shSingleQuote shString
650 hi def link shSource shOperator
651 hi def link shStringSpecial shSpecial
Bram Moolenaar51ad4ea2018-04-06 11:14:11 +0200652 hi def link shSpecialStart shSpecial
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200653 hi def link shSubShRegion shOperator
654 hi def link shTestOpr shConditional
655 hi def link shTestPattern shString
656 hi def link shTestDoubleQuote shString
657 hi def link shTestSingleQuote shString
658 hi def link shTouchCmd shStatement
659 hi def link shVariable shSetList
660 hi def link shWrapLineOperator shOperator
Bram Moolenaar071d4272004-06-13 20:20:40 +0000661
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200662 if exists("b:is_bash")
663 hi def link bashAdminStatement shStatement
664 hi def link bashSpecialVariables shShellVariables
665 hi def link bashStatement shStatement
666 hi def link shCharClass shSpecial
667 hi def link shDerefOff shDerefOp
668 hi def link shDerefLen shDerefOff
Bram Moolenaar6be7f872012-01-20 21:08:56 +0100669 endif
Bram Moolenaar51ad4ea2018-04-06 11:14:11 +0200670 if exists("b:is_kornshell") || exists("b:is_posix")
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200671 hi def link kshSpecialVariables shShellVariables
672 hi def link kshStatement shStatement
673 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000674
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200675 if !exists("g:sh_no_error")
676 hi def link shCaseError Error
677 hi def link shCondError Error
678 hi def link shCurlyError Error
679 hi def link shDerefOpError Error
680 hi def link shDerefWordError Error
681 hi def link shDoError Error
682 hi def link shEsacError Error
683 hi def link shIfError Error
684 hi def link shInError Error
685 hi def link shParenError Error
686 hi def link shTestError Error
Bram Moolenaar51ad4ea2018-04-06 11:14:11 +0200687 if exists("b:is_kornshell") || exists("b:is_posix")
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200688 hi def link shDTestError Error
689 endif
690 endif
691
692 hi def link shArithmetic Special
693 hi def link shCharClass Identifier
694 hi def link shSnglCase Statement
695 hi def link shCommandSub Special
Bram Moolenaard2855f52018-07-31 22:23:58 +0200696 hi def link shCommandSubBQ shCommandSub
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200697 hi def link shComment Comment
698 hi def link shConditional Conditional
699 hi def link shCtrlSeq Special
700 hi def link shExprRegion Delimiter
701 hi def link shFunctionKey Function
702 hi def link shFunctionName Function
703 hi def link shNumber Number
704 hi def link shOperator Operator
705 hi def link shRepeat Repeat
706 hi def link shSet Statement
707 hi def link shSetList Identifier
708 hi def link shShellVariables PreProc
709 hi def link shSpecial Special
Bram Moolenaard2855f52018-07-31 22:23:58 +0200710 hi def link shSpecialDQ Special
711 hi def link shSpecialSQ Special
Bram Moolenaarb0d45e72017-11-05 18:19:24 +0100712 hi def link shSpecialNoZS shSpecial
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200713 hi def link shStatement Statement
714 hi def link shString String
715 hi def link shTodo Todo
716 hi def link shAlias Identifier
717 hi def link shHereDoc01 shRedir
718 hi def link shHereDoc02 shRedir
719 hi def link shHereDoc03 shRedir
720 hi def link shHereDoc04 shRedir
721 hi def link shHereDoc05 shRedir
722 hi def link shHereDoc06 shRedir
723 hi def link shHereDoc07 shRedir
724 hi def link shHereDoc08 shRedir
725 hi def link shHereDoc09 shRedir
726 hi def link shHereDoc10 shRedir
727 hi def link shHereDoc11 shRedir
728 hi def link shHereDoc12 shRedir
729 hi def link shHereDoc13 shRedir
730 hi def link shHereDoc14 shRedir
731 hi def link shHereDoc15 shRedir
732endif
Bram Moolenaarb4ff5182015-11-10 21:15:48 +0100733
734" Delete shell folding commands {{{1
735" =============================
736delc ShFoldFunctions
737delc ShFoldHereDoc
738delc ShFoldIfDoFor
Bram Moolenaar071d4272004-06-13 20:20:40 +0000739
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000740" Set Current Syntax: {{{1
741" ===================
Bram Moolenaar071d4272004-06-13 20:20:40 +0000742if exists("b:is_bash")
743 let b:current_syntax = "bash"
744elseif exists("b:is_kornshell")
745 let b:current_syntax = "ksh"
Bram Moolenaar51ad4ea2018-04-06 11:14:11 +0200746elseif exists("b:is_posix")
747 let b:current_syntax = "posix"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000748else
749 let b:current_syntax = "sh"
750endif
751
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000752" vim: ts=16 fdm=marker