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