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