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