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