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