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