xref: /vim-8.2.3635/runtime/syntax/sh.vim (revision fc39ecf8)
1" Vim syntax file
2" Language:		shell (sh) Korn shell (ksh) bash (sh)
3" Maintainer:		Charles E. Campbell  <[email protected]>
4" Previous Maintainer:	Lennart Schultz <[email protected]>
5" Last Change:		May 29, 2015
6" Version:		137
7" URL:		http://www.drchip.org/astronaut/vim/index.html#SYNTAX_SH
8" For options and settings, please use:      :help ft-sh-syntax
9" This file includes many ideas from ?ric Brunet ([email protected])
10
11" For version 5.x: Clear all syntax items {{{1
12" 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
19" AFAICT "." should be considered part of the iskeyword.  Using iskeywords in
20" syntax is dicey, so the following code permits the user to
21"  g:sh_isk set to a string	: specify iskeyword.
22"  g:sh_noisk exists	: don't change iskeyword
23"  g:sh_noisk does not exist	: (default) append "." to iskeyword
24if exists("g:sh_isk") && type(g:sh_isk) == 1	" user specifying iskeyword
25 exe "setl isk=".g:sh_isk
26elseif !exists("g:sh_noisk")		" optionally prevent appending '.' to iskeyword
27 setl isk+=.
28endif
29
30" trying to answer the question: which shell is /bin/sh, really?
31" If the user has not specified any of g:is_kornshell, g:is_bash, g:is_posix, g:is_sh, then guess.
32if !exists("g:is_kornshell") && !exists("g:is_bash") && !exists("g:is_posix") && !exists("g:is_sh")
33 let s:shell = ""
34 if executable("/bin/sh")
35  let s:shell = resolve("/bin/sh")
36 elseif executable("/usr/bin/sh")
37  let s:shell = resolve("/usr/bin/sh")
38 endif
39 if     s:shell =~ 'bash$'
40  let g:is_bash= 1
41 elseif s:shell =~ 'ksh$'
42  let g:is_kornshell = 1
43 elseif s:shell =~ 'dash$'
44  let g:is_posix = 1
45 endif
46 unlet s:shell
47endif
48
49" handling /bin/sh with is_kornshell/is_sh {{{1
50" b:is_sh is set when "#! /bin/sh" is found;
51" However, it often is just a masquerade by bash (typically Linux)
52" or kornshell (typically workstations with Posix "sh").
53" So, when the user sets "g:is_bash", "g:is_kornshell",
54" or "g:is_posix", a b:is_sh is converted into b:is_bash/b:is_kornshell,
55" respectively.
56if !exists("b:is_kornshell") && !exists("b:is_bash")
57  if exists("g:is_posix") && !exists("g:is_kornshell")
58   let g:is_kornshell= g:is_posix
59  endif
60  if exists("g:is_kornshell")
61    let b:is_kornshell= 1
62    if exists("b:is_sh")
63      unlet b:is_sh
64    endif
65  elseif exists("g:is_bash")
66    let b:is_bash= 1
67    if exists("b:is_sh")
68      unlet b:is_sh
69    endif
70  else
71    let b:is_sh= 1
72  endif
73endif
74
75" set up default g:sh_fold_enabled {{{1
76if !exists("g:sh_fold_enabled")
77 let g:sh_fold_enabled= 0
78elseif g:sh_fold_enabled != 0 && !has("folding")
79 let g:sh_fold_enabled= 0
80 echomsg "Ignoring g:sh_fold_enabled=".g:sh_fold_enabled."; need to re-compile vim for +fold support"
81endif
82if !exists("s:sh_fold_functions")
83 let s:sh_fold_functions= and(g:sh_fold_enabled,1)
84endif
85if !exists("s:sh_fold_heredoc")
86 let s:sh_fold_heredoc  = and(g:sh_fold_enabled,2)
87endif
88if !exists("s:sh_fold_ifdofor")
89 let s:sh_fold_ifdofor  = and(g:sh_fold_enabled,4)
90endif
91if g:sh_fold_enabled && &fdm == "manual"
92 " Given that	the	user provided g:sh_fold_enabled
93 " 	AND	g:sh_fold_enabled is manual (usual default)
94 " 	implies	a desire for syntax-based folding
95 setl fdm=syntax
96endif
97
98" sh syntax is case sensitive {{{1
99syn case match
100
101" Clusters: contains=@... clusters {{{1
102"==================================
103syn cluster shErrorList	contains=shDoError,shIfError,shInError,shCaseError,shEsacError,shCurlyError,shParenError,shTestError,shOK
104if exists("b:is_kornshell")
105 syn cluster ErrorList add=shDTestError
106endif
107syn cluster shArithParenList	contains=shArithmetic,shCaseEsac,shComment,shDeref,shDo,shDerefSimple,shEcho,shEscape,shNumber,shOperator,shPosnParm,shExSingleQuote,shExDoubleQuote,shRedir,shSingleQuote,shDoubleQuote,shStatement,shVariable,shAlias,shTest,shCtrlSeq,shSpecial,shParen,bashSpecialVariables,bashStatement,shIf,shFor
108syn cluster shArithList	contains=@shArithParenList,shParenError
109syn cluster shCaseEsacList	contains=shCaseStart,shCase,shCaseBar,shCaseIn,shComment,shDeref,shDerefSimple,shCaseCommandSub,shCaseExSingleQuote,shCaseSingleQuote,shCaseDoubleQuote,shCtrlSeq,@shErrorList,shStringSpecial,shCaseRange
110syn cluster shCaseList	contains=@shCommandSubList,shCaseEsac,shColon,shCommandSub,shComment,shDo,shEcho,shExpr,shFor,shHereDoc,shIf,shRedir,shSetList,shSource,shStatement,shVariable,shCtrlSeq
111syn cluster shCommandSubList	contains=shAlias,shArithmetic,shCmdParenRegion,shCtrlSeq,shDeref,shDerefSimple,shDoubleQuote,shEcho,shEscape,shExDoubleQuote,shExpr,shExSingleQuote,shNumber,shOperator,shOption,shPosnParm,shSingleQuote,shSpecial,shStatement,shSubSh,shTest,shVariable
112syn cluster shCurlyList	contains=shNumber,shComma,shDeref,shDerefSimple,shDerefSpecial
113syn cluster shDblQuoteList	contains=shCommandSub,shDeref,shDerefSimple,shEscape,shPosnParm,shCtrlSeq,shSpecial
114syn cluster shDerefList	contains=shDeref,shDerefSimple,shDerefVar,shDerefSpecial,shDerefWordError,shDerefPPS
115syn cluster shDerefVarList	contains=shDerefOp,shDerefVarArray,shDerefOpError
116syn cluster shEchoList	contains=shArithmetic,shCommandSub,shDeref,shDerefSimple,shEscape,shExpr,shExSingleQuote,shExDoubleQuote,shSingleQuote,shDoubleQuote,shCtrlSeq,shEchoQuote
117syn cluster shExprList1	contains=shCharClass,shNumber,shOperator,shExSingleQuote,shExDoubleQuote,shSingleQuote,shDoubleQuote,shExpr,shDblBrace,shDeref,shDerefSimple,shCtrlSeq
118syn cluster shExprList2	contains=@shExprList1,@shCaseList,shTest
119syn cluster shFunctionList	contains=@shCommandSubList,shCaseEsac,shColon,shCommandSub,shComment,shDo,shEcho,shExpr,shFor,shHereDoc,shIf,shOption,shRedir,shSetList,shSource,shStatement,shVariable,shOperator,shCtrlSeq
120if exists("b:is_kornshell") || exists("b:is_bash")
121 syn cluster shFunctionList	add=shRepeat
122 syn cluster shFunctionList	add=shDblBrace,shDblParen
123endif
124syn cluster shHereBeginList	contains=@shCommandSubList
125syn cluster shHereList	contains=shBeginHere,shHerePayload
126syn cluster shHereListDQ	contains=shBeginHere,@shDblQuoteList,shHerePayload
127syn cluster shIdList	contains=shCommandSub,shWrapLineOperator,shSetOption,shDeref,shDerefSimple,shRedir,shExSingleQuote,shExDoubleQuote,shSingleQuote,shDoubleQuote,shExpr,shCtrlSeq,shStringSpecial,shAtExpr
128syn cluster shIfList	contains=@shLoopList,shDblBrace,shDblParen,shFunctionKey,shFunctionOne,shFunctionTwo
129syn cluster shLoopList	contains=@shCaseList,@shErrorList,shCaseEsac,shConditional,shDblBrace,shExpr,shFor,shForPP,shIf,shOption,shSet,shTest,shTestOpr
130syn cluster shSubShList	contains=@shCommandSubList,shCaseEsac,shColon,shCommandSub,shComment,shDo,shEcho,shExpr,shFor,shIf,shRedir,shSetList,shSource,shStatement,shVariable,shCtrlSeq,shOperator
131syn cluster shTestList	contains=shCharClass,shCommandSub,shComment,shCtrlSeq,shDeref,shDerefSimple,shDoubleQuote,shExDoubleQuote,shExpr,shExSingleQuote,shNumber,shOperator,shSingleQuote,shTest,shTestOpr
132" Echo: {{{1
133" ====
134" This one is needed INSIDE a CommandSub, so that `echo bla` be correct
135syn 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
136syn 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
137syn match  shEchoQuote contained	'\%(\\\\\)*\\["`'()]'
138
139" This must be after the strings, so that ... \" will be correct
140syn 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
141
142" Alias: {{{1
143" =====
144if exists("b:is_kornshell") || exists("b:is_bash")
145 syn match shStatement "\<alias\>"
146 syn region shAlias matchgroup=shStatement start="\<alias\>\s\+\(\h[-._[:alnum:]]\+\)\@="  skip="\\$" end="\>\|`"
147 syn region shAlias matchgroup=shStatement start="\<alias\>\s\+\(\h[-._[:alnum:]]\+=\)\@=" skip="\\$" end="="
148endif
149
150" Error Codes: {{{1
151" ============
152if !exists("g:sh_no_error")
153 syn match   shDoError "\<done\>"
154 syn match   shIfError "\<fi\>"
155 syn match   shInError "\<in\>"
156 syn match   shCaseError ";;"
157 syn match   shEsacError "\<esac\>"
158 syn match   shCurlyError "}"
159 syn match   shParenError ")"
160 syn match   shOK	'\.\(done\|fi\|in\|esac\)'
161 if exists("b:is_kornshell")
162  syn match     shDTestError "]]"
163 endif
164 syn match     shTestError "]"
165endif
166
167" Options: {{{1
168" ====================
169syn match   shOption	"\s\zs[-+][-_a-zA-Z0-9#]\+"
170syn match   shOption	"\s\zs--[^ \t$`'"|);]\+"
171
172" File Redirection Highlighted As Operators: {{{1
173"===========================================
174syn match      shRedir	"\d\=>\(&[-0-9]\)\="
175syn match      shRedir	"\d\=>>-\="
176syn match      shRedir	"\d\=<\(&[-0-9]\)\="
177syn match      shRedir	"\d<<-\="
178
179" Operators: {{{1
180" ==========
181syn match   shOperator	"<<\|>>"		contained
182syn match   shOperator	"[!&;|]"		contained
183syn match   shOperator	"\[[[^:]\|\]]"		contained
184syn match   shOperator	"[-=/*+%]\=="		skipwhite nextgroup=shPattern
185syn match   shPattern	"\<\S\+\())\)\@="	contained contains=shExSingleQuote,shSingleQuote,shExDoubleQuote,shDoubleQuote,shDeref
186
187" Subshells: {{{1
188" ==========
189syn region shExpr  transparent matchgroup=shExprRegion  start="{" end="}"		contains=@shExprList2 nextgroup=shMoreSpecial
190syn region shSubSh transparent matchgroup=shSubShRegion start="[^(]\zs(" end=")"	contains=@shSubShList nextgroup=shMoreSpecial
191
192" Tests: {{{1
193"=======
194syn region shExpr	matchgroup=shRange start="\[" skip=+\\\\\|\\$\|\[+ end="\]" contains=@shTestList,shSpecial
195syn region shTest	transparent matchgroup=shStatement start="\<test\s" skip=+\\\\\|\\$+ matchgroup=NONE end="[;&|]"me=e-1 end="$" contains=@shExprList1
196syn match  shTestOpr	contained	'[^-+/%]\zs=' skipwhite nextgroup=shTestDoubleQuote,shTestSingleQuote,shTestPattern
197syn match  shTestOpr	contained	"<=\|>=\|!=\|==\|-.\>\|-\(nt\|ot\|ef\|eq\|ne\|lt\|le\|gt\|ge\)\>\|[!<>]"
198syn match  shTestPattern	contained	'\w\+'
199syn region shTestDoubleQuote	contained	start='\%(\%(\\\\\)*\\\)\@<!"' skip=+\\\\\|\\"+ end='"'
200syn match  shTestSingleQuote	contained	'\\.'
201syn match  shTestSingleQuote	contained	"'[^']*'"
202if exists("b:is_kornshell") || exists("b:is_bash")
203 syn region  shDblBrace matchgroup=Delimiter start="\[\[" skip=+\\\\\|\\$+ end="\]\]"	contains=@shTestList,shComment
204 syn region  shDblParen matchgroup=Delimiter start="((" skip=+\\\\\|\\$+ end="))"	contains=@shTestList,shComment
205endif
206
207" Character Class In Range: {{{1
208" =========================
209syn match   shCharClass	contained	"\[:\(backspace\|escape\|return\|xdigit\|alnum\|alpha\|blank\|cntrl\|digit\|graph\|lower\|print\|punct\|space\|upper\|tab\):\]"
210
211" Loops: do, if, while, until {{{1
212" ======
213if s:sh_fold_ifdofor
214 syn region shDo	fold transparent matchgroup=shConditional start="\<do\>" matchgroup=shConditional end="\<done\>"			contains=@shLoopList
215 syn region shIf	fold transparent matchgroup=shConditional start="\<if\_s" matchgroup=shConditional skip=+-fi\>+ end="\<;\_s*then\>" end="\<fi\>"	contains=@shIfList
216 syn region shFor	fold matchgroup=shLoop start="\<for\ze\_s\s*\%(((\)\@!" end="\<in\_s" end="\<do\>"me=e-2				contains=@shLoopList,shDblParen skipwhite nextgroup=shCurlyIn
217 syn region shForPP	fold matchgroup=shLoop start='\<for\>\_s*((' end='))' contains=shTestOpr
218else
219 syn region shDo	transparent matchgroup=shConditional start="\<do\>" matchgroup=shConditional end="\<done\>"			contains=@shLoopList
220 syn region shIf	transparent matchgroup=shConditional start="\<if\_s" matchgroup=shConditional skip=+-fi\>+ end="\<;\_s*then\>" end="\<fi\>"	contains=@shIfList
221 syn region shFor	matchgroup=shLoop start="\<for\ze\_s\s*\%(((\)\@!" end="\<in\>" end="\<do\>"me=e-2			contains=@shLoopList,shDblParen skipwhite nextgroup=shCurlyIn
222 syn region shForPP	matchgroup=shLoop start='\<for\>\_s*((' end='))' contains=shTestOpr
223endif
224if exists("b:is_kornshell") || exists("b:is_bash")
225 syn cluster shCaseList	add=shRepeat
226 syn cluster shFunctionList	add=shRepeat
227 syn region shRepeat   matchgroup=shLoop   start="\<while\_s" end="\<in\_s" end="\<do\>"me=e-2	contains=@shLoopList,shDblParen,shDblBrace
228 syn region shRepeat   matchgroup=shLoop   start="\<until\_s" end="\<in\_s" end="\<do\>"me=e-2	contains=@shLoopList,shDblParen,shDblBrace
229 syn region shCaseEsac matchgroup=shConditional start="\<select\s" matchgroup=shConditional end="\<in\>" end="\<do\>" contains=@shLoopList
230else
231 syn region shRepeat   matchgroup=shLoop   start="\<while\_s" end="\<do\>"me=e-2		contains=@shLoopList
232 syn region shRepeat   matchgroup=shLoop   start="\<until\_s" end="\<do\>"me=e-2		contains=@shLoopList
233endif
234syn region shCurlyIn   contained	matchgroup=Delimiter start="{" end="}" contains=@shCurlyList
235syn match  shComma     contained	","
236
237" Case: case...esac {{{1
238" ====
239syn match   shCaseBar	contained skipwhite "\(^\|[^\\]\)\(\\\\\)*\zs|"		nextgroup=shCase,shCaseStart,shCaseBar,shComment,shCaseExSingleQuote,shCaseSingleQuote,shCaseDoubleQuote
240syn match   shCaseStart	contained skipwhite skipnl "("			nextgroup=shCase,shCaseBar
241if s:sh_fold_ifdofor
242 syn region  shCase	fold contained skipwhite skipnl matchgroup=shSnglCase start="\%(\\.\|[^#$()'" \t]\)\{-}\zs)"  end=";;" end="esac"me=s-1 contains=@shCaseList nextgroup=shCaseStart,shCase,shComment
243 syn region  shCaseEsac	fold matchgroup=shConditional start="\<case\>" end="\<esac\>"	contains=@shCaseEsacList
244else
245 syn region  shCase	contained skipwhite skipnl matchgroup=shSnglCase start="\%(\\.\|[^#$()'" \t]\)\{-}\zs)"  end=";;" end="esac"me=s-1 contains=@shCaseList nextgroup=shCaseStart,shCase,shComment
246 syn region  shCaseEsac	matchgroup=shConditional start="\<case\>" end="\<esac\>"	contains=@shCaseEsacList
247endif
248syn keyword shCaseIn	contained skipwhite skipnl in			nextgroup=shCase,shCaseStart,shCaseBar,shComment,shCaseExSingleQuote,shCaseSingleQuote,shCaseDoubleQuote
249if exists("b:is_bash")
250 syn region  shCaseExSingleQuote	matchgroup=shQuote start=+\$'+ skip=+\\\\\|\\.+ end=+'+	contains=shStringSpecial,shSpecial	skipwhite skipnl nextgroup=shCaseBar	contained
251elseif !exists("g:sh_no_error")
252 syn region  shCaseExSingleQuote	matchgroup=Error start=+\$'+ skip=+\\\\\|\\.+ end=+'+	contains=shStringSpecial	skipwhite skipnl nextgroup=shCaseBar	contained
253endif
254syn region  shCaseSingleQuote	matchgroup=shQuote start=+'+ end=+'+		contains=shStringSpecial		skipwhite skipnl nextgroup=shCaseBar	contained
255syn region  shCaseDoubleQuote	matchgroup=shQuote start=+"+ skip=+\\\\\|\\.+ end=+"+	contains=@shDblQuoteList,shStringSpecial	skipwhite skipnl nextgroup=shCaseBar	contained
256syn region  shCaseCommandSub	start=+`+ skip=+\\\\\|\\.+ end=+`+		contains=@shCommandSubList		skipwhite skipnl nextgroup=shCaseBar	contained
257if exists("b:is_bash")
258 syn region  shCaseRange	matchgroup=Delimiter start=+\[+ skip=+\\\\+ end=+\]+	contained	contains=shCharClass
259 syn match   shCharClass	'\[:\%(alnum\|alpha\|ascii\|blank\|cntrl\|digit\|graph\|lower\|print\|punct\|space\|upper\|word\|or\|xdigit\):\]'			contained
260else
261 syn region  shCaseRange	matchgroup=Delimiter start=+\[+ skip=+\\\\+ end=+\]+	contained
262endif
263" Misc: {{{1
264"======
265syn match   shWrapLineOperator "\\$"
266syn region  shCommandSub   start="`" skip="\\\\\|\\." end="`"	contains=@shCommandSubList
267syn match   shEscape	contained	'\%(^\)\@!\%(\\\\\)*\\.'
268
269" $() and $(()): {{{1
270" $(..) is not supported by sh (Bourne shell).  However, apparently
271" some systems (HP?) have as their /bin/sh a (link to) Korn shell
272" (ie. Posix compliant shell).  /bin/ksh should work for those
273" systems too, however, so the following syntax will flag $(..) as
274" an Error under /bin/sh.  By consensus of vimdev'ers!
275if exists("b:is_kornshell") || exists("b:is_bash")
276 syn region shCommandSub matchgroup=shCmdSubRegion start="\$("  skip='\\\\\|\\.' end=")"  contains=@shCommandSubList
277 syn region shArithmetic matchgroup=shArithRegion  start="\$((" skip='\\\\\|\\.' end="))" contains=@shArithList
278 syn region shArithmetic matchgroup=shArithRegion  start="\$\[" skip='\\\\\|\\.' end="\]" contains=@shArithList
279 syn match  shSkipInitWS contained	"^\s\+"
280elseif !exists("g:sh_no_error")
281 syn region shCommandSub matchgroup=Error start="\$(" end=")" contains=@shCommandSubList
282endif
283syn region shCmdParenRegion matchgroup=shCmdSubRegion start="(\ze[^(]" skip='\\\\\|\\.' end=")" contains=@shCommandSubList
284
285if exists("b:is_bash")
286 syn cluster shCommandSubList add=bashSpecialVariables,bashStatement
287 syn cluster shCaseList add=bashAdminStatement,bashStatement
288 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
289 syn keyword bashStatement chmod clear complete du egrep expr fgrep find gnufind gnugrep grep less ls mkdir mv rm rmdir rpm sed sleep sort strip tail touch
290 syn keyword bashAdminStatement daemon killall killproc nice reload restart start status stop
291 syn keyword bashStatement	command compgen
292endif
293
294if exists("b:is_kornshell")
295 syn cluster shCommandSubList add=kshSpecialVariables,kshStatement
296 syn cluster shCaseList add=kshStatement
297 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
298 syn keyword kshStatement cat chmod clear cp du egrep expr fgrep find grep killall less ls mkdir mv nice printenv rm rmdir sed sort strip stty tail touch tput
299 syn keyword kshStatement command setgroups setsenv
300endif
301
302syn match   shSource	"^\.\s"
303syn match   shSource	"\s\.\s"
304"syn region  shColon	start="^\s*:" end="$" end="\s#"me=e-2 contains=@shColonList
305"syn region  shColon	start="^\s*\zs:" end="$" end="\s#"me=e-2
306syn match   shColon	'^\s*\zs:'
307
308" String And Character Constants: {{{1
309"================================
310syn match   shNumber	"-\=\<\d\+\>#\="
311syn match   shCtrlSeq	"\\\d\d\d\|\\[abcfnrtv0]"		contained
312if exists("b:is_bash")
313 syn match   shSpecial	"\\\o\o\o\|\\x\x\x\|\\c[^"]\|\\[abefnrtv]"	contained
314endif
315if exists("b:is_bash")
316 syn region  shExSingleQuote	matchgroup=shQuote start=+\$'+ skip=+\\\\\|\\.+ end=+'+	contains=shStringSpecial,shSpecial
317 syn region  shExDoubleQuote	matchgroup=shQuote start=+\$"+ skip=+\\\\\|\\.\|\\"+ end=+"+	contains=@shDblQuoteList,shStringSpecial,shSpecial
318elseif !exists("g:sh_no_error")
319 syn region  shExSingleQuote	matchGroup=Error start=+\$'+ skip=+\\\\\|\\.+ end=+'+	contains=shStringSpecial
320 syn region  shExDoubleQuote	matchGroup=Error start=+\$"+ skip=+\\\\\|\\.+ end=+"+	contains=shStringSpecial
321endif
322syn region  shSingleQuote	matchgroup=shQuote start=+'+ end=+'+		contains=@Spell
323syn region  shDoubleQuote	matchgroup=shQuote start=+\%(\%(\\\\\)*\\\)\@<!"+ skip=+\\"+ end=+"+	contains=@shDblQuoteList,shStringSpecial,@Spell
324syn region  shDoubleQuote	matchgroup=shQuote start=+"+ skip=+\\"+ end=+"+	contains=@shDblQuoteList,shStringSpecial,@Spell
325syn match   shStringSpecial	"[^[:print:] \t]"		contained
326syn match   shStringSpecial	"\%(\\\\\)*\\[\\"'`$()#]"
327" COMBAK: why is ,shComment on next line???
328syn match   shSpecial	"[^\\]\zs\%(\\\\\)*\\[\\"'`$()#]"	nextgroup=shMoreSpecial,shComment
329syn match   shSpecial	"^\%(\\\\\)*\\[\\"'`$()#]"		nextgroup=shComment
330syn match   shMoreSpecial	"\%(\\\\\)*\\[\\"'`$()#]"		nextgroup=shMoreSpecial contained
331
332" Comments: {{{1
333"==========
334syn cluster	shCommentGroup	contains=shTodo,@Spell
335syn keyword	shTodo	contained		COMBAK FIXME TODO XXX
336syn match	shComment		"^\s*\zs#.*$"	contains=@shCommentGroup
337syn match	shComment		"\s\zs#.*$"	contains=@shCommentGroup
338syn match	shComment	contained	"#.*$"	contains=@shCommentGroup
339syn match	shQuickComment	contained	"#.*$"
340
341" Here Documents: {{{1
342" =========================================
343if version < 600
344 syn region shHereDoc matchgroup=shHereDoc01 start="<<\s*\**END[a-zA-Z_0-9]*\**" 	matchgroup=shHereDoc01 end="^END[a-zA-Z_0-9]*$"	contains=@shDblQuoteList
345 syn region shHereDoc matchgroup=shHereDoc02 start="<<-\s*\**END[a-zA-Z_0-9]*\**"	matchgroup=shHereDoc02 end="^\s*END[a-zA-Z_0-9]*$"	contains=@shDblQuoteList
346 syn region shHereDoc matchgroup=shHereDoc03 start="<<\s*\**EOF\**"		matchgroup=shHereDoc03 end="^EOF$"	contains=@shDblQuoteList
347 syn region shHereDoc matchgroup=shHereDoc04 start="<<-\s*\**EOF\**"		matchgroup=shHereDoc04 end="^\s*EOF$"	contains=@shDblQuoteList
348 syn region shHereDoc matchgroup=shHereDoc05 start="<<\s*\**\.\**"		matchgroup=shHereDoc05 end="^\.$"	contains=@shDblQuoteList
349 syn region shHereDoc matchgroup=shHereDoc06 start="<<-\s*\**\.\**"		matchgroup=shHereDoc06 end="^\s*\.$"	contains=@shDblQuoteList
350
351elseif s:sh_fold_heredoc
352 syn region shHereDoc matchgroup=shHereDoc07 fold start="<<\s*\z([^ \t|]*\)"		matchgroup=shHereDoc07 end="^\z1\s*$"	contains=@shDblQuoteList
353 syn region shHereDoc matchgroup=shHereDoc08 fold start="<<\s*\"\z([^ \t|]*\)\""	matchgroup=shHereDoc08 end="^\z1\s*$"
354 syn region shHereDoc matchgroup=shHereDoc09 fold start="<<\s*'\z([^ \t|]*\)'"		matchgroup=shHereDoc09 end="^\z1\s*$"
355 syn region shHereDoc matchgroup=shHereDoc10 fold start="<<-\s*\z([^ \t|]*\)"		matchgroup=shHereDoc10 end="^\s*\z1\s*$"	contains=@shDblQuoteList
356 syn region shHereDoc matchgroup=shHereDoc11 fold start="<<-\s*\"\z([^ \t|]*\)\""	matchgroup=shHereDoc11 end="^\s*\z1\s*$"
357 syn region shHereDoc matchgroup=shHereDoc12 fold start="<<-\s*'\z([^ \t|]*\)'"		matchgroup=shHereDoc12 end="^\s*\z1\s*$"
358 syn region shHereDoc matchgroup=shHereDoc13 fold start="<<\s*\\\_$\_s*\z([^ \t|]*\)"	matchgroup=shHereDoc13 end="^\z1\s*$"
359 syn region shHereDoc matchgroup=shHereDoc14 fold start="<<\s*\\\_$\_s*\"\z([^ \t|]*\)\""	matchgroup=shHereDoc14 end="^\z1\s*$"
360 syn region shHereDoc matchgroup=shHereDoc15 fold start="<<-\s*\\\_$\_s*'\z([^ \t|]*\)'"	matchgroup=shHereDoc15 end="^\s*\z1\s*$"
361 syn region shHereDoc matchgroup=shHereDoc16 fold start="<<-\s*\\\_$\_s*\z([^ \t|]*\)"	matchgroup=shHereDoc16 end="^\s*\z1\s*$"
362 syn region shHereDoc matchgroup=shHereDoc17 fold start="<<-\s*\\\_$\_s*\"\z([^ \t|]*\)\""	matchgroup=shHereDoc17 end="^\s*\z1\s*$"
363 syn region shHereDoc matchgroup=shHereDoc18 fold start="<<\s*\\\_$\_s*'\z([^ \t|]*\)'"	matchgroup=shHereDoc18 end="^\z1\s*$"
364 syn region shHereDoc matchgroup=shHereDoc19 fold start="<<\\\z([^ \t|]*\)"		matchgroup=shHereDoc19 end="^\z1\s*$"
365
366else
367 syn region shHereDoc matchgroup=shHereDoc20 start="<<\s*\\\=\z([^ \t|]*\)"		matchgroup=shHereDoc20 end="^\z1\s*$"    contains=@shDblQuoteList
368 syn region shHereDoc matchgroup=shHereDoc21 start="<<\s*\"\z([^ \t|]*\)\""		matchgroup=shHereDoc21 end="^\z1\s*$"
369 syn region shHereDoc matchgroup=shHereDoc22 start="<<-\s*\z([^ \t|]*\)"		matchgroup=shHereDoc22 end="^\s*\z1\s*$" contains=@shDblQuoteList
370 syn region shHereDoc matchgroup=shHereDoc23 start="<<-\s*'\z([^ \t|]*\)'"		matchgroup=shHereDoc23 end="^\s*\z1\s*$"
371 syn region shHereDoc matchgroup=shHereDoc24 start="<<\s*'\z([^ \t|]*\)'"		matchgroup=shHereDoc24 end="^\z1\s*$"
372 syn region shHereDoc matchgroup=shHereDoc25 start="<<-\s*\"\z([^ \t|]*\)\""		matchgroup=shHereDoc25 end="^\s*\z1\s*$"
373 syn region shHereDoc matchgroup=shHereDoc26 start="<<\s*\\\_$\_s*\z([^ \t|]*\)"	matchgroup=shHereDoc26 end="^\z1\s*$"
374 syn region shHereDoc matchgroup=shHereDoc27 start="<<-\s*\\\_$\_s*\z([^ \t|]*\)"	matchgroup=shHereDoc27 end="^\s*\z1\s*$"
375 syn region shHereDoc matchgroup=shHereDoc28 start="<<-\s*\\\_$\_s*'\z([^ \t|]*\)'"	matchgroup=shHereDoc28 end="^\s*\z1\s*$"
376 syn region shHereDoc matchgroup=shHereDoc29 start="<<\s*\\\_$\_s*'\z([^ \t|]*\)'"	matchgroup=shHereDoc29 end="^\z1\s*$"
377 syn region shHereDoc matchgroup=shHereDoc30 start="<<\s*\\\_$\_s*\"\z([^ \t|]*\)\""	matchgroup=shHereDoc30 end="^\z1\s*$"
378 syn region shHereDoc matchgroup=shHereDoc31 start="<<-\s*\\\_$\_s*\"\z([^ \t|]*\)\""	matchgroup=shHereDoc31 end="^\s*\z1\s*$"
379 syn region shHereDoc matchgroup=shHereDoc32 start="<<\\\z([^ \t|]*\)"		matchgroup=shHereDoc32 end="^\z1\s*$"
380endif
381
382" Here Strings: {{{1
383" =============
384" available for: bash; ksh (really should be ksh93 only) but not if its a posix
385if exists("b:is_bash") || (exists("b:is_kornshell") && !exists("g:is_posix"))
386 syn match shRedir "<<<"	skipwhite	nextgroup=shCmdParenRegion
387endif
388
389" Identifiers: {{{1
390"=============
391syn match  shSetOption	"\s\zs[-+][a-zA-Z0-9]\+\>"	contained
392syn match  shVariable	"\<\([bwglsav]:\)\=[a-zA-Z0-9.!@_%+,]*\ze="	nextgroup=shVarAssign
393syn match  shVarAssign	"="		contained	nextgroup=shCmdParenRegion,shPattern,shDeref,shDerefSimple,shDoubleQuote,shExDoubleQuote,shSingleQuote,shExSingleQuote
394syn region shAtExpr	contained	start="@(" end=")" contains=@shIdList
395if exists("b:is_bash")
396 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
397 syn region shSetList oneline matchgroup=shSet start="\<set\>\ze[^/]" end="\ze[;|)]\|$"			matchgroup=shSetListDelim end="\ze[}|);&]" matchgroup=NONE end="\ze\s\+="	contains=@shIdList
398elseif exists("b:is_kornshell")
399 syn region shSetList oneline matchgroup=shSet start="\<\(typeset\|export\|unset\)\>\ze[^/]" end="$"		matchgroup=shSetListDelim end="\ze[}|);&]" matchgroup=NONE end="\ze\s\+[#=]"	contains=@shIdList
400 syn region shSetList oneline matchgroup=shSet start="\<set\>\ze[^/]" end="$"				matchgroup=shSetListDelim end="\ze[}|);&]" matchgroup=NONE end="\ze\s\+[#=]"	contains=@shIdList
401else
402 syn region shSetList oneline matchgroup=shSet start="\<\(set\|export\|unset\)\>\ze[^/]" end="$"		matchgroup=shSetListDelim end="\ze[}|);&]" matchgroup=NONE end="\ze\s\+[#=]"	contains=@shIdList
403endif
404
405" Functions: {{{1
406if !exists("g:is_posix")
407 syn keyword shFunctionKey function	skipwhite skipnl nextgroup=shFunctionTwo
408endif
409
410if exists("b:is_bash")
411 if s:sh_fold_functions
412  syn region shFunctionOne	fold	matchgroup=shFunction start="^\s*\h[-a-zA-Z_0-9]*\s*()\_s*{"	end="}"	contains=@shFunctionList			skipwhite skipnl nextgroup=shFunctionStart,shQuickComment
413  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
414  syn region shFunctionThree	fold	matchgroup=shFunction start="^\s*\h[-a-zA-Z_0-9]*\s*()\_s*("	end=")"	contains=@shFunctionList			skipwhite skipnl nextgroup=shFunctionStart,shQuickComment
415  syn region shFunctionFour	fold	matchgroup=shFunction start="\h[-a-zA-Z_0-9]*\s*\%(()\)\=\_s*)"	end=")"	contains=shFunctionKey,@shFunctionList contained	skipwhite skipnl nextgroup=shFunctionStart,shQuickComment
416 else
417  syn region shFunctionOne		matchgroup=shFunction start="^\s*\h[-a-zA-Z_0-9]*\s*()\_s*{"	end="}"	contains=@shFunctionList
418  syn region shFunctionTwo		matchgroup=shFunction start="\h[-a-zA-Z_0-9]*\s*\%(()\)\=\_s*{"	end="}"	contains=shFunctionKey,@shFunctionList contained
419  syn region shFunctionThree		matchgroup=shFunction start="^\s*\h[-a-zA-Z_0-9]*\s*()\_s*("	end=")"	contains=@shFunctionList
420  syn region shFunctionFour		matchgroup=shFunction start="\h[-a-zA-Z_0-9]*\s*\%(()\)\=\_s*("	end=")"	contains=shFunctionKey,@shFunctionList contained
421 endif
422else
423 if s:sh_fold_functions
424  syn region shFunctionOne	fold	matchgroup=shFunction start="^\s*\h\w*\s*()\_s*{"	end="}"	contains=@shFunctionList	       skipwhite skipnl		nextgroup=shFunctionStart,shQuickComment
425  syn region shFunctionTwo	fold	matchgroup=shFunction start="\h\w*\s*\%(()\)\=\_s*{"	end="}"	contains=shFunctionKey,@shFunctionList contained skipwhite skipnl	nextgroup=shFunctionStart,shQuickComment
426  syn region shFunctionThree	fold	matchgroup=shFunction start="^\s*\h\w*\s*()\_s*("	end=")"	contains=@shFunctionList	       skipwhite skipnl		nextgroup=shFunctionStart,shQuickComment
427  syn region shFunctionFour	fold	matchgroup=shFunction start="\h\w*\s*\%(()\)\=\_s*("	end=")"	contains=shFunctionKey,@shFunctionList contained skipwhite skipnl	nextgroup=shFunctionStart,shQuickComment
428 else
429  syn region shFunctionOne		matchgroup=shFunction start="^\s*\h\w*\s*()\_s*{"	end="}"	contains=@shFunctionList
430  syn region shFunctionTwo		matchgroup=shFunction start="\h\w*\s*\%(()\)\=\_s*{"	end="}"	contains=shFunctionKey,@shFunctionList contained
431  syn region shFunctionThree		matchgroup=shFunction start="^\s*\h\w*\s*()\_s*("	end=")"	contains=@shFunctionList
432  syn region shFunctionFour		matchgroup=shFunction start="\h\w*\s*\%(()\)\=\_s*("	end=")"	contains=shFunctionKey,@shFunctionList contained
433 endif
434endif
435
436" Parameter Dereferencing: {{{1
437" ========================
438syn match  shDerefSimple	"\$\%(\k\+\|\d\)"
439syn region shDeref	matchgroup=PreProc start="\${" end="}"	contains=@shDerefList,shDerefVarArray
440if !exists("g:sh_no_error")
441 syn match  shDerefWordError	"[^}$[]"	contained
442endif
443syn match  shDerefSimple	"\$[-#*@!?]"
444syn match  shDerefSimple	"\$\$"
445if exists("b:is_bash") || exists("b:is_kornshell")
446 syn region shDeref	matchgroup=PreProc start="\${##\=" end="}"	contains=@shDerefList
447 syn region shDeref	matchgroup=PreProc start="\${\$\$" end="}"	contains=@shDerefList
448endif
449
450" bash: ${!prefix*} and ${#parameter}: {{{1
451" ====================================
452if exists("b:is_bash")
453 syn region shDeref	matchgroup=PreProc start="\${!" end="\*\=}"	contains=@shDerefList,shDerefOp
454 syn match  shDerefVar	contained	"{\@<=!\k\+"		nextgroup=@shDerefVarList
455endif
456
457syn match  shDerefSpecial	contained	"{\@<=[-*@?0]"		nextgroup=shDerefOp,shDerefOpError
458syn match  shDerefSpecial	contained	"\({[#!]\)\@<=[[:alnum:]*@_]\+"	nextgroup=@shDerefVarList,shDerefOp
459syn match  shDerefVar	contained	"{\@<=\k\+"		nextgroup=@shDerefVarList
460
461" sh ksh bash : ${var[... ]...}  array reference: {{{1
462syn region  shDerefVarArray   contained	matchgroup=shDeref start="\[" end="]"	contains=@shCommandSubList nextgroup=shDerefOp,shDerefOpError
463
464" Special ${parameter OPERATOR word} handling: {{{1
465" sh ksh bash : ${parameter:-word}    word is default value
466" sh ksh bash : ${parameter:=word}    assign word as default value
467" sh ksh bash : ${parameter:?word}    display word if parameter is null
468" sh ksh bash : ${parameter:+word}    use word if parameter is not null, otherwise nothing
469"    ksh bash : ${parameter#pattern}  remove small left  pattern
470"    ksh bash : ${parameter##pattern} remove large left  pattern
471"    ksh bash : ${parameter%pattern}  remove small right pattern
472"    ksh bash : ${parameter%%pattern} remove large right pattern
473"        bash : ${parameter^pattern}  Case modification
474"        bash : ${parameter^^pattern} Case modification
475"        bash : ${parameter,pattern}  Case modification
476"        bash : ${parameter,,pattern} Case modification
477syn cluster shDerefPatternList	contains=shDerefPattern,shDerefString
478if !exists("g:sh_no_error")
479 syn match shDerefOpError	contained	":[[:punct:]]"
480endif
481syn match  shDerefOp	contained	":\=[-=?]"	nextgroup=@shDerefPatternList
482syn match  shDerefOp	contained	":\=+"	nextgroup=@shDerefPatternList
483if exists("b:is_bash") || exists("b:is_kornshell")
484 syn match  shDerefOp	contained	"#\{1,2}"	nextgroup=@shDerefPatternList
485 syn match  shDerefOp	contained	"%\{1,2}"	nextgroup=@shDerefPatternList
486 syn match  shDerefPattern	contained	"[^{}]\+"	contains=shDeref,shDerefSimple,shDerefPattern,shDerefString,shCommandSub,shDerefEscape nextgroup=shDerefPattern
487 syn region shDerefPattern	contained	start="{" end="}"	contains=shDeref,shDerefSimple,shDerefString,shCommandSub nextgroup=shDerefPattern
488 syn match  shDerefEscape	contained	'\%(\\\\\)*\\.'
489endif
490if exists("b:is_bash")
491 syn match  shDerefOp	contained	"[,^]\{1,2}"	nextgroup=@shDerefPatternList
492endif
493syn region shDerefString	contained	matchgroup=shDerefDelim start=+\%(\\\)\@<!'+ end=+'+		contains=shStringSpecial
494syn region shDerefString	contained	matchgroup=shDerefDelim start=+\%(\\\)\@<!"+ skip=+\\"+ end=+"+	contains=@shDblQuoteList,shStringSpecial
495syn match  shDerefString	contained	"\\["']"	nextgroup=shDerefPattern
496
497if exists("b:is_bash")
498 " bash : ${parameter:offset}
499 " bash : ${parameter:offset:length}
500 syn region shDerefOp	contained	start=":[$[:alnum:]_]"me=e-1 end=":"me=e-1 end="}"me=e-1 contains=@shCommandSubList nextgroup=shDerefPOL
501 syn match  shDerefPOL	contained	":[^}]\+"	contains=@shCommandSubList
502
503 " bash : ${parameter//pattern/string}
504 " bash : ${parameter//pattern}
505 syn match  shDerefPPS	contained	'/\{1,2}'	nextgroup=shDerefPPSleft
506 syn region shDerefPPSleft	contained	start='.'	skip=@\%(\\\\\)*\\/@ matchgroup=shDerefOp	end='/' end='\ze}' nextgroup=shDerefPPSright contains=@shCommandSubList
507 syn region shDerefPPSright	contained	start='.'	skip=@\%(\\\\\)\+@		end='\ze}'	contains=@shCommandSubList
508endif
509
510" Arithmetic Parenthesized Expressions: {{{1
511"syn region shParen matchgroup=shArithRegion start='[^$]\zs(\%(\ze[^(]\|$\)' end=')' contains=@shArithParenList
512syn region shParen matchgroup=shArithRegion start='\$\@!(\%(\ze[^(]\|$\)' end=')' contains=@shArithParenList
513
514" Useful sh Keywords: {{{1
515" ===================
516syn keyword shStatement break cd chdir continue eval exec exit kill newgrp pwd read readonly return shift test trap ulimit umask wait
517syn keyword shConditional contained elif else then
518if !exists("g:sh_no_error")
519 syn keyword shCondError elif else then
520endif
521
522" Useful ksh Keywords: {{{1
523" ====================
524if exists("b:is_kornshell") || exists("b:is_bash")
525 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
526 if exists("g:is_posix")
527  syn keyword shStatement command
528 else
529  syn keyword shStatement time
530 endif
531
532" Useful bash Keywords: {{{1
533" =====================
534 if exists("b:is_bash")
535  syn keyword shStatement bind builtin dirs disown enable help local logout popd pushd shopt source
536 else
537  syn keyword shStatement login newgrp
538 endif
539endif
540
541" Synchronization: {{{1
542" ================
543if !exists("sh_minlines")
544  let sh_minlines = 200
545endif
546if !exists("sh_maxlines")
547  let sh_maxlines = 2 * sh_minlines
548endif
549exec "syn sync minlines=" . sh_minlines . " maxlines=" . sh_maxlines
550syn sync match shCaseEsacSync	grouphere	shCaseEsac	"\<case\>"
551syn sync match shCaseEsacSync	groupthere	shCaseEsac	"\<esac\>"
552syn sync match shDoSync	grouphere	shDo	"\<do\>"
553syn sync match shDoSync	groupthere	shDo	"\<done\>"
554syn sync match shForSync	grouphere	shFor	"\<for\>"
555syn sync match shForSync	groupthere	shFor	"\<in\>"
556syn sync match shIfSync	grouphere	shIf	"\<if\>"
557syn sync match shIfSync	groupthere	shIf	"\<fi\>"
558syn sync match shUntilSync	grouphere	shRepeat	"\<until\>"
559syn sync match shWhileSync	grouphere	shRepeat	"\<while\>"
560
561" Default Highlighting: {{{1
562" =====================
563hi def link shArithRegion	shShellVariables
564hi def link shAtExpr	shSetList
565hi def link shBeginHere	shRedir
566hi def link shCaseBar	shConditional
567hi def link shCaseCommandSub	shCommandSub
568hi def link shCaseDoubleQuote	shDoubleQuote
569hi def link shCaseIn	shConditional
570hi def link shQuote	shOperator
571hi def link shCaseSingleQuote	shSingleQuote
572hi def link shCaseStart	shConditional
573hi def link shCmdSubRegion	shShellVariables
574hi def link shColon	shComment
575hi def link shDerefOp	shOperator
576hi def link shDerefPOL	shDerefOp
577hi def link shDerefPPS	shDerefOp
578hi def link shDeref	shShellVariables
579hi def link shDerefDelim	shOperator
580hi def link shDerefSimple	shDeref
581hi def link shDerefSpecial	shDeref
582hi def link shDerefString	shDoubleQuote
583hi def link shDerefVar	shDeref
584hi def link shDoubleQuote	shString
585hi def link shEcho	shString
586hi def link shEchoDelim	shOperator
587hi def link shEchoQuote	shString
588hi def link shForPP	shLoop
589hi def link shEmbeddedEcho	shString
590hi def link shEscape	shCommandSub
591hi def link shExDoubleQuote	shDoubleQuote
592hi def link shExSingleQuote	shSingleQuote
593hi def link shFunction	Function
594hi def link shHereDoc	shString
595hi def link shHerePayload	shHereDoc
596hi def link shLoop	shStatement
597hi def link shMoreSpecial	shSpecial
598hi def link shOption	shCommandSub
599hi def link shPattern	shString
600hi def link shParen	shArithmetic
601hi def link shPosnParm	shShellVariables
602hi def link shQuickComment	shComment
603hi def link shRange	shOperator
604hi def link shRedir	shOperator
605hi def link shSetListDelim	shOperator
606hi def link shSetOption	shOption
607hi def link shSingleQuote	shString
608hi def link shSource	shOperator
609hi def link shStringSpecial	shSpecial
610hi def link shSubShRegion	shOperator
611hi def link shTestOpr	shConditional
612hi def link shTestPattern	shString
613hi def link shTestDoubleQuote	shString
614hi def link shTestSingleQuote	shString
615hi def link shVariable	shSetList
616hi def link shWrapLineOperator	shOperator
617
618if exists("b:is_bash")
619  hi def link bashAdminStatement	shStatement
620  hi def link bashSpecialVariables	shShellVariables
621  hi def link bashStatement		shStatement
622  hi def link shFunctionParen		Delimiter
623  hi def link shFunctionDelim		Delimiter
624  hi def link shCharClass		shSpecial
625endif
626if exists("b:is_kornshell")
627  hi def link kshSpecialVariables	shShellVariables
628  hi def link kshStatement		shStatement
629  hi def link shFunctionParen		Delimiter
630endif
631
632if !exists("g:sh_no_error")
633 hi def link shCaseError		Error
634 hi def link shCondError		Error
635 hi def link shCurlyError		Error
636 hi def link shDerefError		Error
637 hi def link shDerefOpError		Error
638 hi def link shDerefWordError		Error
639 hi def link shDoError		Error
640 hi def link shEsacError		Error
641 hi def link shIfError		Error
642 hi def link shInError		Error
643 hi def link shParenError		Error
644 hi def link shTestError		Error
645 if exists("b:is_kornshell")
646   hi def link shDTestError		Error
647 endif
648endif
649
650hi def link shArithmetic		Special
651hi def link shCharClass		Identifier
652hi def link shSnglCase		Statement
653hi def link shCommandSub		Special
654hi def link shComment		Comment
655hi def link shConditional		Conditional
656hi def link shCtrlSeq		Special
657hi def link shExprRegion		Delimiter
658hi def link shFunctionKey		Function
659hi def link shFunctionName		Function
660hi def link shNumber		Number
661hi def link shOperator		Operator
662hi def link shRepeat		Repeat
663hi def link shSet		Statement
664hi def link shSetList		Identifier
665hi def link shShellVariables		PreProc
666hi def link shSpecial		Special
667hi def link shStatement		Statement
668hi def link shString		String
669hi def link shTodo		Todo
670hi def link shAlias		Identifier
671hi def link shHereDoc01		shRedir
672hi def link shHereDoc02		shRedir
673hi def link shHereDoc03		shRedir
674hi def link shHereDoc04		shRedir
675hi def link shHereDoc05		shRedir
676hi def link shHereDoc06		shRedir
677hi def link shHereDoc07		shRedir
678hi def link shHereDoc08		shRedir
679hi def link shHereDoc09		shRedir
680hi def link shHereDoc10		shRedir
681hi def link shHereDoc11		shRedir
682hi def link shHereDoc12		shRedir
683hi def link shHereDoc13		shRedir
684hi def link shHereDoc14		shRedir
685hi def link shHereDoc15		shRedir
686hi def link shHereDoc16		shRedir
687hi def link shHereDoc17		shRedir
688hi def link shHereDoc18		shRedir
689hi def link shHereDoc19		shRedir
690hi def link shHereDoc20		shRedir
691hi def link shHereDoc21		shRedir
692hi def link shHereDoc22		shRedir
693hi def link shHereDoc23		shRedir
694hi def link shHereDoc24		shRedir
695hi def link shHereDoc25		shRedir
696hi def link shHereDoc26		shRedir
697hi def link shHereDoc27		shRedir
698hi def link shHereDoc28		shRedir
699hi def link shHereDoc29		shRedir
700hi def link shHereDoc30		shRedir
701hi def link shHereDoc31		shRedir
702hi def link shHereDoc32		shRedir
703
704" Set Current Syntax: {{{1
705" ===================
706if exists("b:is_bash")
707 let b:current_syntax = "bash"
708elseif exists("b:is_kornshell")
709 let b:current_syntax = "ksh"
710else
711 let b:current_syntax = "sh"
712endif
713
714" vim: ts=16 fdm=marker
715