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