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