blob: 681ca3a45f5f93ede3c080d98b9bb896b987e0a2 [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 Moolenaar4b22cdb2010-08-02 22:12:46 +02005" Last Change: Jul 29, 2010
6" Version: 113
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 Moolenaard4755bb2004-09-02 19:12:26 +000019" handling /bin/sh with is_kornshell/is_sh {{{1
Bram Moolenaar071d4272004-06-13 20:20:40 +000020" b:is_sh is set when "#! /bin/sh" is found;
21" However, it often is just a masquerade by bash (typically Linux)
22" or kornshell (typically workstations with Posix "sh").
23" So, when the user sets "is_bash" or "is_kornshell",
24" a b:is_sh is converted into b:is_bash/b:is_kornshell,
25" respectively.
26if !exists("b:is_kornshell") && !exists("b:is_bash")
Bram Moolenaar7fc904b2006-04-13 20:37:35 +000027 if exists("g:is_posix") && !exists("g:is_kornshell")
28 let g:is_kornshell= g:is_posix
29 endif
30 if exists("g:is_kornshell")
Bram Moolenaar071d4272004-06-13 20:20:40 +000031 let b:is_kornshell= 1
32 if exists("b:is_sh")
33 unlet b:is_sh
34 endif
Bram Moolenaar7fc904b2006-04-13 20:37:35 +000035 elseif exists("g:is_bash")
Bram Moolenaar071d4272004-06-13 20:20:40 +000036 let b:is_bash= 1
37 if exists("b:is_sh")
38 unlet b:is_sh
39 endif
40 else
41 let b:is_sh= 1
42 endif
43endif
44
Bram Moolenaarcd71fa32005-03-11 22:46:48 +000045" set up default g:sh_fold_enabled {{{1
Bram Moolenaar071d4272004-06-13 20:20:40 +000046if !exists("g:sh_fold_enabled")
47 let g:sh_fold_enabled= 0
Bram Moolenaar293ee4d2004-12-09 21:34:53 +000048elseif g:sh_fold_enabled != 0 && !has("folding")
49 let g:sh_fold_enabled= 0
Bram Moolenaarcd71fa32005-03-11 22:46:48 +000050 echomsg "Ignoring g:sh_fold_enabled=".g:sh_fold_enabled."; need to re-compile vim for +fold support"
51endif
Bram Moolenaarc236c162008-07-13 17:41:49 +000052if !exists("s:sh_fold_functions")
53 let s:sh_fold_functions = 1
54endif
55if !exists("s:sh_fold_heredoc")
56 let s:sh_fold_heredoc = 2
57endif
58if !exists("s:sh_fold_ifdofor")
59 let s:sh_fold_ifdofor = 4
60endif
Bram Moolenaarcd71fa32005-03-11 22:46:48 +000061if g:sh_fold_enabled && &fdm == "manual"
Bram Moolenaar00a927d2010-05-14 23:24:24 +020062 setlocal fdm=syntax
Bram Moolenaar071d4272004-06-13 20:20:40 +000063endif
64
Bram Moolenaarcd71fa32005-03-11 22:46:48 +000065" sh syntax is case sensitive {{{1
Bram Moolenaar071d4272004-06-13 20:20:40 +000066syn case match
67
Bram Moolenaard4755bb2004-09-02 19:12:26 +000068" Clusters: contains=@... clusters {{{1
Bram Moolenaar071d4272004-06-13 20:20:40 +000069"==================================
Bram Moolenaar5c736222010-01-06 20:54:52 +010070syn cluster shErrorList contains=shDoError,shIfError,shInError,shCaseError,shEsacError,shCurlyError,shParenError,shTestError,shOK
Bram Moolenaarc236c162008-07-13 17:41:49 +000071if exists("b:is_kornshell")
72 syn cluster ErrorList add=shDTestError
73endif
Bram Moolenaar5c736222010-01-06 20:54:52 +010074syn cluster shArithParenList contains=shArithmetic,shCaseEsac,shDeref,shDerefSimple,shEcho,shEscape,shNumber,shOperator,shPosnParm,shExSingleQuote,shRedir,shSingleQuote,shDoubleQuote,shStatement,shVariable,shAlias,shTest,shCtrlSeq,shSpecial,shParen,bashSpecialVariables,bashStatement
Bram Moolenaarc236c162008-07-13 17:41:49 +000075syn cluster shArithList contains=@shArithParenList,shParenError
Bram Moolenaar5c736222010-01-06 20:54:52 +010076syn cluster shCaseEsacList contains=shCaseStart,shCase,shCaseBar,shCaseIn,shComment,shDeref,shDerefSimple,shCaseCommandSub,shCaseExSingleQuote,shCaseSingleQuote,shCaseDoubleQuote,shCtrlSeq,@shErrorList,shStringSpecial,shCaseRange
Bram Moolenaar9964e462007-05-05 17:54:07 +000077syn cluster shCaseList contains=@shCommandSubList,shCaseEsac,shColon,shCommandSub,shCommandSub,shComment,shDo,shEcho,shExpr,shFor,shHereDoc,shIf,shRedir,shSetList,shSource,shStatement,shVariable,shCtrlSeq
Bram Moolenaar071d4272004-06-13 20:20:40 +000078syn cluster shColonList contains=@shCaseList
Bram Moolenaarc236c162008-07-13 17:41:49 +000079syn cluster shCommandSubList contains=shArithmetic,shDeref,shDerefSimple,shEscape,shNumber,shOperator,shPosnParm,shExSingleQuote,shSingleQuote,shDoubleQuote,shStatement,shVariable,shSubSh,shAlias,shTest,shCtrlSeq,shSpecial
Bram Moolenaar572cb562005-08-05 21:35:02 +000080syn cluster shCurlyList contains=shNumber,shComma,shDeref,shDerefSimple,shDerefSpecial
Bram Moolenaar7263a772007-05-10 17:35:54 +000081syn cluster shDblQuoteList contains=shCommandSub,shDeref,shDerefSimple,shPosnParm,shExSingleQuote,shCtrlSeq,shSpecial
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +000082syn cluster shDerefList contains=shDeref,shDerefSimple,shDerefVar,shDerefSpecial,shDerefWordError,shDerefPPS
Bram Moolenaar071d4272004-06-13 20:20:40 +000083syn cluster shDerefVarList contains=shDerefOp,shDerefVarArray,shDerefOpError
Bram Moolenaarc236c162008-07-13 17:41:49 +000084syn cluster shEchoList contains=shArithmetic,shCommandSub,shDeref,shDerefSimple,shExpr,shExSingleQuote,shSingleQuote,shDoubleQuote,shCtrlSeq,shEchoQuote
Bram Moolenaar9964e462007-05-05 17:54:07 +000085syn cluster shExprList1 contains=shCharClass,shNumber,shOperator,shExSingleQuote,shSingleQuote,shDoubleQuote,shExpr,shDblBrace,shDeref,shDerefSimple,shCtrlSeq
Bram Moolenaar383f9bc2005-01-19 22:18:32 +000086syn cluster shExprList2 contains=@shExprList1,@shCaseList,shTest
Bram Moolenaar5c736222010-01-06 20:54:52 +010087syn cluster shFunctionList contains=@shCommandSubList,shCaseEsac,shColon,shCommandSub,shCommandSub,shComment,shDo,shEcho,shExpr,shFor,shHereDoc,shIf,shOption,shRedir,shSetList,shSource,shStatement,shVariable,shOperator,shCtrlSeq
Bram Moolenaar7263a772007-05-10 17:35:54 +000088if exists("b:is_kornshell") || exists("b:is_bash")
Bram Moolenaarc236c162008-07-13 17:41:49 +000089 syn cluster shFunctionList add=shRepeat
Bram Moolenaar7263a772007-05-10 17:35:54 +000090 syn cluster shFunctionList add=shDblBrace,shDblParen
91endif
Bram Moolenaar071d4272004-06-13 20:20:40 +000092syn cluster shHereBeginList contains=@shCommandSubList
93syn cluster shHereList contains=shBeginHere,shHerePayload
94syn cluster shHereListDQ contains=shBeginHere,@shDblQuoteList,shHerePayload
Bram Moolenaarc236c162008-07-13 17:41:49 +000095syn cluster shIdList contains=shCommandSub,shWrapLineOperator,shSetOption,shDeref,shDerefSimple,shRedir,shExSingleQuote,shSingleQuote,shDoubleQuote,shExpr,shCtrlSeq,shStringSpecial
96syn cluster shLoopList contains=@shCaseList,shTestOpr,shExpr,shDblBrace,shConditional,shCaseEsac,shTest,@shErrorList,shSet
Bram Moolenaar5c736222010-01-06 20:54:52 +010097syn cluster shSubShList contains=@shCommandSubList,shCaseEsac,shColon,shCommandSub,shCommandSub,shComment,shDo,shEcho,shExpr,shFor,shIf,shRedir,shSetList,shSource,shStatement,shVariable,shCtrlSeq,shOperator
Bram Moolenaar9964e462007-05-05 17:54:07 +000098syn cluster shTestList contains=shCharClass,shComment,shCommandSub,shDeref,shDerefSimple,shDoubleQuote,shExpr,shExpr,shNumber,shOperator,shExSingleQuote,shSingleQuote,shTestOpr,shTest,shCtrlSeq
Bram Moolenaar071d4272004-06-13 20:20:40 +000099
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000100" Echo: {{{1
Bram Moolenaar071d4272004-06-13 20:20:40 +0000101" ====
102" This one is needed INSIDE a CommandSub, so that `echo bla` be correct
Bram Moolenaar4b22cdb2010-08-02 22:12:46 +0200103syn 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
104syn 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 +0100105syn match shEchoQuote contained '\%(\\\\\)*\\["`'()]'
Bram Moolenaar071d4272004-06-13 20:20:40 +0000106
Bram Moolenaarc236c162008-07-13 17:41:49 +0000107" This must be after the strings, so that ... \" will be correct
Bram Moolenaar4b22cdb2010-08-02 22:12:46 +0200108syn 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,shDoubleQuote,shCharClass,shCtrlSeq
Bram Moolenaar071d4272004-06-13 20:20:40 +0000109
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000110" Alias: {{{1
Bram Moolenaar071d4272004-06-13 20:20:40 +0000111" =====
112if exists("b:is_kornshell") || exists("b:is_bash")
113 syn match shStatement "\<alias\>"
114 syn region shAlias matchgroup=shStatement start="\<alias\>\s\+\(\w\+\)\@=" skip="\\$" end="\>\|`"
115 syn region shAlias matchgroup=shStatement start="\<alias\>\s\+\(\w\+=\)\@=" skip="\\$" end="="
116endif
117
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000118" Error Codes: {{{1
119" ============
Bram Moolenaar071d4272004-06-13 20:20:40 +0000120syn match shDoError "\<done\>"
121syn match shIfError "\<fi\>"
122syn match shInError "\<in\>"
123syn match shCaseError ";;"
124syn match shEsacError "\<esac\>"
125syn match shCurlyError "}"
126syn match shParenError ")"
Bram Moolenaar5c736222010-01-06 20:54:52 +0100127syn match shOK '\.\(done\|fi\|in\|esac\)'
Bram Moolenaar071d4272004-06-13 20:20:40 +0000128if exists("b:is_kornshell")
129 syn match shDTestError "]]"
130endif
131syn match shTestError "]"
132
Bram Moolenaarc236c162008-07-13 17:41:49 +0000133" Options: {{{1
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000134" ====================
Bram Moolenaarfa01c392010-07-20 12:36:02 +0200135syn match shOption "\s\zs[-+][-_a-zA-Z0-9]\+\>"
Bram Moolenaarc236c162008-07-13 17:41:49 +0000136syn match shOption "\s\zs--[^ \t$`'"|]\+"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000137
Bram Moolenaar7263a772007-05-10 17:35:54 +0000138" File Redirection Highlighted As Operators: {{{1
139"===========================================
140syn match shRedir "\d\=>\(&[-0-9]\)\="
141syn match shRedir "\d\=>>-\="
142syn match shRedir "\d\=<\(&[-0-9]\)\="
143syn match shRedir "\d<<-\="
144
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000145" Operators: {{{1
146" ==========
Bram Moolenaar7263a772007-05-10 17:35:54 +0000147syn match shOperator "<<\|>>" contained
Bram Moolenaarc236c162008-07-13 17:41:49 +0000148syn match shOperator "[!&;|]" contained
149syn match shOperator "\[[[^:]\|\]]" contained
Bram Moolenaar071d4272004-06-13 20:20:40 +0000150syn match shOperator "!\==" skipwhite nextgroup=shPattern
Bram Moolenaardf177f62005-02-22 08:39:57 +0000151syn match shPattern "\<\S\+\())\)\@=" contained contains=shExSingleQuote,shSingleQuote,shDoubleQuote,shDeref
Bram Moolenaar071d4272004-06-13 20:20:40 +0000152
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000153" Subshells: {{{1
154" ==========
Bram Moolenaar5c736222010-01-06 20:54:52 +0100155syn region shExpr transparent matchgroup=shExprRegion start="{" end="}" contains=@shExprList2 nextgroup=shMoreSpecial
156syn region shSubSh transparent matchgroup=shSubShRegion start="(" end=")" contains=@shSubShList nextgroup=shMoreSpecial
Bram Moolenaar071d4272004-06-13 20:20:40 +0000157
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000158" Tests: {{{1
159"=======
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200160syn region shExpr matchgroup=shRange start="\[" skip=+\\\\\|\\$\|\[+ end="\]" contains=@shTestList,shSpecial
Bram Moolenaar5c736222010-01-06 20:54:52 +0100161syn 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 +0000162syn match shTestOpr contained "<=\|>=\|!=\|==\|-.\>\|-\(nt\|ot\|ef\|eq\|ne\|lt\|le\|gt\|ge\)\>\|[!<>]"
163syn match shTestOpr contained '=' skipwhite nextgroup=shTestDoubleQuote,shTestSingleQuote,shTestPattern
164syn match shTestPattern contained '\w\+'
165syn match shTestDoubleQuote contained '"[^"]*"'
166syn match shTestSingleQuote contained '\\.'
167syn match shTestSingleQuote contained "'[^']*'"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000168if exists("b:is_kornshell") || exists("b:is_bash")
169 syn region shDblBrace matchgroup=Delimiter start="\[\[" skip=+\\\\\|\\$+ end="\]\]" contains=@shTestList
170 syn region shDblParen matchgroup=Delimiter start="((" skip=+\\\\\|\\$+ end="))" contains=@shTestList
171endif
172
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000173" Character Class In Range: {{{1
174" =========================
Bram Moolenaar071d4272004-06-13 20:20:40 +0000175syn match shCharClass contained "\[:\(backspace\|escape\|return\|xdigit\|alnum\|alpha\|blank\|cntrl\|digit\|graph\|lower\|print\|punct\|space\|upper\|tab\):\]"
176
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000177" Loops: do, if, while, until {{{1
178" ======
Bram Moolenaarc236c162008-07-13 17:41:49 +0000179if (g:sh_fold_enabled % (s:sh_fold_ifdofor * 2))/s:sh_fold_ifdofor
Bram Moolenaar8dff8182006-04-06 20:18:50 +0000180 syn region shDo fold transparent matchgroup=shConditional start="\<do\>" matchgroup=shConditional end="\<done\>" contains=@shLoopList
Bram Moolenaarc236c162008-07-13 17:41:49 +0000181 syn region shIf fold transparent matchgroup=shConditional start="\<if\_s" matchgroup=shConditional end="\<;\_s*then\>" end="\<fi\>" contains=@shLoopList,shDblBrace,shDblParen,shFunctionKey
182 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 +0000183else
184 syn region shDo transparent matchgroup=shConditional start="\<do\>" matchgroup=shConditional end="\<done\>" contains=@shLoopList
Bram Moolenaarc236c162008-07-13 17:41:49 +0000185 syn region shIf transparent matchgroup=shConditional start="\<if\_s" matchgroup=shConditional end="\<;\_s*then\>" end="\<fi\>" contains=@shLoopList,shDblBrace,shDblParen,shFunctionKey
186 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 +0000187endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000188if exists("b:is_kornshell") || exists("b:is_bash")
Bram Moolenaarc236c162008-07-13 17:41:49 +0000189 syn cluster shCaseList add=shRepeat
190 syn cluster shFunctionList add=shRepeat
191 syn region shRepeat matchgroup=shLoop start="\<while\_s" end="\<in\_s" end="\<do\>"me=e-2 contains=@shLoopList,shDblParen,shDblBrace
192 syn region shRepeat matchgroup=shLoop start="\<until\_s" end="\<in\_s" end="\<do\>"me=e-2 contains=@shLoopList,shDblParen,shDblBrace
193 syn region shCaseEsac matchgroup=shConditional start="\<select\s" matchgroup=shConditional end="\<in\>" end="\<do\>" contains=@shLoopList
Bram Moolenaar071d4272004-06-13 20:20:40 +0000194else
Bram Moolenaarc236c162008-07-13 17:41:49 +0000195 syn region shRepeat matchgroup=shLoop start="\<while\_s" end="\<do\>"me=e-2 contains=@shLoopList
196 syn region shRepeat matchgroup=shLoop start="\<until\_s" end="\<do\>"me=e-2 contains=@shLoopList
Bram Moolenaar071d4272004-06-13 20:20:40 +0000197endif
Bram Moolenaar572cb562005-08-05 21:35:02 +0000198syn region shCurlyIn contained matchgroup=Delimiter start="{" end="}" contains=@shCurlyList
199syn match shComma contained ","
Bram Moolenaar071d4272004-06-13 20:20:40 +0000200
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000201" Case: case...esac {{{1
Bram Moolenaar071d4272004-06-13 20:20:40 +0000202" ====
Bram Moolenaarc236c162008-07-13 17:41:49 +0000203syn match shCaseBar contained skipwhite "\(^\|[^\\]\)\(\\\\\)*\zs|" nextgroup=shCase,shCaseStart,shCaseBar,shComment,shCaseExSingleQuote,shCaseSingleQuote,shCaseDoubleQuote
Bram Moolenaar071d4272004-06-13 20:20:40 +0000204syn match shCaseStart contained skipwhite skipnl "(" nextgroup=shCase,shCaseBar
Bram Moolenaarc236c162008-07-13 17:41:49 +0000205if (g:sh_fold_enabled % (s:sh_fold_ifdofor * 2))/s:sh_fold_ifdofor
Bram Moolenaar5c736222010-01-06 20:54:52 +0100206 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 +0000207 syn region shCaseEsac fold matchgroup=shConditional start="\<case\>" end="\<esac\>" contains=@shCaseEsacList
208else
Bram Moolenaar5c736222010-01-06 20:54:52 +0100209 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 +0000210 syn region shCaseEsac matchgroup=shConditional start="\<case\>" end="\<esac\>" contains=@shCaseEsacList
211endif
Bram Moolenaardf177f62005-02-22 08:39:57 +0000212syn keyword shCaseIn contained skipwhite skipnl in nextgroup=shCase,shCaseStart,shCaseBar,shComment,shCaseExSingleQuote,shCaseSingleQuote,shCaseDoubleQuote
213if exists("b:is_bash")
Bram Moolenaar4b22cdb2010-08-02 22:12:46 +0200214 syn region shCaseExSingleQuote matchgroup=shQuote start=+\$'+ skip=+\\\\\|\\.+ end=+'+ contains=shStringSpecial,shSpecial skipwhite skipnl nextgroup=shCaseBar contained
Bram Moolenaardf177f62005-02-22 08:39:57 +0000215else
216 syn region shCaseExSingleQuote matchgroup=Error start=+\$'+ skip=+\\\\\|\\.+ end=+'+ contains=shStringSpecial skipwhite skipnl nextgroup=shCaseBar contained
217endif
Bram Moolenaar4b22cdb2010-08-02 22:12:46 +0200218syn region shCaseSingleQuote matchgroup=shQuote start=+'+ end=+'+ contains=shStringSpecial skipwhite skipnl nextgroup=shCaseBar contained
219syn region shCaseDoubleQuote matchgroup=shQuote start=+"+ skip=+\\\\\|\\.+ end=+"+ contains=@shDblQuoteList,shStringSpecial skipwhite skipnl nextgroup=shCaseBar contained
Bram Moolenaar071d4272004-06-13 20:20:40 +0000220syn region shCaseCommandSub start=+`+ skip=+\\\\\|\\.+ end=+`+ contains=@shCommandSubList skipwhite skipnl nextgroup=shCaseBar contained
Bram Moolenaar5c736222010-01-06 20:54:52 +0100221syn region shCaseRange matchgroup=Delimiter start=+\[+ skip=+\\\\+ end=+]+ contained
Bram Moolenaar071d4272004-06-13 20:20:40 +0000222
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000223" Misc: {{{1
224"======
Bram Moolenaar071d4272004-06-13 20:20:40 +0000225syn match shWrapLineOperator "\\$"
226syn region shCommandSub start="`" skip="\\\\\|\\." end="`" contains=@shCommandSubList
Bram Moolenaarc236c162008-07-13 17:41:49 +0000227syn match shEscape contained '\\.'
Bram Moolenaar071d4272004-06-13 20:20:40 +0000228
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000229" $() and $(()): {{{1
Bram Moolenaar071d4272004-06-13 20:20:40 +0000230" $(..) is not supported by sh (Bourne shell). However, apparently
231" some systems (HP?) have as their /bin/sh a (link to) Korn shell
232" (ie. Posix compliant shell). /bin/ksh should work for those
233" systems too, however, so the following syntax will flag $(..) as
234" an Error under /bin/sh. By consensus of vimdev'ers!
235if exists("b:is_kornshell") || exists("b:is_bash")
236 syn region shCommandSub matchgroup=shCmdSubRegion start="\$(" skip='\\\\\|\\.' end=")" contains=@shCommandSubList
Bram Moolenaarc236c162008-07-13 17:41:49 +0000237 syn region shArithmetic matchgroup=shArithRegion start="\$((" skip='\\\\\|\\.' end="))" contains=@shArithList
Bram Moolenaar071d4272004-06-13 20:20:40 +0000238 syn match shSkipInitWS contained "^\s\+"
239else
Bram Moolenaardf177f62005-02-22 08:39:57 +0000240 syn region shCommandSub matchgroup=Error start="\$(" end=")" contains=@shCommandSubList
Bram Moolenaar071d4272004-06-13 20:20:40 +0000241endif
242
243if exists("b:is_bash")
244 syn cluster shCommandSubList add=bashSpecialVariables,bashStatement
245 syn cluster shCaseList add=bashAdminStatement,bashStatement
246 syn keyword bashSpecialVariables contained BASH BASH_ENV BASH_VERSINFO BASH_VERSION CDPATH DIRSTACK EUID FCEDIT FIGNORE GLOBIGNORE GROUPS HISTCMD HISTCONTROL HISTFILE HISTFILESIZE HISTIGNORE HISTSIZE HOME HOSTFILE HOSTNAME HOSTTYPE IFS IGNOREEOF INPUTRC LANG LC_ALL LC_COLLATE LC_MESSAGES LINENO MACHTYPE MAIL MAILCHECK MAILPATH OLDPWD OPTARG OPTERR OPTIND OSTYPE PATH PIPESTATUS PPID PROMPT_COMMAND PS1 PS2 PS3 PS4 PWD RANDOM REPLY SECONDS SHELLOPTS SHLVL TIMEFORMAT TIMEOUT UID auto_resume histchars
247 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
248 syn keyword bashAdminStatement daemon killall killproc nice reload restart start status stop
249endif
250
251if exists("b:is_kornshell")
252 syn cluster shCommandSubList add=kshSpecialVariables,kshStatement
253 syn cluster shCaseList add=kshStatement
254 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
255 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
256endif
257
258syn match shSource "^\.\s"
259syn match shSource "\s\.\s"
Bram Moolenaar5c736222010-01-06 20:54:52 +0100260"syn region shColon start="^\s*:" end="$" end="\s#"me=e-2 contains=@shColonList
261syn region shColon start="^\s*\zs:" end="$" end="\s#"me=e-2
Bram Moolenaar071d4272004-06-13 20:20:40 +0000262
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000263" String And Character Constants: {{{1
264"================================
Bram Moolenaar9964e462007-05-05 17:54:07 +0000265syn match shNumber "-\=\<\d\+\>#\="
266syn match shCtrlSeq "\\\d\d\d\|\\[abcfnrtv0]" contained
Bram Moolenaardf177f62005-02-22 08:39:57 +0000267if exists("b:is_bash")
Bram Moolenaar5c736222010-01-06 20:54:52 +0100268 syn match shSpecial "\\\o\o\o\|\\x\x\x\|\\c[^"]\|\\[abefnrtv]" contained
Bram Moolenaardf177f62005-02-22 08:39:57 +0000269endif
270if exists("b:is_bash")
Bram Moolenaar4b22cdb2010-08-02 22:12:46 +0200271 syn region shExSingleQuote matchgroup=shQuote start=+\$'+ skip=+\\\\\|\\.+ end=+'+ contains=shStringSpecial,shSpecial
Bram Moolenaardf177f62005-02-22 08:39:57 +0000272else
Bram Moolenaar9964e462007-05-05 17:54:07 +0000273 syn region shExSingleQuote matchGroup=Error start=+\$'+ skip=+\\\\\|\\.+ end=+'+ contains=shStringSpecial
Bram Moolenaardf177f62005-02-22 08:39:57 +0000274endif
Bram Moolenaar4b22cdb2010-08-02 22:12:46 +0200275syn region shSingleQuote matchgroup=shQuote start=+'+ end=+'+ contains=@Spell
276syn region shDoubleQuote matchgroup=shQuote start=+"+ skip=+\\"+ end=+"+ contains=@shDblQuoteList,shStringSpecial,@Spell
Bram Moolenaare37d50a2008-08-06 17:06:04 +0000277syn match shStringSpecial "[^[:print:] \t]" contained
Bram Moolenaar7263a772007-05-10 17:35:54 +0000278syn match shStringSpecial "\%(\\\\\)*\\[\\"'`$()#]"
Bram Moolenaar5c736222010-01-06 20:54:52 +0100279syn match shSpecial "[^\\]\zs\%(\\\\\)*\\[\\"'`$()#]" nextgroup=shMoreSpecial
Bram Moolenaar7263a772007-05-10 17:35:54 +0000280syn match shSpecial "^\%(\\\\\)*\\[\\"'`$()#]"
Bram Moolenaar5c736222010-01-06 20:54:52 +0100281syn match shMoreSpecial "\%(\\\\\)*\\[\\"'`$()#]" nextgroup=shMoreSpecial contained
Bram Moolenaar071d4272004-06-13 20:20:40 +0000282
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000283" Comments: {{{1
284"==========
Bram Moolenaar5c736222010-01-06 20:54:52 +0100285syn cluster shCommentGroup contains=shTodo,@Spell
286syn keyword shTodo contained COMBAK FIXME TODO XXX
287syn match shComment "^\s*\zs#.*$" contains=@shCommentGroup
288syn match shComment "\s\zs#.*$" contains=@shCommentGroup
289syn match shQuickComment contained "#.*$"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000290
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000291" Here Documents: {{{1
292" =========================================
Bram Moolenaar071d4272004-06-13 20:20:40 +0000293if version < 600
294 syn region shHereDoc matchgroup=shRedir start="<<\s*\**END[a-zA-Z_0-9]*\**" matchgroup=shRedir end="^END[a-zA-Z_0-9]*$" contains=@shDblQuoteList
295 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
296 syn region shHereDoc matchgroup=shRedir start="<<\s*\**EOF\**" matchgroup=shRedir end="^EOF$" contains=@shDblQuoteList
297 syn region shHereDoc matchgroup=shRedir start="<<-\s*\**EOF\**" matchgroup=shRedir end="^\s*EOF$" contains=@shDblQuoteList
298 syn region shHereDoc matchgroup=shRedir start="<<\s*\**\.\**" matchgroup=shRedir end="^\.$" contains=@shDblQuoteList
299 syn region shHereDoc matchgroup=shRedir start="<<-\s*\**\.\**" matchgroup=shRedir end="^\s*\.$" contains=@shDblQuoteList
300
Bram Moolenaarc236c162008-07-13 17:41:49 +0000301elseif (g:sh_fold_enabled % (s:sh_fold_heredoc * 2))/s:sh_fold_heredoc
Bram Moolenaar9964e462007-05-05 17:54:07 +0000302 syn region shHereDoc matchgroup=shRedir fold start="<<\s*\z(\S*\)" matchgroup=shRedir end="^\z1\s*$" contains=@shDblQuoteList
Bram Moolenaarcd71fa32005-03-11 22:46:48 +0000303 syn region shHereDoc matchgroup=shRedir fold start="<<\s*\"\z(\S*\)\"" matchgroup=shRedir end="^\z1\s*$"
304 syn region shHereDoc matchgroup=shRedir fold start="<<\s*'\z(\S*\)'" matchgroup=shRedir end="^\z1\s*$"
305 syn region shHereDoc matchgroup=shRedir fold start="<<-\s*\z(\S*\)" matchgroup=shRedir end="^\s*\z1\s*$" contains=@shDblQuoteList
306 syn region shHereDoc matchgroup=shRedir fold start="<<-\s*\"\z(\S*\)\"" matchgroup=shRedir end="^\s*\z1\s*$"
307 syn region shHereDoc matchgroup=shRedir fold start="<<-\s*'\z(\S*\)'" matchgroup=shRedir end="^\s*\z1\s*$"
308 syn region shHereDoc matchgroup=shRedir fold start="<<\s*\\\_$\_s*\z(\S*\)" matchgroup=shRedir end="^\z1\s*$"
309 syn region shHereDoc matchgroup=shRedir fold start="<<\s*\\\_$\_s*\"\z(\S*\)\"" matchgroup=shRedir end="^\z1\s*$"
310 syn region shHereDoc matchgroup=shRedir fold start="<<-\s*\\\_$\_s*'\z(\S*\)'" matchgroup=shRedir end="^\s*\z1\s*$"
311 syn region shHereDoc matchgroup=shRedir fold start="<<-\s*\\\_$\_s*\z(\S*\)" matchgroup=shRedir end="^\s*\z1\s*$"
312 syn region shHereDoc matchgroup=shRedir fold start="<<-\s*\\\_$\_s*\"\z(\S*\)\"" matchgroup=shRedir end="^\s*\z1\s*$"
313 syn region shHereDoc matchgroup=shRedir fold start="<<\s*\\\_$\_s*'\z(\S*\)'" matchgroup=shRedir end="^\z1\s*$"
Bram Moolenaar9964e462007-05-05 17:54:07 +0000314 syn region shHereDoc matchgroup=shRedir fold start="<<\\\z(\S*\)" matchgroup=shRedir end="^\z1\s*$"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000315
Bram Moolenaar071d4272004-06-13 20:20:40 +0000316else
Bram Moolenaarcd71fa32005-03-11 22:46:48 +0000317 syn region shHereDoc matchgroup=shRedir start="<<\s*\\\=\z(\S*\)" matchgroup=shRedir end="^\z1\s*$" contains=@shDblQuoteList
318 syn region shHereDoc matchgroup=shRedir start="<<\s*\"\z(\S*\)\"" matchgroup=shRedir end="^\z1\s*$"
319 syn region shHereDoc matchgroup=shRedir start="<<-\s*\z(\S*\)" matchgroup=shRedir end="^\s*\z1\s*$" contains=@shDblQuoteList
320 syn region shHereDoc matchgroup=shRedir start="<<-\s*'\z(\S*\)'" matchgroup=shRedir end="^\s*\z1\s*$"
321 syn region shHereDoc matchgroup=shRedir start="<<\s*'\z(\S*\)'" matchgroup=shRedir end="^\z1\s*$"
322 syn region shHereDoc matchgroup=shRedir start="<<-\s*\"\z(\S*\)\"" matchgroup=shRedir end="^\s*\z1\s*$"
323 syn region shHereDoc matchgroup=shRedir start="<<\s*\\\_$\_s*\z(\S*\)" matchgroup=shRedir end="^\z1\s*$"
324 syn region shHereDoc matchgroup=shRedir start="<<-\s*\\\_$\_s*\z(\S*\)" matchgroup=shRedir end="^\s*\z1\s*$"
325 syn region shHereDoc matchgroup=shRedir start="<<-\s*\\\_$\_s*'\z(\S*\)'" matchgroup=shRedir end="^\s*\z1\s*$"
326 syn region shHereDoc matchgroup=shRedir start="<<\s*\\\_$\_s*'\z(\S*\)'" matchgroup=shRedir end="^\z1\s*$"
327 syn region shHereDoc matchgroup=shRedir start="<<\s*\\\_$\_s*\"\z(\S*\)\"" matchgroup=shRedir end="^\z1\s*$"
328 syn region shHereDoc matchgroup=shRedir start="<<-\s*\\\_$\_s*\"\z(\S*\)\"" matchgroup=shRedir end="^\s*\z1\s*$"
Bram Moolenaar9964e462007-05-05 17:54:07 +0000329 syn region shHereDoc matchgroup=shRedir start="<<\\\z(\S*\)" matchgroup=shRedir end="^\z1\s*$"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000330endif
331
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000332" Here Strings: {{{1
333" =============
334if exists("b:is_bash")
335 syn match shRedir "<<<"
336endif
337
338" Identifiers: {{{1
339"=============
Bram Moolenaarc236c162008-07-13 17:41:49 +0000340syn match shSetOption "\s\zs[-+][a-zA-Z0-9]\+\>" contained
341syn match shVariable "\<\([bwglsav]:\)\=[a-zA-Z0-9.!@_%+,]*\ze=" nextgroup=shSetIdentifier
342syn match shSetIdentifier "=" contained nextgroup=shPattern,shDeref,shDerefSimple,shDoubleQuote,shSingleQuote,shExSingleQuote
Bram Moolenaar071d4272004-06-13 20:20:40 +0000343if exists("b:is_bash")
Bram Moolenaar4b22cdb2010-08-02 22:12:46 +0200344 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
345 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 +0000346elseif exists("b:is_kornshell")
Bram Moolenaar4b22cdb2010-08-02 22:12:46 +0200347 syn region shSetList oneline matchgroup=shSet start="\<\(typeset\|export\|unset\)\>\ze[^/]" end="$" matchgroup=shSetListDelim end="\ze[}|);&]" matchgroup=NONE end="\ze\s\+[#=]" contains=@shIdList
348 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 +0000349else
Bram Moolenaar4b22cdb2010-08-02 22:12:46 +0200350 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 +0000351endif
352
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000353" Functions: {{{1
Bram Moolenaarc236c162008-07-13 17:41:49 +0000354if !exists("g:is_posix")
355 syn keyword shFunctionKey function skipwhite skipnl nextgroup=shFunctionTwo
356endif
357
358if exists("b:is_bash")
359 if (g:sh_fold_enabled % (s:sh_fold_functions * 2))/s:sh_fold_functions
360 syn region shFunctionOne fold matchgroup=shFunction start="^\s*\h[-a-zA-Z_0-9]*\s*()\_s*{" end="}" contains=@shFunctionList skipwhite skipnl nextgroup=shFunctionStart,shQuickComment
361 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
362 else
363 syn region shFunctionOne matchgroup=shFunction start="^\s*\h[-a-zA-Z_0-9]*\s*()\_s*{" end="}" contains=@shFunctionList
364 syn region shFunctionTwo matchgroup=shFunction start="\h[-a-zA-Z_0-9]*\s*\%(()\)\=\_s*{" end="}" contains=shFunctionKey,@shFunctionList contained
365 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000366else
Bram Moolenaarc236c162008-07-13 17:41:49 +0000367 if (g:sh_fold_enabled % (s:sh_fold_functions * 2))/s:sh_fold_functions
368 syn region shFunctionOne fold matchgroup=shFunction start="^\s*\h\w*\s*()\_s*{" end="}" contains=@shFunctionList skipwhite skipnl nextgroup=shFunctionStart,shQuickComment
369 syn region shFunctionTwo fold matchgroup=shFunction start="\h\w*\s*\%(()\)\=\_s*{" end="}" contains=shFunctionKey,@shFunctionList contained skipwhite skipnl nextgroup=shFunctionStart,shQuickComment
370 else
371 syn region shFunctionOne matchgroup=shFunction start="^\s*\h\w*\s*()\_s*{" end="}" contains=@shFunctionList
372 syn region shFunctionTwo matchgroup=shFunction start="\h\w*\s*\%(()\)\=\_s*{" end="}" contains=shFunctionKey,@shFunctionList contained
373 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000374endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000375
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000376" Parameter Dereferencing: {{{1
377" ========================
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000378syn match shDerefSimple "\$\%(\h\w*\|\d\)"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000379syn region shDeref matchgroup=PreProc start="\${" end="}" contains=@shDerefList,shDerefVarArray
380syn match shDerefWordError "[^}$[]" contained
381syn match shDerefSimple "\$[-#*@!?]"
382syn match shDerefSimple "\$\$"
383if exists("b:is_bash") || exists("b:is_kornshell")
384 syn region shDeref matchgroup=PreProc start="\${##\=" end="}" contains=@shDerefList
Bram Moolenaarc236c162008-07-13 17:41:49 +0000385 syn region shDeref matchgroup=PreProc start="\${\$\$" end="}" contains=@shDerefList
Bram Moolenaar071d4272004-06-13 20:20:40 +0000386endif
387
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000388" bash: ${!prefix*} and ${#parameter}: {{{1
389" ====================================
Bram Moolenaar071d4272004-06-13 20:20:40 +0000390if exists("b:is_bash")
391 syn region shDeref matchgroup=PreProc start="\${!" end="\*\=}" contains=@shDerefList,shDerefOp
392 syn match shDerefVar contained "{\@<=!\w\+" nextgroup=@shDerefVarList
393endif
394
395syn match shDerefSpecial contained "{\@<=[-*@?0]" nextgroup=shDerefOp,shDerefOpError
396syn match shDerefSpecial contained "\({[#!]\)\@<=[[:alnum:]*@_]\+" nextgroup=@shDerefVarList,shDerefOp
397syn match shDerefVar contained "{\@<=\w\+" nextgroup=@shDerefVarList
398
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000399" sh ksh bash : ${var[... ]...} array reference: {{{1
Bram Moolenaar071d4272004-06-13 20:20:40 +0000400syn region shDerefVarArray contained matchgroup=shDeref start="\[" end="]" contains=@shCommandSubList nextgroup=shDerefOp,shDerefOpError
401
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000402" Special ${parameter OPERATOR word} handling: {{{1
Bram Moolenaar071d4272004-06-13 20:20:40 +0000403" sh ksh bash : ${parameter:-word} word is default value
404" sh ksh bash : ${parameter:=word} assign word as default value
405" sh ksh bash : ${parameter:?word} display word if parameter is null
406" sh ksh bash : ${parameter:+word} use word if parameter is not null, otherwise nothing
407" ksh bash : ${parameter#pattern} remove small left pattern
408" ksh bash : ${parameter##pattern} remove large left pattern
409" ksh bash : ${parameter%pattern} remove small right pattern
410" ksh bash : ${parameter%%pattern} remove large right pattern
411syn cluster shDerefPatternList contains=shDerefPattern,shDerefString
412syn match shDerefOpError contained ":[[:punct:]]"
413syn match shDerefOp contained ":\=[-=?]" nextgroup=@shDerefPatternList
414syn match shDerefOp contained ":\=+" nextgroup=@shDerefPatternList
415if exists("b:is_bash") || exists("b:is_kornshell")
416 syn match shDerefOp contained "#\{1,2}" nextgroup=@shDerefPatternList
417 syn match shDerefOp contained "%\{1,2}" nextgroup=@shDerefPatternList
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +0000418 syn match shDerefPattern contained "[^{}]\+" contains=shDeref,shDerefSimple,shDerefPattern,shDerefString,shCommandSub,shDerefEscape nextgroup=shDerefPattern
Bram Moolenaar071d4272004-06-13 20:20:40 +0000419 syn region shDerefPattern contained start="{" end="}" contains=shDeref,shDerefSimple,shDerefString,shCommandSub nextgroup=shDerefPattern
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +0000420 syn match shDerefEscape contained '\%(\\\\\)*\\.'
Bram Moolenaar071d4272004-06-13 20:20:40 +0000421endif
Bram Moolenaar4b22cdb2010-08-02 22:12:46 +0200422syn region shDerefString contained matchgroup=shDerefDelim start=+\%(\\\)\@<!'+ end=+'+ contains=shStringSpecial
423syn region shDerefString contained matchgroup=shDerefDelim start=+\%(\\\)\@<!"+ skip=+\\"+ end=+"+ contains=@shDblQuoteList,shStringSpecial
Bram Moolenaarc236c162008-07-13 17:41:49 +0000424syn match shDerefString contained "\\["']" nextgroup=shDerefPattern
Bram Moolenaar071d4272004-06-13 20:20:40 +0000425
Bram Moolenaar071d4272004-06-13 20:20:40 +0000426if exists("b:is_bash")
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +0000427 " bash : ${parameter:offset}
428 " bash : ${parameter:offset:length}
Bram Moolenaar071d4272004-06-13 20:20:40 +0000429 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 +0000430 syn match shDerefPOL contained ":[^}]\+" contains=@shCommandSubList
431
432 " bash : ${parameter//pattern/string}
433 " bash : ${parameter//pattern}
434 syn match shDerefPPS contained '/\{1,2}' nextgroup=shDerefPPSleft
Bram Moolenaara5792f52005-11-23 21:25:05 +0000435 syn region shDerefPPSleft contained start='.' skip=@\%(\\\)\/@ matchgroup=shDerefOp end='/' end='\ze}' nextgroup=shDerefPPSright contains=@shCommandSubList
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +0000436 syn region shDerefPPSright contained start='.' end='\ze}' contains=@shCommandSubList
Bram Moolenaar071d4272004-06-13 20:20:40 +0000437endif
438
Bram Moolenaarc236c162008-07-13 17:41:49 +0000439" Arithmetic Parenthesized Expressions: {{{1
440syn region shParen matchgroup=shArithRegion start='(\ze[^(]' end=')' contains=@shArithParenList
441
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000442" Useful sh Keywords: {{{1
443" ===================
Bram Moolenaar071d4272004-06-13 20:20:40 +0000444syn keyword shStatement break cd chdir continue eval exec exit kill newgrp pwd read readonly return shift test trap ulimit umask wait
445syn keyword shConditional contained elif else then
446syn keyword shCondError elif else then
447
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000448" Useful ksh Keywords: {{{1
449" ====================
Bram Moolenaar071d4272004-06-13 20:20:40 +0000450if exists("b:is_kornshell") || exists("b:is_bash")
Bram Moolenaar4b22cdb2010-08-02 22:12:46 +0200451 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 +0000452 if exists("g:is_posix")
453 syn keyword shStatement command
454 else
455 syn keyword shStatement time
456 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000457
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000458" Useful bash Keywords: {{{1
459" =====================
Bram Moolenaar071d4272004-06-13 20:20:40 +0000460 if exists("b:is_bash")
461 syn keyword shStatement bind builtin dirs disown enable help local logout popd pushd shopt source
462 else
463 syn keyword shStatement login newgrp
464 endif
465endif
466
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000467" Synchronization: {{{1
468" ================
Bram Moolenaar071d4272004-06-13 20:20:40 +0000469if !exists("sh_minlines")
470 let sh_minlines = 200
471endif
472if !exists("sh_maxlines")
473 let sh_maxlines = 2 * sh_minlines
474endif
475exec "syn sync minlines=" . sh_minlines . " maxlines=" . sh_maxlines
476syn sync match shCaseEsacSync grouphere shCaseEsac "\<case\>"
477syn sync match shCaseEsacSync groupthere shCaseEsac "\<esac\>"
478syn sync match shDoSync grouphere shDo "\<do\>"
479syn sync match shDoSync groupthere shDo "\<done\>"
480syn sync match shForSync grouphere shFor "\<for\>"
481syn sync match shForSync groupthere shFor "\<in\>"
482syn sync match shIfSync grouphere shIf "\<if\>"
483syn sync match shIfSync groupthere shIf "\<fi\>"
484syn sync match shUntilSync grouphere shRepeat "\<until\>"
485syn sync match shWhileSync grouphere shRepeat "\<while\>"
486
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000487" Default Highlighting: {{{1
488" =====================
Bram Moolenaar071d4272004-06-13 20:20:40 +0000489hi def link shArithRegion shShellVariables
Bram Moolenaardf177f62005-02-22 08:39:57 +0000490hi def link shBeginHere shRedir
Bram Moolenaar071d4272004-06-13 20:20:40 +0000491hi def link shCaseBar shConditional
Bram Moolenaar071d4272004-06-13 20:20:40 +0000492hi def link shCaseCommandSub shCommandSub
493hi def link shCaseDoubleQuote shDoubleQuote
Bram Moolenaardf177f62005-02-22 08:39:57 +0000494hi def link shCaseIn shConditional
Bram Moolenaar4b22cdb2010-08-02 22:12:46 +0200495hi def link shQuote shOperator
Bram Moolenaar071d4272004-06-13 20:20:40 +0000496hi def link shCaseSingleQuote shSingleQuote
497hi def link shCaseStart shConditional
498hi def link shCmdSubRegion shShellVariables
Bram Moolenaar5c736222010-01-06 20:54:52 +0100499hi def link shColon shComment
Bram Moolenaar071d4272004-06-13 20:20:40 +0000500hi def link shDerefOp shOperator
Bram Moolenaardf177f62005-02-22 08:39:57 +0000501hi def link shDerefPOL shDerefOp
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +0000502hi def link shDerefPPS shDerefOp
Bram Moolenaardf177f62005-02-22 08:39:57 +0000503hi def link shDeref shShellVariables
Bram Moolenaar4b22cdb2010-08-02 22:12:46 +0200504hi def link shDerefDelim shOperator
Bram Moolenaar071d4272004-06-13 20:20:40 +0000505hi def link shDerefSimple shDeref
506hi def link shDerefSpecial shDeref
507hi def link shDerefString shDoubleQuote
Bram Moolenaardf177f62005-02-22 08:39:57 +0000508hi def link shDerefVar shDeref
Bram Moolenaar071d4272004-06-13 20:20:40 +0000509hi def link shDoubleQuote shString
510hi def link shEcho shString
Bram Moolenaar4b22cdb2010-08-02 22:12:46 +0200511hi def link shEchoDelim shOperator
Bram Moolenaarc236c162008-07-13 17:41:49 +0000512hi def link shEchoQuote shString
Bram Moolenaar071d4272004-06-13 20:20:40 +0000513hi def link shEmbeddedEcho shString
Bram Moolenaarc236c162008-07-13 17:41:49 +0000514hi def link shEscape shCommandSub
Bram Moolenaardf177f62005-02-22 08:39:57 +0000515hi def link shExSingleQuote shSingleQuote
Bram Moolenaarc236c162008-07-13 17:41:49 +0000516hi def link shFunction Function
Bram Moolenaar071d4272004-06-13 20:20:40 +0000517hi def link shHereDoc shString
Bram Moolenaardf177f62005-02-22 08:39:57 +0000518hi def link shHerePayload shHereDoc
Bram Moolenaar071d4272004-06-13 20:20:40 +0000519hi def link shLoop shStatement
Bram Moolenaar5c736222010-01-06 20:54:52 +0100520hi def link shMoreSpecial shSpecial
Bram Moolenaar071d4272004-06-13 20:20:40 +0000521hi def link shOption shCommandSub
522hi def link shPattern shString
Bram Moolenaarc236c162008-07-13 17:41:49 +0000523hi def link shParen shArithmetic
Bram Moolenaar071d4272004-06-13 20:20:40 +0000524hi def link shPosnParm shShellVariables
Bram Moolenaarc236c162008-07-13 17:41:49 +0000525hi def link shQuickComment shComment
Bram Moolenaar071d4272004-06-13 20:20:40 +0000526hi def link shRange shOperator
527hi def link shRedir shOperator
Bram Moolenaar4b22cdb2010-08-02 22:12:46 +0200528hi def link shSetListDelim shOperator
Bram Moolenaarc236c162008-07-13 17:41:49 +0000529hi def link shSetOption shOption
Bram Moolenaar071d4272004-06-13 20:20:40 +0000530hi def link shSingleQuote shString
531hi def link shSource shOperator
532hi def link shStringSpecial shSpecial
533hi def link shSubShRegion shOperator
534hi def link shTestOpr shConditional
Bram Moolenaar9964e462007-05-05 17:54:07 +0000535hi def link shTestPattern shString
536hi def link shTestDoubleQuote shString
537hi def link shTestSingleQuote shString
Bram Moolenaar071d4272004-06-13 20:20:40 +0000538hi def link shVariable shSetList
539hi def link shWrapLineOperator shOperator
540
541if exists("b:is_bash")
542 hi def link bashAdminStatement shStatement
543 hi def link bashSpecialVariables shShellVariables
544 hi def link bashStatement shStatement
Bram Moolenaarcd71fa32005-03-11 22:46:48 +0000545 hi def link shFunctionParen Delimiter
546 hi def link shFunctionDelim Delimiter
Bram Moolenaar071d4272004-06-13 20:20:40 +0000547endif
548if exists("b:is_kornshell")
549 hi def link kshSpecialVariables shShellVariables
550 hi def link kshStatement shStatement
Bram Moolenaarcd71fa32005-03-11 22:46:48 +0000551 hi def link shFunctionParen Delimiter
Bram Moolenaar071d4272004-06-13 20:20:40 +0000552endif
553
554hi def link shCaseError Error
555hi def link shCondError Error
556hi def link shCurlyError Error
557hi def link shDerefError Error
558hi def link shDerefOpError Error
559hi def link shDerefWordError Error
560hi def link shDoError Error
561hi def link shEsacError Error
562hi def link shIfError Error
563hi def link shInError Error
564hi def link shParenError Error
565hi def link shTestError Error
566if exists("b:is_kornshell")
567 hi def link shDTestError Error
568endif
569
570hi def link shArithmetic Special
571hi def link shCharClass Identifier
572hi def link shSnglCase Statement
573hi def link shCommandSub Special
574hi def link shComment Comment
575hi def link shConditional Conditional
Bram Moolenaar9964e462007-05-05 17:54:07 +0000576hi def link shCtrlSeq Special
Bram Moolenaar071d4272004-06-13 20:20:40 +0000577hi def link shExprRegion Delimiter
Bram Moolenaarcd71fa32005-03-11 22:46:48 +0000578hi def link shFunctionKey Function
Bram Moolenaar071d4272004-06-13 20:20:40 +0000579hi def link shFunctionName Function
580hi def link shNumber Number
581hi def link shOperator Operator
582hi def link shRepeat Repeat
583hi def link shSet Statement
584hi def link shSetList Identifier
585hi def link shShellVariables PreProc
586hi def link shSpecial Special
587hi def link shStatement Statement
588hi def link shString String
589hi def link shTodo Todo
590hi def link shAlias Identifier
591
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000592" Set Current Syntax: {{{1
593" ===================
Bram Moolenaar071d4272004-06-13 20:20:40 +0000594if exists("b:is_bash")
595 let b:current_syntax = "bash"
596elseif exists("b:is_kornshell")
597 let b:current_syntax = "ksh"
598else
599 let b:current_syntax = "sh"
600endif
601
Bram Moolenaard4755bb2004-09-02 19:12:26 +0000602" vim: ts=16 fdm=marker