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