blob: 355e8eb918c61644821e015839637f41621425f5 [file] [log] [blame]
Bram Moolenaar071d4272004-06-13 20:20:40 +00001" Vim syntax file
2" Language: shell (sh) Korn shell (ksh) bash (sh)
3" Maintainer: Dr. Charles E. Campbell, Jr. <NdrOchipS@PcampbellAfamily.Mbiz>
4" Previous Maintainer: Lennart Schultz <Lennart.Schultz@ecmwf.int>
Bram Moolenaar61d35bd2012-03-28 20:51:51 +02005" Last Change: Mar 19, 2012
6" Version: 122
Bram Moolenaarcafda4f2005-09-06 19:25:11 +00007" URL: http://mysite.verizon.net/astronaut/vim/index.html#vimlinks_syntax
Bram Moolenaarc236c162008-07-13 17:41:49 +00008" For options and settings, please use: :help ft-sh-syntax
Bram Moolenaar4b22cdb2010-08-02 22:12:46 +02009" This file includes many ideas from ?ric Brunet (eric.brunet@ens.fr)
Bram Moolenaar071d4272004-06-13 20:20:40 +000010
Bram Moolenaard4755bb2004-09-02 19:12:26 +000011" For version 5.x: Clear all syntax items {{{1
Bram Moolenaar071d4272004-06-13 20:20:40 +000012" For version 6.x: Quit when a syntax file was already loaded
13if version < 600
14 syntax clear
15elseif exists("b:current_syntax")
16 finish
17endif
18
Bram Moolenaard960d762011-09-21 19:22:10 +020019" AFAICT "." should be considered part of the iskeyword. Using iskeywords in
20" syntax is dicey, so the following code permits the user to prevent/override
21" its setting.
22if exists("g:sh_isk") " override support
23 exe "setlocal isk=".g:sh_isk
24elseif !exists("g:sh_noisk") " prevent modification support
25 setlocal isk+=.
26endif
27
28" trying to answer the question: which shell is /bin/sh, really?
29if !exists("g:is_kornshell") && !exists("g:is_bash") && !exists("g:is_posix") && !exists("g:is_sh")
30 if executable("/bin/sh")
31 if resolve("/bin/sh") =~ 'bash$'
32 let g:is_bash= 1
33 elseif resolve("/bin/sh") =~ 'ksh$'
34 let g:is_ksh = 1
35 endif
36 elseif executable("/usr/bin/sh")
37 if resolve("/usr/bin//sh") =~ 'bash$'
38 let g:is_bash= 1
39 elseif resolve("/usr/bin//sh") =~ 'ksh$'
40 let g:is_ksh = 1
41 endif
42 endif
43endif
44
Bram Moolenaard4755bb2004-09-02 19:12:26 +000045" handling /bin/sh with is_kornshell/is_sh {{{1
Bram Moolenaar071d4272004-06-13 20:20:40 +000046" b:is_sh is set when "#! /bin/sh" is found;
47" However, it often is just a masquerade by bash (typically Linux)
48" or kornshell (typically workstations with Posix "sh").
Bram Moolenaard960d762011-09-21 19:22:10 +020049" So, when the user sets "g:is_bash", "g:is_kornshell",
50" or "g:is_posix", a b:is_sh is converted into b:is_bash/b:is_kornshell,
Bram Moolenaar071d4272004-06-13 20:20:40 +000051" respectively.
52if !exists("b:is_kornshell") && !exists("b:is_bash")
Bram Moolenaar7fc904b2006-04-13 20:37:35 +000053 if exists("g:is_posix") && !exists("g:is_kornshell")
54 let g:is_kornshell= g:is_posix
55 endif
56 if exists("g:is_kornshell")
Bram Moolenaar071d4272004-06-13 20:20:40 +000057 let b:is_kornshell= 1
58 if exists("b:is_sh")
59 unlet b:is_sh
60 endif
Bram Moolenaar7fc904b2006-04-13 20:37:35 +000061 elseif exists("g:is_bash")
Bram Moolenaar071d4272004-06-13 20:20:40 +000062 let b:is_bash= 1
63 if exists("b:is_sh")
64 unlet b:is_sh
65 endif
66 else
67 let b:is_sh= 1
68 endif
69endif
70
Bram Moolenaarcd71fa32005-03-11 22:46:48 +000071" set up default g:sh_fold_enabled {{{1
Bram Moolenaar071d4272004-06-13 20:20:40 +000072if !exists("g:sh_fold_enabled")
73 let g:sh_fold_enabled= 0
Bram Moolenaar293ee4d2004-12-09 21:34:53 +000074elseif g:sh_fold_enabled != 0 && !has("folding")
75 let g:sh_fold_enabled= 0
Bram Moolenaarcd71fa32005-03-11 22:46:48 +000076 echomsg "Ignoring g:sh_fold_enabled=".g:sh_fold_enabled."; need to re-compile vim for +fold support"
77endif
Bram Moolenaarc236c162008-07-13 17:41:49 +000078if !exists("s:sh_fold_functions")
79 let s:sh_fold_functions = 1
80endif
81if !exists("s:sh_fold_heredoc")
82 let s:sh_fold_heredoc = 2
83endif
84if !exists("s:sh_fold_ifdofor")
85 let s:sh_fold_ifdofor = 4
86endif
Bram Moolenaarcd71fa32005-03-11 22:46:48 +000087if g:sh_fold_enabled && &fdm == "manual"
Bram Moolenaar00a927d2010-05-14 23:24:24 +020088 setlocal fdm=syntax
Bram Moolenaar071d4272004-06-13 20:20:40 +000089endif
90
Bram Moolenaarcd71fa32005-03-11 22:46:48 +000091" sh syntax is case sensitive {{{1
Bram Moolenaar071d4272004-06-13 20:20:40 +000092syn case match
93
Bram Moolenaard4755bb2004-09-02 19:12:26 +000094" Clusters: contains=@... clusters {{{1
Bram Moolenaar071d4272004-06-13 20:20:40 +000095"==================================
Bram Moolenaar5c736222010-01-06 20:54:52 +010096syn cluster shErrorList contains=shDoError,shIfError,shInError,shCaseError,shEsacError,shCurlyError,shParenError,shTestError,shOK
Bram Moolenaarc236c162008-07-13 17:41:49 +000097if exists("b:is_kornshell")
98 syn cluster ErrorList add=shDTestError
99endif
Bram Moolenaare90ee312010-08-05 22:08:47 +0200100syn cluster shArithParenList contains=shArithmetic,shCaseEsac,shDeref,shDerefSimple,shEcho,shEscape,shNumber,shOperator,shPosnParm,shExSingleQuote,shExDoubleQuote,shRedir,shSingleQuote,shDoubleQuote,shStatement,shVariable,shAlias,shTest,shCtrlSeq,shSpecial,shParen,bashSpecialVariables,bashStatement
Bram Moolenaarc236c162008-07-13 17:41:49 +0000101syn cluster shArithList contains=@shArithParenList,shParenError
Bram Moolenaar5c736222010-01-06 20:54:52 +0100102syn cluster shCaseEsacList contains=shCaseStart,shCase,shCaseBar,shCaseIn,shComment,shDeref,shDerefSimple,shCaseCommandSub,shCaseExSingleQuote,shCaseSingleQuote,shCaseDoubleQuote,shCtrlSeq,@shErrorList,shStringSpecial,shCaseRange
Bram Moolenaard960d762011-09-21 19:22:10 +0200103syn cluster shCaseList contains=@shCommandSubList,shCaseEsac,shColon,shCommandSub,shComment,shDo,shEcho,shExpr,shFor,shHereDoc,shIf,shRedir,shSetList,shSource,shStatement,shVariable,shCtrlSeq
Bram Moolenaar6be7f872012-01-20 21:08:56 +0100104"syn cluster shColonList contains=@shCaseList
Bram Moolenaare90ee312010-08-05 22:08:47 +0200105syn cluster shCommandSubList contains=shArithmetic,shDeref,shDerefSimple,shEscape,shNumber,shOperator,shPosnParm,shExSingleQuote,shSingleQuote,shExDoubleQuote,shDoubleQuote,shStatement,shVariable,shSubSh,shAlias,shTest,shCtrlSeq,shSpecial
Bram Moolenaar572cb562005-08-05 21:35:02 +0000106syn cluster shCurlyList contains=shNumber,shComma,shDeref,shDerefSimple,shDerefSpecial
Bram Moolenaare90ee312010-08-05 22:08:47 +0200107syn cluster shDblQuoteList contains=shCommandSub,shDeref,shDerefSimple,shPosnParm,shCtrlSeq,shSpecial
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +0000108syn cluster shDerefList contains=shDeref,shDerefSimple,shDerefVar,shDerefSpecial,shDerefWordError,shDerefPPS
Bram Moolenaar071d4272004-06-13 20:20:40 +0000109syn cluster shDerefVarList contains=shDerefOp,shDerefVarArray,shDerefOpError
Bram Moolenaare90ee312010-08-05 22:08:47 +0200110syn cluster shEchoList contains=shArithmetic,shCommandSub,shDeref,shDerefSimple,shExpr,shExSingleQuote,shExDoubleQuote,shSingleQuote,shDoubleQuote,shCtrlSeq,shEchoQuote
111syn cluster shExprList1 contains=shCharClass,shNumber,shOperator,shExSingleQuote,shExDoubleQuote,shSingleQuote,shDoubleQuote,shExpr,shDblBrace,shDeref,shDerefSimple,shCtrlSeq
Bram Moolenaar383f9bc2005-01-19 22:18:32 +0000112syn cluster shExprList2 contains=@shExprList1,@shCaseList,shTest
Bram Moolenaard960d762011-09-21 19:22:10 +0200113syn cluster shFunctionList contains=@shCommandSubList,shCaseEsac,shColon,shCommandSub,shComment,shDo,shEcho,shExpr,shFor,shHereDoc,shIf,shOption,shRedir,shSetList,shSource,shStatement,shVariable,shOperator,shCtrlSeq
Bram Moolenaar7263a772007-05-10 17:35:54 +0000114if exists("b:is_kornshell") || exists("b:is_bash")
Bram Moolenaarc236c162008-07-13 17:41:49 +0000115 syn cluster shFunctionList add=shRepeat
Bram Moolenaar7263a772007-05-10 17:35:54 +0000116 syn cluster shFunctionList add=shDblBrace,shDblParen
117endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000118syn cluster shHereBeginList contains=@shCommandSubList
119syn cluster shHereList contains=shBeginHere,shHerePayload
120syn cluster shHereListDQ contains=shBeginHere,@shDblQuoteList,shHerePayload
Bram Moolenaare90ee312010-08-05 22:08:47 +0200121syn cluster shIdList contains=shCommandSub,shWrapLineOperator,shSetOption,shDeref,shDerefSimple,shRedir,shExSingleQuote,shExDoubleQuote,shSingleQuote,shDoubleQuote,shExpr,shCtrlSeq,shStringSpecial
Bram Moolenaar6be7f872012-01-20 21:08:56 +0100122syn cluster shIfList contains=@shLoopList,shDblBrace,shDblParen,shFunctionKey,shFunctionOne,shFunctionTwo
123syn cluster shLoopList contains=@shCaseList,shTestOpr,shExpr,shDblBrace,shConditional,shCaseEsac,shTest,@shErrorList,shSet,shOption
Bram Moolenaard960d762011-09-21 19:22:10 +0200124syn cluster shSubShList contains=@shCommandSubList,shCaseEsac,shColon,shCommandSub,shComment,shDo,shEcho,shExpr,shFor,shIf,shRedir,shSetList,shSource,shStatement,shVariable,shCtrlSeq,shOperator
125syn cluster shTestList contains=shCharClass,shComment,shCommandSub,shDeref,shDerefSimple,shExDoubleQuote,shDoubleQuote,shExpr,shNumber,shOperator,shExSingleQuote,shSingleQuote,shTestOpr,shTest,shCtrlSeq
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000126" Echo: {{{1
Bram Moolenaar071d4272004-06-13 20:20:40 +0000127" ====
128" This one is needed INSIDE a CommandSub, so that `echo bla` be correct
Bram Moolenaar4b22cdb2010-08-02 22:12:46 +0200129syn 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
130syn 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 +0100131syn match shEchoQuote contained '\%(\\\\\)*\\["`'()]'
Bram Moolenaar071d4272004-06-13 20:20:40 +0000132
Bram Moolenaarc236c162008-07-13 17:41:49 +0000133" This must be after the strings, so that ... \" will be correct
Bram Moolenaare90ee312010-08-05 22:08:47 +0200134syn 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 +0000135
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000136" Alias: {{{1
Bram Moolenaar071d4272004-06-13 20:20:40 +0000137" =====
138if exists("b:is_kornshell") || exists("b:is_bash")
139 syn match shStatement "\<alias\>"
Bram Moolenaard960d762011-09-21 19:22:10 +0200140 syn region shAlias matchgroup=shStatement start="\<alias\>\s\+\(\h[-._[:alnum:]]\+\)\@=" skip="\\$" end="\>\|`"
141 syn region shAlias matchgroup=shStatement start="\<alias\>\s\+\(\h[-._[:alnum:]]\+=\)\@=" skip="\\$" end="="
Bram Moolenaar071d4272004-06-13 20:20:40 +0000142endif
143
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000144" Error Codes: {{{1
145" ============
Bram Moolenaar6be7f872012-01-20 21:08:56 +0100146if !exists("g:sh_no_error")
147 syn match shDoError "\<done\>"
148 syn match shIfError "\<fi\>"
149 syn match shInError "\<in\>"
150 syn match shCaseError ";;"
151 syn match shEsacError "\<esac\>"
152 syn match shCurlyError "}"
153 syn match shParenError ")"
154 syn match shOK '\.\(done\|fi\|in\|esac\)'
155 if exists("b:is_kornshell")
156 syn match shDTestError "]]"
157 endif
158 syn match shTestError "]"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000159endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000160
Bram Moolenaarc236c162008-07-13 17:41:49 +0000161" Options: {{{1
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000162" ====================
Bram Moolenaarfa01c392010-07-20 12:36:02 +0200163syn match shOption "\s\zs[-+][-_a-zA-Z0-9]\+\>"
Bram Moolenaarc236c162008-07-13 17:41:49 +0000164syn match shOption "\s\zs--[^ \t$`'"|]\+"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000165
Bram Moolenaar7263a772007-05-10 17:35:54 +0000166" File Redirection Highlighted As Operators: {{{1
167"===========================================
168syn match shRedir "\d\=>\(&[-0-9]\)\="
169syn match shRedir "\d\=>>-\="
170syn match shRedir "\d\=<\(&[-0-9]\)\="
171syn match shRedir "\d<<-\="
172
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000173" Operators: {{{1
174" ==========
Bram Moolenaar7263a772007-05-10 17:35:54 +0000175syn match shOperator "<<\|>>" contained
Bram Moolenaarc236c162008-07-13 17:41:49 +0000176syn match shOperator "[!&;|]" contained
177syn match shOperator "\[[[^:]\|\]]" contained
Bram Moolenaar071d4272004-06-13 20:20:40 +0000178syn match shOperator "!\==" skipwhite nextgroup=shPattern
Bram Moolenaare90ee312010-08-05 22:08:47 +0200179syn match shPattern "\<\S\+\())\)\@=" contained contains=shExSingleQuote,shSingleQuote,shExDoubleQuote,shDoubleQuote,shDeref
Bram Moolenaar071d4272004-06-13 20:20:40 +0000180
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000181" Subshells: {{{1
182" ==========
Bram Moolenaard960d762011-09-21 19:22:10 +0200183syn region shExpr transparent matchgroup=shExprRegion start="{" end="}" contains=@shExprList2 nextgroup=shMoreSpecial
184syn region shSubSh transparent matchgroup=shSubShRegion start="[^(]\zs(" end=")" contains=@shSubShList nextgroup=shMoreSpecial
Bram Moolenaar071d4272004-06-13 20:20:40 +0000185
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000186" Tests: {{{1
187"=======
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200188syn region shExpr matchgroup=shRange start="\[" skip=+\\\\\|\\$\|\[+ end="\]" contains=@shTestList,shSpecial
Bram Moolenaar5c736222010-01-06 20:54:52 +0100189syn region shTest transparent matchgroup=shStatement start="\<test\s" skip=+\\\\\|\\$+ matchgroup=NONE end="[;&|]"me=e-1 end="$" contains=@shExprList1
Bram Moolenaar9964e462007-05-05 17:54:07 +0000190syn match shTestOpr contained "<=\|>=\|!=\|==\|-.\>\|-\(nt\|ot\|ef\|eq\|ne\|lt\|le\|gt\|ge\)\>\|[!<>]"
191syn match shTestOpr contained '=' skipwhite nextgroup=shTestDoubleQuote,shTestSingleQuote,shTestPattern
192syn match shTestPattern contained '\w\+'
Bram Moolenaard960d762011-09-21 19:22:10 +0200193syn match shTestDoubleQuote contained '\%(\%(\\\\\)*\\\)\@<!"[^"]*"'
Bram Moolenaar9964e462007-05-05 17:54:07 +0000194syn match shTestSingleQuote contained '\\.'
195syn match shTestSingleQuote contained "'[^']*'"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000196if exists("b:is_kornshell") || exists("b:is_bash")
197 syn region shDblBrace matchgroup=Delimiter start="\[\[" skip=+\\\\\|\\$+ end="\]\]" contains=@shTestList
198 syn region shDblParen matchgroup=Delimiter start="((" skip=+\\\\\|\\$+ end="))" contains=@shTestList
199endif
200
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000201" Character Class In Range: {{{1
202" =========================
Bram Moolenaar071d4272004-06-13 20:20:40 +0000203syn match shCharClass contained "\[:\(backspace\|escape\|return\|xdigit\|alnum\|alpha\|blank\|cntrl\|digit\|graph\|lower\|print\|punct\|space\|upper\|tab\):\]"
204
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000205" Loops: do, if, while, until {{{1
206" ======
Bram Moolenaarc236c162008-07-13 17:41:49 +0000207if (g:sh_fold_enabled % (s:sh_fold_ifdofor * 2))/s:sh_fold_ifdofor
Bram Moolenaar8dff8182006-04-06 20:18:50 +0000208 syn region shDo fold transparent matchgroup=shConditional start="\<do\>" matchgroup=shConditional end="\<done\>" contains=@shLoopList
Bram Moolenaar6be7f872012-01-20 21:08:56 +0100209 syn region shIf fold transparent matchgroup=shConditional start="\<if\_s" matchgroup=shConditional skip=+-fi\>+ end="\<;\_s*then\>" end="\<fi\>" contains=@shIfList
Bram Moolenaarc236c162008-07-13 17:41:49 +0000210 syn region shFor fold matchgroup=shLoop start="\<for\_s" end="\<in\_s" end="\<do\>"me=e-2 contains=@shLoopList,shDblParen skipwhite nextgroup=shCurlyIn
Bram Moolenaar8dff8182006-04-06 20:18:50 +0000211else
212 syn region shDo transparent matchgroup=shConditional start="\<do\>" matchgroup=shConditional end="\<done\>" contains=@shLoopList
Bram Moolenaar6be7f872012-01-20 21:08:56 +0100213 syn region shIf transparent matchgroup=shConditional start="\<if\_s" matchgroup=shConditional skip=+-fi\>+ end="\<;\_s*then\>" end="\<fi\>" contains=@shIfList
Bram Moolenaarc236c162008-07-13 17:41:49 +0000214 syn region shFor matchgroup=shLoop start="\<for\_s" end="\<in\>" end="\<do\>"me=e-2 contains=@shLoopList,shDblParen skipwhite nextgroup=shCurlyIn
Bram Moolenaar8dff8182006-04-06 20:18:50 +0000215endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000216if exists("b:is_kornshell") || exists("b:is_bash")
Bram Moolenaarc236c162008-07-13 17:41:49 +0000217 syn cluster shCaseList add=shRepeat
218 syn cluster shFunctionList add=shRepeat
219 syn region shRepeat matchgroup=shLoop start="\<while\_s" end="\<in\_s" end="\<do\>"me=e-2 contains=@shLoopList,shDblParen,shDblBrace
220 syn region shRepeat matchgroup=shLoop start="\<until\_s" end="\<in\_s" end="\<do\>"me=e-2 contains=@shLoopList,shDblParen,shDblBrace
221 syn region shCaseEsac matchgroup=shConditional start="\<select\s" matchgroup=shConditional end="\<in\>" end="\<do\>" contains=@shLoopList
Bram Moolenaar071d4272004-06-13 20:20:40 +0000222else
Bram Moolenaarc236c162008-07-13 17:41:49 +0000223 syn region shRepeat matchgroup=shLoop start="\<while\_s" end="\<do\>"me=e-2 contains=@shLoopList
224 syn region shRepeat matchgroup=shLoop start="\<until\_s" end="\<do\>"me=e-2 contains=@shLoopList
Bram Moolenaar071d4272004-06-13 20:20:40 +0000225endif
Bram Moolenaar572cb562005-08-05 21:35:02 +0000226syn region shCurlyIn contained matchgroup=Delimiter start="{" end="}" contains=@shCurlyList
227syn match shComma contained ","
Bram Moolenaar071d4272004-06-13 20:20:40 +0000228
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000229" Case: case...esac {{{1
Bram Moolenaar071d4272004-06-13 20:20:40 +0000230" ====
Bram Moolenaarc236c162008-07-13 17:41:49 +0000231syn match shCaseBar contained skipwhite "\(^\|[^\\]\)\(\\\\\)*\zs|" nextgroup=shCase,shCaseStart,shCaseBar,shComment,shCaseExSingleQuote,shCaseSingleQuote,shCaseDoubleQuote
Bram Moolenaar071d4272004-06-13 20:20:40 +0000232syn match shCaseStart contained skipwhite skipnl "(" nextgroup=shCase,shCaseBar
Bram Moolenaarc236c162008-07-13 17:41:49 +0000233if (g:sh_fold_enabled % (s:sh_fold_ifdofor * 2))/s:sh_fold_ifdofor
Bram Moolenaar5c736222010-01-06 20:54:52 +0100234 syn region shCase fold contained skipwhite skipnl matchgroup=shSnglCase start="\%(\\.\|[^#$()'" \t]\)\{-}\zs)" end=";;" end="esac"me=s-1 contains=@shCaseList nextgroup=shCaseStart,shCase,shComment
Bram Moolenaar8dff8182006-04-06 20:18:50 +0000235 syn region shCaseEsac fold matchgroup=shConditional start="\<case\>" end="\<esac\>" contains=@shCaseEsacList
236else
Bram Moolenaar5c736222010-01-06 20:54:52 +0100237 syn region shCase contained skipwhite skipnl matchgroup=shSnglCase start="\%(\\.\|[^#$()'" \t]\)\{-}\zs)" end=";;" end="esac"me=s-1 contains=@shCaseList nextgroup=shCaseStart,shCase,shComment
Bram Moolenaar8dff8182006-04-06 20:18:50 +0000238 syn region shCaseEsac matchgroup=shConditional start="\<case\>" end="\<esac\>" contains=@shCaseEsacList
239endif
Bram Moolenaardf177f62005-02-22 08:39:57 +0000240syn keyword shCaseIn contained skipwhite skipnl in nextgroup=shCase,shCaseStart,shCaseBar,shComment,shCaseExSingleQuote,shCaseSingleQuote,shCaseDoubleQuote
241if exists("b:is_bash")
Bram Moolenaar4b22cdb2010-08-02 22:12:46 +0200242 syn region shCaseExSingleQuote matchgroup=shQuote start=+\$'+ skip=+\\\\\|\\.+ end=+'+ contains=shStringSpecial,shSpecial skipwhite skipnl nextgroup=shCaseBar contained
Bram Moolenaar6be7f872012-01-20 21:08:56 +0100243elseif !exists("g:sh_no_error")
Bram Moolenaardf177f62005-02-22 08:39:57 +0000244 syn region shCaseExSingleQuote matchgroup=Error start=+\$'+ skip=+\\\\\|\\.+ end=+'+ contains=shStringSpecial skipwhite skipnl nextgroup=shCaseBar contained
245endif
Bram Moolenaar4b22cdb2010-08-02 22:12:46 +0200246syn region shCaseSingleQuote matchgroup=shQuote start=+'+ end=+'+ contains=shStringSpecial skipwhite skipnl nextgroup=shCaseBar contained
247syn region shCaseDoubleQuote matchgroup=shQuote start=+"+ skip=+\\\\\|\\.+ end=+"+ contains=@shDblQuoteList,shStringSpecial skipwhite skipnl nextgroup=shCaseBar contained
Bram Moolenaar071d4272004-06-13 20:20:40 +0000248syn region shCaseCommandSub start=+`+ skip=+\\\\\|\\.+ end=+`+ contains=@shCommandSubList skipwhite skipnl nextgroup=shCaseBar contained
Bram Moolenaar5c736222010-01-06 20:54:52 +0100249syn region shCaseRange matchgroup=Delimiter start=+\[+ skip=+\\\\+ end=+]+ contained
Bram Moolenaar071d4272004-06-13 20:20:40 +0000250
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000251" Misc: {{{1
252"======
Bram Moolenaar071d4272004-06-13 20:20:40 +0000253syn match shWrapLineOperator "\\$"
254syn region shCommandSub start="`" skip="\\\\\|\\." end="`" contains=@shCommandSubList
Bram Moolenaard960d762011-09-21 19:22:10 +0200255syn match shEscape contained '\\.' contains=@shCommandSubList
Bram Moolenaar071d4272004-06-13 20:20:40 +0000256
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000257" $() and $(()): {{{1
Bram Moolenaar071d4272004-06-13 20:20:40 +0000258" $(..) is not supported by sh (Bourne shell). However, apparently
259" some systems (HP?) have as their /bin/sh a (link to) Korn shell
260" (ie. Posix compliant shell). /bin/ksh should work for those
261" systems too, however, so the following syntax will flag $(..) as
262" an Error under /bin/sh. By consensus of vimdev'ers!
263if exists("b:is_kornshell") || exists("b:is_bash")
264 syn region shCommandSub matchgroup=shCmdSubRegion start="\$(" skip='\\\\\|\\.' end=")" contains=@shCommandSubList
Bram Moolenaarc236c162008-07-13 17:41:49 +0000265 syn region shArithmetic matchgroup=shArithRegion start="\$((" skip='\\\\\|\\.' end="))" contains=@shArithList
Bram Moolenaar61d35bd2012-03-28 20:51:51 +0200266 syn region shArithmetic matchgroup=shArithRegion start="\$\[" skip='\\\\\|\\.' end="\]" contains=@shArithList
Bram Moolenaar071d4272004-06-13 20:20:40 +0000267 syn match shSkipInitWS contained "^\s\+"
Bram Moolenaar6be7f872012-01-20 21:08:56 +0100268elseif !exists("g:sh_no_error")
Bram Moolenaardf177f62005-02-22 08:39:57 +0000269 syn region shCommandSub matchgroup=Error start="\$(" end=")" contains=@shCommandSubList
Bram Moolenaar071d4272004-06-13 20:20:40 +0000270endif
271
272if exists("b:is_bash")
273 syn cluster shCommandSubList add=bashSpecialVariables,bashStatement
274 syn cluster shCaseList add=bashAdminStatement,bashStatement
Bram Moolenaard960d762011-09-21 19:22:10 +0200275 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 Moolenaar071d4272004-06-13 20:20:40 +0000276 syn keyword bashStatement chmod clear complete du egrep expr fgrep find gnufind gnugrep grep install less ls mkdir mv rm rmdir rpm sed sleep sort strip tail touch
277 syn keyword bashAdminStatement daemon killall killproc nice reload restart start status stop
278endif
279
280if exists("b:is_kornshell")
281 syn cluster shCommandSubList add=kshSpecialVariables,kshStatement
282 syn cluster shCaseList add=kshStatement
283 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
284 syn keyword kshStatement cat chmod clear cp du egrep expr fgrep find grep install killall less ls mkdir mv nice printenv rm rmdir sed sort strip stty tail touch tput
285endif
286
287syn match shSource "^\.\s"
288syn match shSource "\s\.\s"
Bram Moolenaar5c736222010-01-06 20:54:52 +0100289"syn region shColon start="^\s*:" end="$" end="\s#"me=e-2 contains=@shColonList
Bram Moolenaar6be7f872012-01-20 21:08:56 +0100290"syn region shColon start="^\s*\zs:" end="$" end="\s#"me=e-2
291syn match shColon '^\s*\zs:'
Bram Moolenaar071d4272004-06-13 20:20:40 +0000292
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000293" String And Character Constants: {{{1
294"================================
Bram Moolenaar9964e462007-05-05 17:54:07 +0000295syn match shNumber "-\=\<\d\+\>#\="
296syn match shCtrlSeq "\\\d\d\d\|\\[abcfnrtv0]" contained
Bram Moolenaardf177f62005-02-22 08:39:57 +0000297if exists("b:is_bash")
Bram Moolenaar5c736222010-01-06 20:54:52 +0100298 syn match shSpecial "\\\o\o\o\|\\x\x\x\|\\c[^"]\|\\[abefnrtv]" contained
Bram Moolenaardf177f62005-02-22 08:39:57 +0000299endif
300if exists("b:is_bash")
Bram Moolenaar4b22cdb2010-08-02 22:12:46 +0200301 syn region shExSingleQuote matchgroup=shQuote start=+\$'+ skip=+\\\\\|\\.+ end=+'+ contains=shStringSpecial,shSpecial
Bram Moolenaare90ee312010-08-05 22:08:47 +0200302 syn region shExDoubleQuote matchgroup=shQuote start=+\$"+ skip=+\\\\\|\\.\|\\"+ end=+"+ contains=@shDblQuoteList,shStringSpecial,shSpecial
Bram Moolenaar6be7f872012-01-20 21:08:56 +0100303elseif !exists("g:sh_no_error")
Bram Moolenaar9964e462007-05-05 17:54:07 +0000304 syn region shExSingleQuote matchGroup=Error start=+\$'+ skip=+\\\\\|\\.+ end=+'+ contains=shStringSpecial
Bram Moolenaare90ee312010-08-05 22:08:47 +0200305 syn region shExDoubleQuote matchGroup=Error start=+\$"+ skip=+\\\\\|\\.+ end=+"+ contains=shStringSpecial
Bram Moolenaardf177f62005-02-22 08:39:57 +0000306endif
Bram Moolenaar4b22cdb2010-08-02 22:12:46 +0200307syn region shSingleQuote matchgroup=shQuote start=+'+ end=+'+ contains=@Spell
Bram Moolenaard960d762011-09-21 19:22:10 +0200308syn region shDoubleQuote matchgroup=shQuote start=+\%(\%(\\\\\)*\\\)\@<!"+ skip=+\\"+ end=+"+ contains=@shDblQuoteList,shStringSpecial,@Spell
309"syn region shDoubleQuote matchgroup=shQuote start=+"+ skip=+\\"+ end=+"+ contains=@shDblQuoteList,shStringSpecial,@Spell
Bram Moolenaare37d50a2008-08-06 17:06:04 +0000310syn match shStringSpecial "[^[:print:] \t]" contained
Bram Moolenaar7263a772007-05-10 17:35:54 +0000311syn match shStringSpecial "\%(\\\\\)*\\[\\"'`$()#]"
Bram Moolenaar5c736222010-01-06 20:54:52 +0100312syn match shSpecial "[^\\]\zs\%(\\\\\)*\\[\\"'`$()#]" nextgroup=shMoreSpecial
Bram Moolenaar7263a772007-05-10 17:35:54 +0000313syn match shSpecial "^\%(\\\\\)*\\[\\"'`$()#]"
Bram Moolenaar5c736222010-01-06 20:54:52 +0100314syn match shMoreSpecial "\%(\\\\\)*\\[\\"'`$()#]" nextgroup=shMoreSpecial contained
Bram Moolenaar071d4272004-06-13 20:20:40 +0000315
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000316" Comments: {{{1
317"==========
Bram Moolenaar5c736222010-01-06 20:54:52 +0100318syn cluster shCommentGroup contains=shTodo,@Spell
319syn keyword shTodo contained COMBAK FIXME TODO XXX
320syn match shComment "^\s*\zs#.*$" contains=@shCommentGroup
321syn match shComment "\s\zs#.*$" contains=@shCommentGroup
322syn match shQuickComment contained "#.*$"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000323
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000324" Here Documents: {{{1
325" =========================================
Bram Moolenaar071d4272004-06-13 20:20:40 +0000326if version < 600
327 syn region shHereDoc matchgroup=shRedir start="<<\s*\**END[a-zA-Z_0-9]*\**" matchgroup=shRedir end="^END[a-zA-Z_0-9]*$" contains=@shDblQuoteList
328 syn region shHereDoc matchgroup=shRedir start="<<-\s*\**END[a-zA-Z_0-9]*\**" matchgroup=shRedir end="^\s*END[a-zA-Z_0-9]*$" contains=@shDblQuoteList
329 syn region shHereDoc matchgroup=shRedir start="<<\s*\**EOF\**" matchgroup=shRedir end="^EOF$" contains=@shDblQuoteList
330 syn region shHereDoc matchgroup=shRedir start="<<-\s*\**EOF\**" matchgroup=shRedir end="^\s*EOF$" contains=@shDblQuoteList
331 syn region shHereDoc matchgroup=shRedir start="<<\s*\**\.\**" matchgroup=shRedir end="^\.$" contains=@shDblQuoteList
332 syn region shHereDoc matchgroup=shRedir start="<<-\s*\**\.\**" matchgroup=shRedir end="^\s*\.$" contains=@shDblQuoteList
333
Bram Moolenaarc236c162008-07-13 17:41:49 +0000334elseif (g:sh_fold_enabled % (s:sh_fold_heredoc * 2))/s:sh_fold_heredoc
Bram Moolenaar9964e462007-05-05 17:54:07 +0000335 syn region shHereDoc matchgroup=shRedir fold start="<<\s*\z(\S*\)" matchgroup=shRedir end="^\z1\s*$" contains=@shDblQuoteList
Bram Moolenaarcd71fa32005-03-11 22:46:48 +0000336 syn region shHereDoc matchgroup=shRedir fold start="<<\s*\"\z(\S*\)\"" matchgroup=shRedir end="^\z1\s*$"
337 syn region shHereDoc matchgroup=shRedir fold start="<<\s*'\z(\S*\)'" matchgroup=shRedir end="^\z1\s*$"
338 syn region shHereDoc matchgroup=shRedir fold start="<<-\s*\z(\S*\)" matchgroup=shRedir end="^\s*\z1\s*$" contains=@shDblQuoteList
339 syn region shHereDoc matchgroup=shRedir fold start="<<-\s*\"\z(\S*\)\"" matchgroup=shRedir end="^\s*\z1\s*$"
340 syn region shHereDoc matchgroup=shRedir fold start="<<-\s*'\z(\S*\)'" matchgroup=shRedir end="^\s*\z1\s*$"
341 syn region shHereDoc matchgroup=shRedir fold start="<<\s*\\\_$\_s*\z(\S*\)" matchgroup=shRedir end="^\z1\s*$"
342 syn region shHereDoc matchgroup=shRedir fold start="<<\s*\\\_$\_s*\"\z(\S*\)\"" matchgroup=shRedir end="^\z1\s*$"
343 syn region shHereDoc matchgroup=shRedir fold start="<<-\s*\\\_$\_s*'\z(\S*\)'" matchgroup=shRedir end="^\s*\z1\s*$"
344 syn region shHereDoc matchgroup=shRedir fold start="<<-\s*\\\_$\_s*\z(\S*\)" matchgroup=shRedir end="^\s*\z1\s*$"
345 syn region shHereDoc matchgroup=shRedir fold start="<<-\s*\\\_$\_s*\"\z(\S*\)\"" matchgroup=shRedir end="^\s*\z1\s*$"
346 syn region shHereDoc matchgroup=shRedir fold start="<<\s*\\\_$\_s*'\z(\S*\)'" matchgroup=shRedir end="^\z1\s*$"
Bram Moolenaar9964e462007-05-05 17:54:07 +0000347 syn region shHereDoc matchgroup=shRedir fold start="<<\\\z(\S*\)" matchgroup=shRedir end="^\z1\s*$"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000348
Bram Moolenaar071d4272004-06-13 20:20:40 +0000349else
Bram Moolenaarcd71fa32005-03-11 22:46:48 +0000350 syn region shHereDoc matchgroup=shRedir start="<<\s*\\\=\z(\S*\)" matchgroup=shRedir end="^\z1\s*$" contains=@shDblQuoteList
351 syn region shHereDoc matchgroup=shRedir start="<<\s*\"\z(\S*\)\"" matchgroup=shRedir end="^\z1\s*$"
352 syn region shHereDoc matchgroup=shRedir start="<<-\s*\z(\S*\)" matchgroup=shRedir end="^\s*\z1\s*$" contains=@shDblQuoteList
353 syn region shHereDoc matchgroup=shRedir start="<<-\s*'\z(\S*\)'" matchgroup=shRedir end="^\s*\z1\s*$"
354 syn region shHereDoc matchgroup=shRedir start="<<\s*'\z(\S*\)'" matchgroup=shRedir end="^\z1\s*$"
355 syn region shHereDoc matchgroup=shRedir start="<<-\s*\"\z(\S*\)\"" matchgroup=shRedir end="^\s*\z1\s*$"
356 syn region shHereDoc matchgroup=shRedir start="<<\s*\\\_$\_s*\z(\S*\)" matchgroup=shRedir end="^\z1\s*$"
357 syn region shHereDoc matchgroup=shRedir start="<<-\s*\\\_$\_s*\z(\S*\)" matchgroup=shRedir end="^\s*\z1\s*$"
358 syn region shHereDoc matchgroup=shRedir start="<<-\s*\\\_$\_s*'\z(\S*\)'" matchgroup=shRedir end="^\s*\z1\s*$"
359 syn region shHereDoc matchgroup=shRedir start="<<\s*\\\_$\_s*'\z(\S*\)'" matchgroup=shRedir end="^\z1\s*$"
360 syn region shHereDoc matchgroup=shRedir start="<<\s*\\\_$\_s*\"\z(\S*\)\"" matchgroup=shRedir end="^\z1\s*$"
361 syn region shHereDoc matchgroup=shRedir start="<<-\s*\\\_$\_s*\"\z(\S*\)\"" matchgroup=shRedir end="^\s*\z1\s*$"
Bram Moolenaar9964e462007-05-05 17:54:07 +0000362 syn region shHereDoc matchgroup=shRedir start="<<\\\z(\S*\)" matchgroup=shRedir end="^\z1\s*$"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000363endif
364
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000365" Here Strings: {{{1
366" =============
Bram Moolenaard960d762011-09-21 19:22:10 +0200367" available for: bash; ksh (really should be ksh93 only) but not if its a posix
368if exists("b:is_bash") || (exists("b:is_kornshell") && !exists("g:is_posix"))
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000369 syn match shRedir "<<<"
370endif
371
372" Identifiers: {{{1
373"=============
Bram Moolenaarc236c162008-07-13 17:41:49 +0000374syn match shSetOption "\s\zs[-+][a-zA-Z0-9]\+\>" contained
375syn match shVariable "\<\([bwglsav]:\)\=[a-zA-Z0-9.!@_%+,]*\ze=" nextgroup=shSetIdentifier
Bram Moolenaare90ee312010-08-05 22:08:47 +0200376syn match shSetIdentifier "=" contained nextgroup=shPattern,shDeref,shDerefSimple,shDoubleQuote,shExDoubleQuote,shSingleQuote,shExSingleQuote
Bram Moolenaar071d4272004-06-13 20:20:40 +0000377if exists("b:is_bash")
Bram Moolenaar4b22cdb2010-08-02 22:12:46 +0200378 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
379 syn region shSetList oneline matchgroup=shSet start="\<set\>\ze[^/]" end="\ze[;|)]\|$" matchgroup=shSetListDelim end="\ze[}|);&]" matchgroup=NONE end="\ze\s\+[#=]" contains=@shIdList
Bram Moolenaar071d4272004-06-13 20:20:40 +0000380elseif exists("b:is_kornshell")
Bram Moolenaar4b22cdb2010-08-02 22:12:46 +0200381 syn region shSetList oneline matchgroup=shSet start="\<\(typeset\|export\|unset\)\>\ze[^/]" end="$" matchgroup=shSetListDelim end="\ze[}|);&]" matchgroup=NONE end="\ze\s\+[#=]" contains=@shIdList
382 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 +0000383else
Bram Moolenaar4b22cdb2010-08-02 22:12:46 +0200384 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 +0000385endif
386
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000387" Functions: {{{1
Bram Moolenaarc236c162008-07-13 17:41:49 +0000388if !exists("g:is_posix")
389 syn keyword shFunctionKey function skipwhite skipnl nextgroup=shFunctionTwo
390endif
391
392if exists("b:is_bash")
393 if (g:sh_fold_enabled % (s:sh_fold_functions * 2))/s:sh_fold_functions
394 syn region shFunctionOne fold matchgroup=shFunction start="^\s*\h[-a-zA-Z_0-9]*\s*()\_s*{" end="}" contains=@shFunctionList skipwhite skipnl nextgroup=shFunctionStart,shQuickComment
395 syn region shFunctionTwo fold matchgroup=shFunction start="\h[-a-zA-Z_0-9]*\s*\%(()\)\=\_s*{" end="}" contains=shFunctionKey,@shFunctionList contained skipwhite skipnl nextgroup=shFunctionStart,shQuickComment
396 else
397 syn region shFunctionOne matchgroup=shFunction start="^\s*\h[-a-zA-Z_0-9]*\s*()\_s*{" end="}" contains=@shFunctionList
398 syn region shFunctionTwo matchgroup=shFunction start="\h[-a-zA-Z_0-9]*\s*\%(()\)\=\_s*{" end="}" contains=shFunctionKey,@shFunctionList contained
399 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000400else
Bram Moolenaarc236c162008-07-13 17:41:49 +0000401 if (g:sh_fold_enabled % (s:sh_fold_functions * 2))/s:sh_fold_functions
402 syn region shFunctionOne fold matchgroup=shFunction start="^\s*\h\w*\s*()\_s*{" end="}" contains=@shFunctionList skipwhite skipnl nextgroup=shFunctionStart,shQuickComment
403 syn region shFunctionTwo fold matchgroup=shFunction start="\h\w*\s*\%(()\)\=\_s*{" end="}" contains=shFunctionKey,@shFunctionList contained skipwhite skipnl nextgroup=shFunctionStart,shQuickComment
404 else
405 syn region shFunctionOne matchgroup=shFunction start="^\s*\h\w*\s*()\_s*{" end="}" contains=@shFunctionList
406 syn region shFunctionTwo matchgroup=shFunction start="\h\w*\s*\%(()\)\=\_s*{" end="}" contains=shFunctionKey,@shFunctionList contained
407 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000408endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000409
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000410" Parameter Dereferencing: {{{1
411" ========================
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000412syn match shDerefSimple "\$\%(\h\w*\|\d\)"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000413syn region shDeref matchgroup=PreProc start="\${" end="}" contains=@shDerefList,shDerefVarArray
Bram Moolenaar6be7f872012-01-20 21:08:56 +0100414if !exists("g:sh_no_error")
415 syn match shDerefWordError "[^}$[]" contained
416endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000417syn match shDerefSimple "\$[-#*@!?]"
418syn match shDerefSimple "\$\$"
419if exists("b:is_bash") || exists("b:is_kornshell")
420 syn region shDeref matchgroup=PreProc start="\${##\=" end="}" contains=@shDerefList
Bram Moolenaarc236c162008-07-13 17:41:49 +0000421 syn region shDeref matchgroup=PreProc start="\${\$\$" end="}" contains=@shDerefList
Bram Moolenaar071d4272004-06-13 20:20:40 +0000422endif
423
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000424" bash: ${!prefix*} and ${#parameter}: {{{1
425" ====================================
Bram Moolenaar071d4272004-06-13 20:20:40 +0000426if exists("b:is_bash")
427 syn region shDeref matchgroup=PreProc start="\${!" end="\*\=}" contains=@shDerefList,shDerefOp
428 syn match shDerefVar contained "{\@<=!\w\+" nextgroup=@shDerefVarList
429endif
430
431syn match shDerefSpecial contained "{\@<=[-*@?0]" nextgroup=shDerefOp,shDerefOpError
432syn match shDerefSpecial contained "\({[#!]\)\@<=[[:alnum:]*@_]\+" nextgroup=@shDerefVarList,shDerefOp
433syn match shDerefVar contained "{\@<=\w\+" nextgroup=@shDerefVarList
434
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000435" sh ksh bash : ${var[... ]...} array reference: {{{1
Bram Moolenaar071d4272004-06-13 20:20:40 +0000436syn region shDerefVarArray contained matchgroup=shDeref start="\[" end="]" contains=@shCommandSubList nextgroup=shDerefOp,shDerefOpError
437
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000438" Special ${parameter OPERATOR word} handling: {{{1
Bram Moolenaar071d4272004-06-13 20:20:40 +0000439" sh ksh bash : ${parameter:-word} word is default value
440" sh ksh bash : ${parameter:=word} assign word as default value
441" sh ksh bash : ${parameter:?word} display word if parameter is null
442" sh ksh bash : ${parameter:+word} use word if parameter is not null, otherwise nothing
443" ksh bash : ${parameter#pattern} remove small left pattern
444" ksh bash : ${parameter##pattern} remove large left pattern
445" ksh bash : ${parameter%pattern} remove small right pattern
446" ksh bash : ${parameter%%pattern} remove large right pattern
Bram Moolenaard960d762011-09-21 19:22:10 +0200447" bash : ${parameter^pattern} Case modification
448" bash : ${parameter^^pattern} Case modification
449" bash : ${parameter,pattern} Case modification
450" bash : ${parameter,,pattern} Case modification
Bram Moolenaar071d4272004-06-13 20:20:40 +0000451syn cluster shDerefPatternList contains=shDerefPattern,shDerefString
Bram Moolenaar6be7f872012-01-20 21:08:56 +0100452if !exists("g:sh_no_error")
453 syn match shDerefOpError contained ":[[:punct:]]"
454endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000455syn match shDerefOp contained ":\=[-=?]" nextgroup=@shDerefPatternList
456syn match shDerefOp contained ":\=+" nextgroup=@shDerefPatternList
457if exists("b:is_bash") || exists("b:is_kornshell")
458 syn match shDerefOp contained "#\{1,2}" nextgroup=@shDerefPatternList
459 syn match shDerefOp contained "%\{1,2}" nextgroup=@shDerefPatternList
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +0000460 syn match shDerefPattern contained "[^{}]\+" contains=shDeref,shDerefSimple,shDerefPattern,shDerefString,shCommandSub,shDerefEscape nextgroup=shDerefPattern
Bram Moolenaar071d4272004-06-13 20:20:40 +0000461 syn region shDerefPattern contained start="{" end="}" contains=shDeref,shDerefSimple,shDerefString,shCommandSub nextgroup=shDerefPattern
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +0000462 syn match shDerefEscape contained '\%(\\\\\)*\\.'
Bram Moolenaar071d4272004-06-13 20:20:40 +0000463endif
Bram Moolenaard960d762011-09-21 19:22:10 +0200464if exists("b:is_bash")
465 syn match shDerefOp contained "[,^]\{1,2}" nextgroup=@shDerefPatternList
466endif
Bram Moolenaar4b22cdb2010-08-02 22:12:46 +0200467syn region shDerefString contained matchgroup=shDerefDelim start=+\%(\\\)\@<!'+ end=+'+ contains=shStringSpecial
468syn region shDerefString contained matchgroup=shDerefDelim start=+\%(\\\)\@<!"+ skip=+\\"+ end=+"+ contains=@shDblQuoteList,shStringSpecial
Bram Moolenaarc236c162008-07-13 17:41:49 +0000469syn match shDerefString contained "\\["']" nextgroup=shDerefPattern
Bram Moolenaar071d4272004-06-13 20:20:40 +0000470
Bram Moolenaar071d4272004-06-13 20:20:40 +0000471if exists("b:is_bash")
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +0000472 " bash : ${parameter:offset}
473 " bash : ${parameter:offset:length}
Bram Moolenaar071d4272004-06-13 20:20:40 +0000474 syn region shDerefOp contained start=":[$[:alnum:]_]"me=e-1 end=":"me=e-1 end="}"me=e-1 contains=@shCommandSubList nextgroup=shDerefPOL
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +0000475 syn match shDerefPOL contained ":[^}]\+" contains=@shCommandSubList
476
477 " bash : ${parameter//pattern/string}
478 " bash : ${parameter//pattern}
479 syn match shDerefPPS contained '/\{1,2}' nextgroup=shDerefPPSleft
Bram Moolenaara5792f52005-11-23 21:25:05 +0000480 syn region shDerefPPSleft contained start='.' skip=@\%(\\\)\/@ matchgroup=shDerefOp end='/' end='\ze}' nextgroup=shDerefPPSright contains=@shCommandSubList
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +0000481 syn region shDerefPPSright contained start='.' end='\ze}' contains=@shCommandSubList
Bram Moolenaar071d4272004-06-13 20:20:40 +0000482endif
483
Bram Moolenaarc236c162008-07-13 17:41:49 +0000484" Arithmetic Parenthesized Expressions: {{{1
Bram Moolenaard960d762011-09-21 19:22:10 +0200485syn region shParen matchgroup=shArithRegion start='(\%(\ze[^(]\|$\)' end=')' contains=@shArithParenList
Bram Moolenaarc236c162008-07-13 17:41:49 +0000486
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000487" Useful sh Keywords: {{{1
488" ===================
Bram Moolenaar071d4272004-06-13 20:20:40 +0000489syn keyword shStatement break cd chdir continue eval exec exit kill newgrp pwd read readonly return shift test trap ulimit umask wait
490syn keyword shConditional contained elif else then
Bram Moolenaar6be7f872012-01-20 21:08:56 +0100491if !exists("g:sh_no_error")
492 syn keyword shCondError elif else then
493endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000494
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000495" Useful ksh Keywords: {{{1
496" ====================
Bram Moolenaar071d4272004-06-13 20:20:40 +0000497if exists("b:is_kornshell") || exists("b:is_bash")
Bram Moolenaar4b22cdb2010-08-02 22:12:46 +0200498 syn keyword shStatement autoload bg false fc fg functions getopts hash history integer jobs let nohup printf r stop suspend times true type unalias whence
Bram Moolenaarc236c162008-07-13 17:41:49 +0000499 if exists("g:is_posix")
500 syn keyword shStatement command
501 else
502 syn keyword shStatement time
503 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000504
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000505" Useful bash Keywords: {{{1
506" =====================
Bram Moolenaar071d4272004-06-13 20:20:40 +0000507 if exists("b:is_bash")
508 syn keyword shStatement bind builtin dirs disown enable help local logout popd pushd shopt source
509 else
510 syn keyword shStatement login newgrp
511 endif
512endif
513
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000514" Synchronization: {{{1
515" ================
Bram Moolenaar071d4272004-06-13 20:20:40 +0000516if !exists("sh_minlines")
517 let sh_minlines = 200
518endif
519if !exists("sh_maxlines")
520 let sh_maxlines = 2 * sh_minlines
521endif
522exec "syn sync minlines=" . sh_minlines . " maxlines=" . sh_maxlines
523syn sync match shCaseEsacSync grouphere shCaseEsac "\<case\>"
524syn sync match shCaseEsacSync groupthere shCaseEsac "\<esac\>"
525syn sync match shDoSync grouphere shDo "\<do\>"
526syn sync match shDoSync groupthere shDo "\<done\>"
527syn sync match shForSync grouphere shFor "\<for\>"
528syn sync match shForSync groupthere shFor "\<in\>"
529syn sync match shIfSync grouphere shIf "\<if\>"
530syn sync match shIfSync groupthere shIf "\<fi\>"
531syn sync match shUntilSync grouphere shRepeat "\<until\>"
532syn sync match shWhileSync grouphere shRepeat "\<while\>"
533
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000534" Default Highlighting: {{{1
535" =====================
Bram Moolenaar071d4272004-06-13 20:20:40 +0000536hi def link shArithRegion shShellVariables
Bram Moolenaardf177f62005-02-22 08:39:57 +0000537hi def link shBeginHere shRedir
Bram Moolenaar071d4272004-06-13 20:20:40 +0000538hi def link shCaseBar shConditional
Bram Moolenaar071d4272004-06-13 20:20:40 +0000539hi def link shCaseCommandSub shCommandSub
540hi def link shCaseDoubleQuote shDoubleQuote
Bram Moolenaardf177f62005-02-22 08:39:57 +0000541hi def link shCaseIn shConditional
Bram Moolenaar4b22cdb2010-08-02 22:12:46 +0200542hi def link shQuote shOperator
Bram Moolenaar071d4272004-06-13 20:20:40 +0000543hi def link shCaseSingleQuote shSingleQuote
544hi def link shCaseStart shConditional
545hi def link shCmdSubRegion shShellVariables
Bram Moolenaar5c736222010-01-06 20:54:52 +0100546hi def link shColon shComment
Bram Moolenaar071d4272004-06-13 20:20:40 +0000547hi def link shDerefOp shOperator
Bram Moolenaardf177f62005-02-22 08:39:57 +0000548hi def link shDerefPOL shDerefOp
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +0000549hi def link shDerefPPS shDerefOp
Bram Moolenaardf177f62005-02-22 08:39:57 +0000550hi def link shDeref shShellVariables
Bram Moolenaar4b22cdb2010-08-02 22:12:46 +0200551hi def link shDerefDelim shOperator
Bram Moolenaar071d4272004-06-13 20:20:40 +0000552hi def link shDerefSimple shDeref
553hi def link shDerefSpecial shDeref
554hi def link shDerefString shDoubleQuote
Bram Moolenaardf177f62005-02-22 08:39:57 +0000555hi def link shDerefVar shDeref
Bram Moolenaar071d4272004-06-13 20:20:40 +0000556hi def link shDoubleQuote shString
557hi def link shEcho shString
Bram Moolenaar4b22cdb2010-08-02 22:12:46 +0200558hi def link shEchoDelim shOperator
Bram Moolenaarc236c162008-07-13 17:41:49 +0000559hi def link shEchoQuote shString
Bram Moolenaar071d4272004-06-13 20:20:40 +0000560hi def link shEmbeddedEcho shString
Bram Moolenaarc236c162008-07-13 17:41:49 +0000561hi def link shEscape shCommandSub
Bram Moolenaare90ee312010-08-05 22:08:47 +0200562hi def link shExDoubleQuote shDoubleQuote
Bram Moolenaardf177f62005-02-22 08:39:57 +0000563hi def link shExSingleQuote shSingleQuote
Bram Moolenaarc236c162008-07-13 17:41:49 +0000564hi def link shFunction Function
Bram Moolenaar071d4272004-06-13 20:20:40 +0000565hi def link shHereDoc shString
Bram Moolenaardf177f62005-02-22 08:39:57 +0000566hi def link shHerePayload shHereDoc
Bram Moolenaar071d4272004-06-13 20:20:40 +0000567hi def link shLoop shStatement
Bram Moolenaar5c736222010-01-06 20:54:52 +0100568hi def link shMoreSpecial shSpecial
Bram Moolenaar071d4272004-06-13 20:20:40 +0000569hi def link shOption shCommandSub
570hi def link shPattern shString
Bram Moolenaarc236c162008-07-13 17:41:49 +0000571hi def link shParen shArithmetic
Bram Moolenaar071d4272004-06-13 20:20:40 +0000572hi def link shPosnParm shShellVariables
Bram Moolenaarc236c162008-07-13 17:41:49 +0000573hi def link shQuickComment shComment
Bram Moolenaar071d4272004-06-13 20:20:40 +0000574hi def link shRange shOperator
575hi def link shRedir shOperator
Bram Moolenaar4b22cdb2010-08-02 22:12:46 +0200576hi def link shSetListDelim shOperator
Bram Moolenaarc236c162008-07-13 17:41:49 +0000577hi def link shSetOption shOption
Bram Moolenaar071d4272004-06-13 20:20:40 +0000578hi def link shSingleQuote shString
579hi def link shSource shOperator
580hi def link shStringSpecial shSpecial
581hi def link shSubShRegion shOperator
582hi def link shTestOpr shConditional
Bram Moolenaar9964e462007-05-05 17:54:07 +0000583hi def link shTestPattern shString
584hi def link shTestDoubleQuote shString
585hi def link shTestSingleQuote shString
Bram Moolenaar071d4272004-06-13 20:20:40 +0000586hi def link shVariable shSetList
587hi def link shWrapLineOperator shOperator
588
589if exists("b:is_bash")
590 hi def link bashAdminStatement shStatement
591 hi def link bashSpecialVariables shShellVariables
592 hi def link bashStatement shStatement
Bram Moolenaarcd71fa32005-03-11 22:46:48 +0000593 hi def link shFunctionParen Delimiter
594 hi def link shFunctionDelim Delimiter
Bram Moolenaar071d4272004-06-13 20:20:40 +0000595endif
596if exists("b:is_kornshell")
597 hi def link kshSpecialVariables shShellVariables
598 hi def link kshStatement shStatement
Bram Moolenaarcd71fa32005-03-11 22:46:48 +0000599 hi def link shFunctionParen Delimiter
Bram Moolenaar071d4272004-06-13 20:20:40 +0000600endif
601
Bram Moolenaar6be7f872012-01-20 21:08:56 +0100602if !exists("g:sh_no_error")
603 hi def link shCaseError Error
604 hi def link shCondError Error
605 hi def link shCurlyError Error
606 hi def link shDerefError Error
607 hi def link shDerefOpError Error
608 hi def link shDerefWordError Error
609 hi def link shDoError Error
610 hi def link shEsacError Error
611 hi def link shIfError Error
612 hi def link shInError Error
613 hi def link shParenError Error
614 hi def link shTestError Error
615 if exists("b:is_kornshell")
616 hi def link shDTestError Error
617 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000618endif
619
620hi def link shArithmetic Special
621hi def link shCharClass Identifier
622hi def link shSnglCase Statement
623hi def link shCommandSub Special
624hi def link shComment Comment
625hi def link shConditional Conditional
Bram Moolenaar9964e462007-05-05 17:54:07 +0000626hi def link shCtrlSeq Special
Bram Moolenaar071d4272004-06-13 20:20:40 +0000627hi def link shExprRegion Delimiter
Bram Moolenaarcd71fa32005-03-11 22:46:48 +0000628hi def link shFunctionKey Function
Bram Moolenaar071d4272004-06-13 20:20:40 +0000629hi def link shFunctionName Function
630hi def link shNumber Number
631hi def link shOperator Operator
632hi def link shRepeat Repeat
633hi def link shSet Statement
634hi def link shSetList Identifier
635hi def link shShellVariables PreProc
636hi def link shSpecial Special
637hi def link shStatement Statement
638hi def link shString String
639hi def link shTodo Todo
640hi def link shAlias Identifier
641
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000642" Set Current Syntax: {{{1
643" ===================
Bram Moolenaar071d4272004-06-13 20:20:40 +0000644if exists("b:is_bash")
645 let b:current_syntax = "bash"
646elseif exists("b:is_kornshell")
647 let b:current_syntax = "ksh"
648else
649 let b:current_syntax = "sh"
650endif
651
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000652" vim: ts=16 fdm=marker