1
0
Fork 0
mirror of https://github.com/vim/vim synced 2025-03-16 06:47:52 +01:00
vim/runtime/syntax/sh.vim

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

902 lines
51 KiB
VimL
Raw Normal View History

2004-06-13 20:20:40 +00:00
" Vim syntax file
" Language: shell (sh) Korn shell (ksh) bash (sh)
" Maintainer: This runtime file is looking for a new maintainer.
" Previous Maintainers: Charles E. Campbell
" Lennart Schultz <Lennart.Schultz@ecmwf.int>
" Last Change: 2024 Mar 04 by Vim Project
" 2024 Nov 03 by Aliaksei Budavei <0x000c70 AT gmail DOT com> (improved bracket expressions, #15941)
" 2025 Jan 06 add $PS0 to bashSpecialVariables (#16394)
" 2025 Jan 18 add bash coproc, remove duplicate syn keywords (#16467)
2023-04-22 22:40:14 +01:00
" Version: 208
" Former URL: http://www.drchip.org/astronaut/vim/index.html#SYNTAX_SH
2015-01-10 15:09:25 +01:00
" For options and settings, please use: :help ft-sh-syntax
2020-11-29 14:36:24 +01:00
" This file includes many ideas from Eric Brunet (eric.brunet@ens.fr) and heredoc fixes from Felipe Contreras
2004-06-13 20:20:40 +00:00
" quit when a syntax file was already loaded {{{1
if exists("b:current_syntax")
2004-06-13 20:20:40 +00:00
finish
endif
2021-05-30 20:54:13 +02:00
" If the shell script itself specifies which shell to use, use it
if getline(1) =~ '\<ksh\>'
2016-05-08 09:50:29 +02:00
let b:is_kornshell = 1
2021-05-30 20:54:13 +02:00
elseif getline(1) =~ '\<bash\>'
2016-05-08 09:50:29 +02:00
let b:is_bash = 1
2021-05-30 20:54:13 +02:00
elseif getline(1) =~ '\<dash\>'
2020-09-28 21:48:16 +02:00
let b:is_dash = 1
elseif !exists("g:is_kornshell") && !exists("g:is_bash") && !exists("g:is_posix") && !exists("g:is_sh") && !exists("g:is_dash")
" user did not specify which shell to use, and
2021-05-30 20:54:13 +02:00
" the script itself does not specify which shell to use. FYI: /bin/sh is ambiguous.
" Assuming /bin/sh is executable, and if its a link, find out what it links to.
2013-07-05 21:01:22 +02:00
let s:shell = ""
2011-09-21 19:22:10 +02:00
if executable("/bin/sh")
2013-07-05 21:01:22 +02:00
let s:shell = resolve("/bin/sh")
2011-09-21 19:22:10 +02:00
elseif executable("/usr/bin/sh")
2013-07-05 21:01:22 +02:00
let s:shell = resolve("/usr/bin/sh")
endif
2021-05-30 20:54:13 +02:00
if s:shell =~ '\<ksh\>'
2016-05-08 09:50:29 +02:00
let b:is_kornshell= 1
2021-05-30 20:54:13 +02:00
elseif s:shell =~ '\<bash\>'
2016-05-08 09:50:29 +02:00
let b:is_bash = 1
2021-05-30 20:54:13 +02:00
elseif s:shell =~ '\<dash\>'
2020-09-28 21:48:16 +02:00
let b:is_dash = 1
2011-09-21 19:22:10 +02:00
endif
2013-07-05 21:01:22 +02:00
unlet s:shell
2011-09-21 19:22:10 +02:00
endif
2004-09-02 19:12:26 +00:00
" handling /bin/sh with is_kornshell/is_sh {{{1
2021-05-30 20:54:13 +02:00
" b:is_sh will be set when "#! /bin/sh" is found;
2004-06-13 20:20:40 +00:00
" However, it often is just a masquerade by bash (typically Linux)
" or kornshell (typically workstations with Posix "sh").
2011-09-21 19:22:10 +02:00
" So, when the user sets "g:is_bash", "g:is_kornshell",
" or "g:is_posix", a b:is_sh is converted into b:is_bash/b:is_kornshell,
2004-06-13 20:20:40 +00:00
" respectively.
2020-09-28 21:48:16 +02:00
if !exists("b:is_kornshell") && !exists("b:is_bash") && !exists("b:is_dash")
2006-04-13 20:37:35 +00:00
if exists("g:is_posix") && !exists("g:is_kornshell")
let g:is_kornshell= g:is_posix
endif
if exists("g:is_kornshell")
2004-06-13 20:20:40 +00:00
let b:is_kornshell= 1
if exists("b:is_sh")
unlet b:is_sh
endif
2006-04-13 20:37:35 +00:00
elseif exists("g:is_bash")
2004-06-13 20:20:40 +00:00
let b:is_bash= 1
if exists("b:is_sh")
unlet b:is_sh
endif
2020-09-28 21:48:16 +02:00
elseif exists("g:is_dash")
let b:is_dash= 1
if exists("b:is_sh")
unlet b:is_sh
endif
2004-06-13 20:20:40 +00:00
else
let b:is_sh= 1
endif
endif
2020-09-28 21:48:16 +02:00
" if b:is_dash, set b:is_posix too
if exists("b:is_dash")
let b:is_posix= 1
endif
2005-03-11 22:46:48 +00:00
" set up default g:sh_fold_enabled {{{1
2015-11-10 21:15:48 +01:00
" ================================
2004-06-13 20:20:40 +00:00
if !exists("g:sh_fold_enabled")
let g:sh_fold_enabled= 0
2004-12-09 21:34:53 +00:00
elseif g:sh_fold_enabled != 0 && !has("folding")
let g:sh_fold_enabled= 0
2005-03-11 22:46:48 +00:00
echomsg "Ignoring g:sh_fold_enabled=".g:sh_fold_enabled."; need to re-compile vim for +fold support"
endif
2022-12-06 18:20:10 +00:00
let s:sh_fold_functions= and(g:sh_fold_enabled,1)
let s:sh_fold_heredoc = and(g:sh_fold_enabled,2)
let s:sh_fold_ifdofor = and(g:sh_fold_enabled,4)
2005-03-11 22:46:48 +00:00
if g:sh_fold_enabled && &fdm == "manual"
2012-11-15 21:28:22 +01:00
" Given that the user provided g:sh_fold_enabled
" AND g:sh_fold_enabled is manual (usual default)
" implies a desire for syntax-based folding
setl fdm=syntax
2004-06-13 20:20:40 +00:00
endif
2021-05-30 20:54:13 +02:00
" set up the syntax-highlighting for iskeyword
2019-04-04 13:11:03 +02:00
if (v:version == 704 && has("patch-7.4.1142")) || v:version > 704
2021-05-30 20:54:13 +02:00
if !exists("g:sh_syntax_isk") || (exists("g:sh_syntax_isk") && g:sh_syntax_isk)
if exists("b:is_bash")
exe "syn iskeyword ".&iskeyword.",-,:"
else
exe "syn iskeyword ".&iskeyword.",-"
endif
2016-05-08 09:50:29 +02:00
endif
2016-02-20 15:47:01 +01:00
endif
2015-11-10 21:15:48 +01:00
" Set up folding commands for shell {{{1
" =================================
2022-12-06 18:20:10 +00:00
sil! delc ShFoldFunctions
sil! delc ShFoldHereDoc
sil! delc ShFoldIfDoFor
2015-11-10 21:15:48 +01:00
if s:sh_fold_functions
com! -nargs=* ShFoldFunctions <args> fold
else
com! -nargs=* ShFoldFunctions <args>
endif
if s:sh_fold_heredoc
com! -nargs=* ShFoldHereDoc <args> fold
else
com! -nargs=* ShFoldHereDoc <args>
endif
if s:sh_fold_ifdofor
com! -nargs=* ShFoldIfDoFor <args> fold
else
com! -nargs=* ShFoldIfDoFor <args>
endif
" Generate bracket expression items {{{1
" =================================
" Note that the following function can be invoked as many times as necessary
" provided that these constraints hold for the passed dictionary argument:
" - every time a unique group-name value is assigned to the "itemGroup" key;
" - only ONCE either the "extraArgs" key is not entered or it is entered and
" its value does not have "contained" among other optional arguments (":help
" :syn-arguments").
fun! s:GenerateBracketExpressionItems(dict) abort
let itemGroup = a:dict.itemGroup
let bracketGroup = a:dict.bracketGroup
let invGroup = itemGroup . 'Inv'
let skipLeftBracketGroup = itemGroup . 'SkipLeftBracket'
let skipRightBracketGroup = itemGroup . 'SkipRightBracket'
let extraArgs = has_key(a:dict, 'extraArgs') ? a:dict.extraArgs : ''
" Make the leading "[!^]" stand out in a NON-matching expression.
exec 'syn match ' . invGroup . ' contained "\[\@<=[!^]"'
" Set up indirections for unbalanced-bracket highlighting.
exec 'syn region ' . skipRightBracketGroup . ' contained matchgroup=' . bracketGroup . ' start="\[\%([!^]\=\\\=\]\)\@=" matchgroup=shCollSymb end="\[\.[^]]\{-}\][^]]\{-}\.\]" matchgroup=' . itemGroup . ' end="\]" contains=@shBracketExprList,shDoubleQuote,' . invGroup
exec 'syn region ' . skipLeftBracketGroup . ' contained matchgroup=' . bracketGroup . ' start="\[\%([!^]\=\\\=\]\)\@=" skip="[!^]\=\\\=\]\%(\[[^]]\+\]\|[^]]\)\{-}\%(\[[:.=]\@!\)\@=" matchgroup=' . itemGroup . ' end="\[[:.=]\@!" contains=@shBracketExprList,shDoubleQuote,' . invGroup
" Look for a general matching expression.
exec 'syn region ' . itemGroup . ' matchgroup=' . bracketGroup . ' start="\[\S\@=" end="\]" contains=@shBracketExprList,shDoubleQuote ' . extraArgs
" Look for a general NON-matching expression.
exec 'syn region ' . itemGroup . ' matchgroup=' . bracketGroup . ' start="\[[!^]\@=" end="\]" contains=@shBracketExprList,shDoubleQuote,' . invGroup . ' ' . extraArgs
" Accommodate unbalanced brackets in bracket expressions. The supported
" syntax for a plain "]" can be: "[]ws]" and "[^]ws]"; or, "[ws[.xs]ys.]zs]"
" and "[^ws[.xs]ys.]zs]"; see §9.3.5 RE Bracket Expression (in XBD).
exec 'syn region ' . itemGroup . ' matchgroup=NONE start="\[[!^]\=\\\=\]" matchgroup=' . bracketGroup . ' end="\]" contains=@shBracketExprList,shDoubleQuote,' . skipRightBracketGroup . ' ' . extraArgs
" Strive to handle "[]...[]" etc.
exec 'syn region ' . itemGroup . ' matchgroup=NONE start="\[[!^]\=\\\=\]\%(\[[^]]\+\]\|[^]]\)\{-}\[[:.=]\@!" matchgroup=' . bracketGroup . ' end="\]" contains=@shBracketExprList,shDoubleQuote,' . skipLeftBracketGroup . ' ' . extraArgs
if !exists("g:skip_sh_syntax_inits")
exec 'hi def link ' . skipLeftBracketGroup . ' ' . itemGroup
exec 'hi def link ' . skipRightBracketGroup . ' ' . itemGroup
exec 'hi def link ' . invGroup . ' Underlined'
endif
endfun
call s:GenerateBracketExpressionItems({'itemGroup': 'shBracketExpr', 'bracketGroup': 'shBracketExprDelim'})
2005-03-11 22:46:48 +00:00
" sh syntax is case sensitive {{{1
2004-06-13 20:20:40 +00:00
syn case match
2004-09-02 19:12:26 +00:00
" Clusters: contains=@... clusters {{{1
2004-06-13 20:20:40 +00:00
"==================================
2010-01-06 20:54:52 +01:00
syn cluster shErrorList contains=shDoError,shIfError,shInError,shCaseError,shEsacError,shCurlyError,shParenError,shTestError,shOK
2018-04-06 11:14:11 +02:00
if exists("b:is_kornshell") || exists("b:is_bash")
2008-07-13 17:41:49 +00:00
syn cluster ErrorList add=shDTestError
endif
syn cluster shArithParenList contains=shArithmetic,shArithParen,shCaseEsac,shComment,shDeref,shDerefVarArray,shDo,shDerefSimple,shEcho,shEscape,shExpr,shNumber,shOperator,shPosnParm,shExSingleQuote,shExDoubleQuote,shHereString,shRedir,shSingleQuote,shDoubleQuote,shStatement,shVariable,shAlias,shTest,shCtrlSeq,shSpecial,shParen,bashSpecialVariables,bashStatement,shIf,shFor,shFunctionKey,shFunctionOne,shFunctionTwo
2008-07-13 17:41:49 +00:00
syn cluster shArithList contains=@shArithParenList,shParenError
syn cluster shBracketExprList contains=shCharClassOther,shCharClass,shCollSymb,shEqClass
2018-07-31 22:23:58 +02:00
syn cluster shCaseEsacList contains=shCaseStart,shCaseLabel,shCase,shCaseBar,shCaseIn,shComment,shDeref,shDerefSimple,shCaseCommandSub,shCaseExSingleQuote,shCaseSingleQuote,shCaseDoubleQuote,shCtrlSeq,@shErrorList,shStringSpecial,shCaseRange
syn cluster shCaseList contains=@shCommandSubList,shCaseEsac,shColon,shCommandSub,shCommandSubBQ,shSubshare,shValsub,shComment,shDblBrace,shDo,shEcho,shExpr,shFor,shHereDoc,shIf,shHereString,shRedir,shSetList,shSource,shStatement,shVariable,shCtrlSeq
2020-11-29 14:36:24 +01:00
if exists("b:is_kornshell") || exists("b:is_bash")
syn cluster shCaseList add=shForPP,shDblParen
2020-11-29 14:36:24 +01:00
endif
syn cluster shCommandSubList contains=shAlias,shArithmetic,shBracketExpr,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
2005-08-05 21:35:02 +00:00
syn cluster shCurlyList contains=shNumber,shComma,shDeref,shDerefSimple,shDerefSpecial
2022-06-12 22:15:57 +01:00
" COMBAK: removing shEscape from shDblQuoteList fails ksh04:43 -- Jun 09, 2022: I don't see the problem with ksh04, so am reinstating shEscape
syn cluster shDblQuoteList contains=shArithmetic,shCommandSub,shCommandSubBQ,shSubshare,shValsub,shDeref,shDerefSimple,shEscape,shPosnParm,shCtrlSeq,shSpecial,shSpecialDQ
2016-01-10 15:59:26 +01:00
syn cluster shDerefList contains=shDeref,shDerefSimple,shDerefVar,shDerefSpecial,shDerefWordError,shDerefPSR,shDerefPPS
2020-09-28 21:48:16 +02:00
syn cluster shDerefVarList contains=shDerefOffset,shDerefOp,shDerefVarArray,shDerefOpError
syn cluster shEchoList contains=shArithmetic,shBracketExpr,shCommandSub,shCommandSubBQ,shDerefVarArray,shSubshare,shValsub,shDeref,shDerefSimple,shEscape,shExSingleQuote,shExDoubleQuote,shSingleQuote,shDoubleQuote,shCtrlSeq,shEchoQuote
syn cluster shExprList1 contains=shBracketExpr,shNumber,shOperator,shExSingleQuote,shExDoubleQuote,shSingleQuote,shDoubleQuote,shExpr,shDblBrace,shDeref,shDerefSimple,shCtrlSeq
2005-01-19 22:18:32 +00:00
syn cluster shExprList2 contains=@shExprList1,@shCaseList,shTest
syn cluster shFunctionList contains=shBracketExpr,@shCommandSubList,shCaseEsac,shColon,shComment,shDo,shEcho,shExpr,shFor,shHereDoc,shIf,shOption,shHereString,shRedir,shSetList,shSource,shStatement,shVariable,shOperator,shCtrlSeq
2007-05-10 17:35:54 +00:00
if exists("b:is_kornshell") || exists("b:is_bash")
2020-11-29 14:36:24 +01:00
syn cluster shFunctionList add=shRepeat,shDblBrace,shDblParen,shForPP
2022-06-12 22:15:57 +01:00
syn cluster shDerefList add=shCommandSubList,shEchoDeref
2007-05-10 17:35:54 +00:00
endif
2004-06-13 20:20:40 +00:00
syn cluster shHereBeginList contains=@shCommandSubList
syn cluster shHereList contains=shBeginHere,shHerePayload
syn cluster shHereListDQ contains=shBeginHere,@shDblQuoteList,shHerePayload
syn cluster shIdList contains=shArithmetic,shCommandSub,shCommandSubBQ,shDerefVarArray,shSubshare,shValsub,shWrapLineOperator,shSetOption,shComment,shDeref,shDerefSimple,shHereString,shNumber,shOperator,shRedir,shExSingleQuote,shExDoubleQuote,shSingleQuote,shDoubleQuote,shExpr,shCtrlSeq,shStringSpecial,shAtExpr
syn cluster shIfList contains=@shLoopList,shDblBrace,shDblParen,shFunctionKey,shFunctionOne,shFunctionTwo
2020-11-29 14:36:24 +01:00
syn cluster shLoopList contains=@shCaseList,@shErrorList,shCaseEsac,shConditional,shDblBrace,shExpr,shFor,shIf,shOption,shSet,shTest,shTestOpr,shTouch
if exists("b:is_kornshell") || exists("b:is_bash")
syn cluster shLoopList add=shForPP,shDblParen
2020-11-29 14:36:24 +01:00
endif
syn cluster shPPSLeftList contains=shAlias,shArithmetic,shBracketExpr,shCmdParenRegion,shCommandSub,shSubshare,shValsub,shCtrlSeq,shDeref,shDerefSimple,shDoubleQuote,shEcho,shEscape,shExDoubleQuote,shExpr,shExSingleQuote,shHereDoc,shNumber,shOperator,shOption,shPosnParm,shHereString,shRedir,shSingleQuote,shSpecial,shStatement,shSubSh,shTest,shVariable
2023-02-27 15:49:53 +00:00
syn cluster shPPSRightList contains=shDeref,shDerefSimple,shEscape,shPosnParm
syn cluster shSubShList contains=shBracketExpr,@shCommandSubList,shCommandSubBQ,shSubshare,shValsub,shCaseEsac,shColon,shCommandSub,shComment,shDo,shEcho,shExpr,shFor,shIf,shHereString,shRedir,shSetList,shSource,shStatement,shVariable,shCtrlSeq,shOperator
syn cluster shTestList contains=shArithmetic,shBracketExpr,shCommandSub,shCommandSubBQ,shSubshare,shValsub,shCtrlSeq,shDeref,shDerefSimple,shDoubleQuote,shSpecialDQ,shExDoubleQuote,shExpr,shExSingleQuote,shNumber,shOperator,shSingleQuote,shTest,shTestOpr
2017-11-05 18:19:24 +01:00
syn cluster shNoZSList contains=shSpecialNoZS
syn cluster shForList contains=shTestOpr,shNumber,shDerefSimple,shDeref,shCommandSub,shCommandSubBQ,shSubshare,shValsub,shArithmetic
2015-11-10 21:15:48 +01:00
2004-09-02 19:12:26 +00:00
" Echo: {{{1
2004-06-13 20:20:40 +00:00
" ====
" This one is needed INSIDE a CommandSub, so that `echo bla` be correct
if exists("b:is_kornshell")
syn 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 end="\ze[ \t\n;]}" contains=@shEchoList skipwhite nextgroup=shQuickComment
syn 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 end="\ze[ \t\n;]}" contains=@shEchoList skipwhite nextgroup=shQuickComment
else
syn 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
syn 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
endif
2022-06-12 22:15:57 +01:00
if exists("b:is_kornshell") || exists("b:is_bash") || exists("b:is_posix")
syn region shEchoDeref contained matchgroup=shStatement start="\<echo\>" skip="\\$" matchgroup=shEchoDelim end="$" end="[<>;&|()`}]"me=e-1 end="\d[<>]"me=e-2 end="#"me=e-1 contains=@shEchoList skipwhite nextgroup=shQuickComment
syn region shEchoDeref contained matchgroup=shStatement start="\<print\>" skip="\\$" matchgroup=shEchoDelim end="$" end="[<>;&|()`}]"me=e-1 end="\d[<>]"me=e-2 end="#"me=e-1 contains=@shEchoList skipwhite nextgroup=shQuickComment
endif
2010-01-06 20:54:52 +01:00
syn match shEchoQuote contained '\%(\\\\\)*\\["`'()]'
2004-06-13 20:20:40 +00:00
2008-07-13 17:41:49 +00:00
" This must be after the strings, so that ... \" will be correct
syn 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=shBracketExpr,shNumber,shExSingleQuote,shSingleQuote,shDeref,shDerefSimple,shSpecialVar,shOperator,shExDoubleQuote,shDoubleQuote,shCtrlSeq
2004-06-13 20:20:40 +00:00
2004-09-02 19:12:26 +00:00
" Alias: {{{1
2004-06-13 20:20:40 +00:00
" =====
2018-04-06 11:14:11 +02:00
if exists("b:is_kornshell") || exists("b:is_bash") || exists("b:is_posix")
2004-06-13 20:20:40 +00:00
syn match shStatement "\<alias\>"
2023-02-02 13:59:48 +00:00
syn region shAlias matchgroup=shStatement start="\<alias\>\s\+\(\h[-._[:alnum:]]*\)\@=" skip="\\$" end="\>\|`"
syn region shAlias matchgroup=shStatement start="\<alias\>\s\+\(\h[-._[:alnum:]]*=\)\@=" skip="\\$" end="="
" syn region shAlias matchgroup=shStatement start="\<alias\>\s\+\(\h[-._[:alnum:]]\+\)\@=" skip="\\$" end="\>\|`"
" syn region shAlias matchgroup=shStatement start="\<alias\>\s\+\(\h[-._[:alnum:]]\+=\)\@=" skip="\\$" end="="
2015-11-10 21:15:48 +01:00
" Touch: {{{1
" =====
2016-10-27 17:00:16 +02:00
syn match shTouch '\<touch\>[^;#]*' skipwhite nextgroup=shComment contains=shTouchCmd,shDoubleQuote,shSingleQuote,shDeref,shDerefSimple
2015-11-10 21:15:48 +01:00
syn match shTouchCmd '\<touch\>' contained
2004-06-13 20:20:40 +00:00
endif
2004-09-02 19:12:26 +00:00
" Error Codes: {{{1
" ============
2012-01-20 21:08:56 +01:00
if !exists("g:sh_no_error")
2015-01-10 15:09:25 +01:00
syn match shDoError "\<done\>"
syn match shIfError "\<fi\>"
syn match shInError "\<in\>"
syn match shCaseError ";;"
syn match shEsacError "\<esac\>"
syn match shCurlyError "}"
syn match shParenError ")"
syn match shOK '\.\(done\|fi\|in\|esac\)'
2018-04-06 11:14:11 +02:00
if exists("b:is_kornshell") || exists("b:is_bash")
2015-01-10 15:09:25 +01:00
syn match shDTestError "]]"
2012-01-20 21:08:56 +01:00
endif
2015-01-10 15:09:25 +01:00
syn match shTestError "]"
2004-06-13 20:20:40 +00:00
endif
2008-07-13 17:41:49 +00:00
" Options: {{{1
2004-09-02 19:12:26 +00:00
" ====================
2016-03-29 23:12:46 +02:00
syn match shOption "\s\zs[-+][-_a-zA-Z#@]\+"
2020-01-25 13:27:42 +01:00
syn match shOption "\s\zs--[^ \t$=`'"|);]\+"
2004-06-13 20:20:40 +00:00
2007-05-10 17:35:54 +00:00
" File Redirection Highlighted As Operators: {{{1
"===========================================
syn match shRedir "\d\=>\(&[-0-9]\)\="
syn match shRedir "\d\=>>-\="
syn match shRedir "\d\=<\(&[-0-9]\)\="
syn match shRedir "\d<<-\="
2004-09-02 19:12:26 +00:00
" Operators: {{{1
" ==========
2007-05-10 17:35:54 +00:00
syn match shOperator "<<\|>>" contained
2008-07-13 17:41:49 +00:00
syn match shOperator "[!&;|]" contained
2015-06-19 13:27:23 +02:00
syn match shOperator "[-=/*+%]\==" skipwhite nextgroup=shPattern
2010-08-05 22:08:47 +02:00
syn match shPattern "\<\S\+\())\)\@=" contained contains=shExSingleQuote,shSingleQuote,shExDoubleQuote,shDoubleQuote,shDeref
2004-06-13 20:20:40 +00:00
2004-09-02 19:12:26 +00:00
" Subshells: {{{1
" ==========
syn region shExpr transparent matchgroup=shExprRegion start="{" end="}" contains=@shExprList2 nextgroup=shSpecialNxt
syn region shSubSh transparent matchgroup=shSubShRegion start="[^(]\zs(" end=")" contains=@shSubShList nextgroup=shSpecialNxt
2004-06-13 20:20:40 +00:00
2004-09-02 19:12:26 +00:00
" Tests: {{{1
"=======
syn region shExpr matchgroup=shRange start="\[\s\@=" skip=+\\\\\|\\$\|\[+ end="\]" contains=@shTestList,shSpecial
2010-01-06 20:54:52 +01:00
syn region shTest transparent matchgroup=shStatement start="\<test\s" skip=+\\\\\|\\$+ matchgroup=NONE end="[;&|]"me=e-1 end="$" contains=@shExprList1
syn region shNoQuote start='\S' skip='\%(\\\\\)*\\.' end='\ze\s' end="\ze['"]" contained contains=shBracketExpr,shDerefSimple,shDeref
2016-05-08 09:50:29 +02:00
syn match shAstQuote contained '\*\ze"' nextgroup=shString
2015-06-19 13:27:23 +02:00
syn match shTestOpr contained '[^-+/%]\zs=' skipwhite nextgroup=shTestDoubleQuote,shTestSingleQuote,shTestPattern
2015-11-10 21:15:48 +01:00
syn match shTestOpr contained "<=\|>=\|!=\|==\|=\~\|-.\>\|-\(nt\|ot\|ef\|eq\|ne\|lt\|le\|gt\|ge\)\>\|[!<>]"
2007-05-05 17:54:07 +00:00
syn match shTestPattern contained '\w\+'
2016-05-08 09:50:29 +02:00
syn region shTestDoubleQuote contained start='\%(\%(\\\\\)*\\\)\@<!"' skip=+\\\\\|\\"+ end='"' contains=shDeref,shDerefSimple,shDerefSpecial
2017-11-05 18:19:24 +01:00
syn match shTestSingleQuote contained '\\.' nextgroup=shTestSingleQuote
2007-05-05 17:54:07 +00:00
syn match shTestSingleQuote contained "'[^']*'"
2004-06-13 20:20:40 +00:00
if exists("b:is_kornshell") || exists("b:is_bash")
syn region shDblBrace matchgroup=Delimiter start="\[\[\s\@=" skip=+\%(\\\\\)*\\$+ end="\]\]" contains=@shTestList,shAstQuote,shNoQuote,shComment
2015-11-10 21:15:48 +01:00
syn region shDblParen matchgroup=Delimiter start="((" skip=+\%(\\\\\)*\\$+ end="))" contains=@shTestList,shComment
2004-06-13 20:20:40 +00:00
endif
2004-09-02 19:12:26 +00:00
" Character Class In Range: {{{1
" =========================
syn match shCharClassOther contained "\[:\w\{-}:\]"
2004-06-13 20:20:40 +00:00
syn match shCharClass contained "\[:\(backspace\|escape\|return\|xdigit\|alnum\|alpha\|blank\|cntrl\|digit\|graph\|lower\|print\|punct\|space\|upper\|tab\):\]"
syn match shCollSymb contained "\[\..\{-}\.\]"
syn match shEqClass contained "\[=.\{-}=\]"
2004-06-13 20:20:40 +00:00
2004-09-02 19:12:26 +00:00
" Loops: do, if, while, until {{{1
" ======
2015-11-10 21:15:48 +01:00
ShFoldIfDoFor syn region shDo transparent matchgroup=shConditional start="\<do\>" matchgroup=shConditional end="\<done\>" contains=@shLoopList
ShFoldIfDoFor syn region shIf transparent matchgroup=shConditional start="\<if\_s" matchgroup=shConditional skip=+-fi\>+ end="\<;\_s*then\>" end="\<fi\>" contains=@shIfList
ShFoldIfDoFor syn region shFor matchgroup=shLoop start="\<for\ze\_s\s*\%(((\)\@!" end="\<in\>" end="\<do\>"me=e-2 contains=@shLoopList,shDblParen skipwhite nextgroup=shCurlyIn
2020-11-29 14:36:24 +01:00
if exists("b:is_kornshell") || exists("b:is_bash")
ShFoldIfDoFor syn region shForPP matchgroup=shLoop start='\<for\>\_s*((' end='))' contains=@shForList
endif
2015-11-10 21:15:48 +01:00
2018-04-06 11:14:11 +02:00
if exists("b:is_kornshell") || exists("b:is_bash") || exists("b:is_posix")
2008-07-13 17:41:49 +00:00
syn cluster shCaseList add=shRepeat
syn cluster shFunctionList add=shRepeat
2018-04-06 11:14:11 +02:00
syn region shRepeat matchgroup=shLoop start="\<while\_s" end="\<do\>"me=e-2 contains=@shLoopList,shDblParen,shDblBrace
syn region shRepeat matchgroup=shLoop start="\<until\_s" end="\<do\>"me=e-2 contains=@shLoopList,shDblParen,shDblBrace
if !exists("b:is_posix")
syn region shCaseEsac matchgroup=shConditional start="\<select\s" matchgroup=shConditional end="\<in\>" end="\<do\>" contains=@shLoopList
endif
2004-06-13 20:20:40 +00:00
else
2008-07-13 17:41:49 +00:00
syn region shRepeat matchgroup=shLoop start="\<while\_s" end="\<do\>"me=e-2 contains=@shLoopList
syn region shRepeat matchgroup=shLoop start="\<until\_s" end="\<do\>"me=e-2 contains=@shLoopList
2004-06-13 20:20:40 +00:00
endif
2005-08-05 21:35:02 +00:00
syn region shCurlyIn contained matchgroup=Delimiter start="{" end="}" contains=@shCurlyList
syn match shComma contained ","
2004-06-13 20:20:40 +00:00
2004-09-02 19:12:26 +00:00
" Case: case...esac {{{1
2004-06-13 20:20:40 +00:00
" ====
2018-07-31 22:23:58 +02:00
syn match shCaseBar contained skipwhite "\(^\|[^\\]\)\(\\\\\)*\zs|" nextgroup=shCase,shCaseStart,shCaseBar,shComment,shCaseExSingleQuote,shCaseSingleQuote,shCaseDoubleQuote
syn match shCaseStart contained skipwhite skipnl "(" nextgroup=shCase,shCaseBar
syn match shCaseLabel contained skipwhite "\%(\\.\|[-a-zA-Z0-9_*.]\)\+" contains=shBracketExpr
2017-11-05 18:19:24 +01:00
if exists("b:is_bash")
2018-07-31 22:23:58 +02:00
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
2022-06-12 22:15:57 +01:00
elseif exists("b:is_kornshell")
ShFoldIfDoFor syn region shCase contained skipwhite skipnl matchgroup=shSnglCase start="\%(\\.\|[^#$()'" \t]\)\{-}\zs)" end=";;" end=";&" end="esac"me=s-1 contains=@shCaseList nextgroup=shCaseStart,shCase,shComment
else
2018-07-31 22:23:58 +02:00
ShFoldIfDoFor syn region shCase contained skipwhite skipnl matchgroup=shSnglCase start="\%(\\.\|[^#$()'" \t]\)\{-}\zs)" end=";;" end="esac"me=s-1 contains=@shCaseList nextgroup=shCaseStart,shCase,shComment
2017-11-05 18:19:24 +01:00
endif
2018-07-31 22:23:58 +02:00
ShFoldIfDoFor syn region shCaseEsac matchgroup=shConditional start="\<case\>" end="\<esac\>" contains=@shCaseEsacList
2015-11-10 21:15:48 +01:00
2005-02-22 08:39:57 +00:00
syn keyword shCaseIn contained skipwhite skipnl in nextgroup=shCase,shCaseStart,shCaseBar,shComment,shCaseExSingleQuote,shCaseSingleQuote,shCaseDoubleQuote
2022-06-12 22:15:57 +01:00
if exists("b:is_bash") || exists("b:is_kornshell")
syn region shCaseExSingleQuote matchgroup=shQuote start=+\$'+ skip=+\\\\\|\\.+ end=+'+ contains=shStringSpecial,shSpecial skipwhite skipnl nextgroup=shCaseBar contained
2012-01-20 21:08:56 +01:00
elseif !exists("g:sh_no_error")
2005-02-22 08:39:57 +00:00
syn region shCaseExSingleQuote matchgroup=Error start=+\$'+ skip=+\\\\\|\\.+ end=+'+ contains=shStringSpecial skipwhite skipnl nextgroup=shCaseBar contained
endif
syn region shCaseSingleQuote matchgroup=shQuote start=+'+ end=+'+ contains=shStringSpecial skipwhite skipnl nextgroup=shCaseBar contained
syn region shCaseDoubleQuote matchgroup=shQuote start=+"+ skip=+\\\\\|\\.+ end=+"+ contains=@shDblQuoteList,shStringSpecial skipwhite skipnl nextgroup=shCaseBar contained
2004-06-13 20:20:40 +00:00
syn region shCaseCommandSub start=+`+ skip=+\\\\\|\\.+ end=+`+ contains=@shCommandSubList skipwhite skipnl nextgroup=shCaseBar contained
call s:GenerateBracketExpressionItems({'itemGroup': 'shCaseRange', 'bracketGroup': 'shBracketExprDelim', 'extraArgs': 'skip=+\\\\+ contained'})
2012-11-15 21:28:22 +01:00
if exists("b:is_bash")
syn match shCharClass '\[:\%(alnum\|alpha\|ascii\|blank\|cntrl\|digit\|graph\|lower\|print\|punct\|space\|upper\|word\|or\|xdigit\):\]' contained
endif
2004-09-02 19:12:26 +00:00
" Misc: {{{1
"======
2004-06-13 20:20:40 +00:00
syn match shWrapLineOperator "\\$"
2018-09-10 11:51:50 +02:00
syn region shCommandSubBQ start="`" skip="\\\\\|\\." end="`" contains=shBQComment,@shCommandSubList
2020-01-25 13:27:42 +01:00
"COMBAK: see ksh13:50
2018-11-25 03:56:26 +01:00
"syn match shEscape contained '\%(^\)\@!\%(\\\\\)*\\.' nextgroup=shSingleQuote,shDoubleQuote,shComment
2020-01-25 13:27:42 +01:00
"COMBAK: see sh11:27
2018-11-25 03:56:26 +01:00
syn match shEscape contained '\%(^\)\@!\%(\\\\\)*\\.' nextgroup=shComment
2020-01-25 13:27:42 +01:00
"COMBAK: see ksh13:53
"syn match shEscape contained '\%(^\)\@!\%(\\\\\)*\\.'
2004-06-13 20:20:40 +00:00
2004-09-02 19:12:26 +00:00
" $() and $(()): {{{1
2004-06-13 20:20:40 +00:00
" $(..) is not supported by sh (Bourne shell). However, apparently
" some systems (HP?) have as their /bin/sh a (link to) Korn shell
" (ie. Posix compliant shell). /bin/ksh should work for those
" systems too, however, so the following syntax will flag $(..) as
" an Error under /bin/sh. By consensus of vimdev'ers!
2017-11-05 18:19:24 +01:00
if exists("b:is_kornshell") || exists("b:is_bash") || exists("b:is_posix")
2023-02-27 15:49:53 +00:00
syn region shCommandSub matchgroup=shCmdSubRegion start="\$(\ze[^(]" skip='\\\\\|\\.' end=")" contains=@shCommandSubList
if exists("b:is_kornshell")
syn region shSubshare matchgroup=shCmdSubRegion start="\${\ze[ \t\n<]" skip='\\\\\|\\.' end="\zs[ \t\n;]}" contains=@shCommandSubList
syn region shValsub matchgroup=shCmdSubRegion start="\${|" skip='\\\\\|\\.' end="}" contains=@shCommandSubList
endif
2008-07-13 17:41:49 +00:00
syn region shArithmetic matchgroup=shArithRegion start="\$((" skip='\\\\\|\\.' end="))" contains=@shArithList
2012-03-28 20:51:51 +02:00
syn region shArithmetic matchgroup=shArithRegion start="\$\[" skip='\\\\\|\\.' end="\]" contains=@shArithList
2004-06-13 20:20:40 +00:00
syn match shSkipInitWS contained "^\s\+"
2022-06-12 22:15:57 +01:00
syn region shArithParen matchgroup=shArithRegion contained start="(" end=")" contains=@shArithParenList
2012-01-20 21:08:56 +01:00
elseif !exists("g:sh_no_error")
2005-02-22 08:39:57 +00:00
syn region shCommandSub matchgroup=Error start="\$(" end=")" contains=@shCommandSubList
2004-06-13 20:20:40 +00:00
endif
syn region shCmdParenRegion matchgroup=shCmdSubRegion start="((\@!" skip='\\\\\|\\.' end=")" contains=@shCommandSubList
2004-06-13 20:20:40 +00:00
if exists("b:is_bash")
syn cluster shCommandSubList add=bashSpecialVariables,bashStatement
syn cluster shCaseList add=bashAdminStatement,bashStatement
syn keyword bashSpecialVariables contained auto_resume BASH BASH_ALIASES BASH_ARGC BASH_ARGV BASH_CMDS BASH_COMMAND BASH_ENV BASH_EXECUTION_STRING BASH_LINENO BASHOPTS BASHPID BASH_REMATCH BASH_SOURCE BASH_SUBSHELL BASH_VERSINFO BASH_VERSION BASH_XTRACEFD CDPATH COLUMNS COMP_CWORD COMP_KEY COMP_LINE COMP_POINT COMPREPLY COMP_TYPE COMP_WORDBREAKS COMP_WORDS COPROC COPROC_PID DIRSTACK EMACS ENV EUID FCEDIT FIGNORE FUNCNAME FUNCNEST GLOBIGNORE GROUPS histchars HISTCMD HISTCONTROL HISTFILE HISTFILESIZE HISTIGNORE HISTSIZE HISTTIMEFORMAT HOME HOSTFILE HOSTNAME HOSTTYPE IFS IGNOREEOF INPUTRC LANG LC_ALL LC_COLLATE LC_CTYPE LC_MESSAGES LC_NUMERIC LINENO LINES MACHTYPE MAIL MAILCHECK MAILPATH MAPFILE OLDPWD OPTARG OPTERR OPTIND OSTYPE PATH PIPESTATUS POSIXLY_CORRECT PPID PROMPT_COMMAND PS0 PS1 PS2 PS3 PS4 PWD RANDOM READLINE_LINE READLINE_POINT REPLY SECONDS SHELL SHELLOPTS SHLVL TIMEFORMAT TIMEOUT TMPDIR UID
2022-07-06 13:18:11 +01:00
syn keyword bashStatement chmod clear complete du egrep expr fgrep find gnufind gnugrep grep head less ls mkdir mv rm rmdir rpm sed sleep sort strip tail
2004-06-13 20:20:40 +00:00
syn keyword bashAdminStatement daemon killall killproc nice reload restart start status stop
2012-11-15 21:28:22 +01:00
syn keyword bashStatement command compgen
2004-06-13 20:20:40 +00:00
endif
2018-04-06 11:14:11 +02:00
if exists("b:is_kornshell") || exists("b:is_posix")
2004-06-13 20:20:40 +00:00
syn cluster shCommandSubList add=kshSpecialVariables,kshStatement
syn cluster shCaseList add=kshStatement
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
2022-07-06 13:18:11 +01:00
syn keyword kshStatement cat chmod clear cp du egrep expr fgrep find grep head killall less ls mkdir mv nice printenv rm rmdir sed sort strip stty tail tput
2012-11-15 21:28:22 +01:00
syn keyword kshStatement command setgroups setsenv
2004-06-13 20:20:40 +00:00
endif
syn match shSource "^\.\s"
syn match shSource "\s\.\s"
2010-01-06 20:54:52 +01:00
"syn region shColon start="^\s*:" end="$" end="\s#"me=e-2 contains=@shColonList
2012-01-20 21:08:56 +01:00
"syn region shColon start="^\s*\zs:" end="$" end="\s#"me=e-2
2018-04-06 11:14:11 +02:00
if exists("b:is_kornshell") || exists("b:is_posix")
2016-05-08 09:50:29 +02:00
syn match shColon '^\s*\zs:'
endif
2004-06-13 20:20:40 +00:00
2004-09-02 19:12:26 +00:00
" String And Character Constants: {{{1
"================================
2016-03-29 23:12:46 +02:00
syn match shNumber "\<\d\+\>#\="
2016-08-02 21:04:33 +02:00
syn match shNumber "\<-\=\.\=\d\+\>#\="
2016-06-26 16:17:58 +02:00
syn match shCtrlSeq "\\\d\d\d\|\\[abcfnrtv0]" contained
2022-06-12 22:15:57 +01:00
if exists("b:is_bash") || exists("b:is_kornshell")
2016-06-26 16:17:58 +02:00
syn match shSpecial "[^\\]\(\\\\\)*\zs\\\o\o\o\|\\x\x\x\|\\c[^"]\|\\[abefnrtv]" contained
syn match shSpecial "^\(\\\\\)*\zs\\\o\o\o\|\\x\x\x\|\\c[^"]\|\\[abefnrtv]" contained
syn region shExSingleQuote matchgroup=shQuote start=+\$'+ skip=+\\\\\|\\.+ end=+'+ contains=shStringSpecial,shSpecial nextgroup=shSpecialNxt
syn region shExDoubleQuote matchgroup=shQuote start=+\$"+ skip=+\\\\\|\\.\|\\"+ end=+"+ contains=@shDblQuoteList,shStringSpecial,shSpecial nextgroup=shSpecialNxt
2012-01-20 21:08:56 +01:00
elseif !exists("g:sh_no_error")
2007-05-05 17:54:07 +00:00
syn region shExSingleQuote matchGroup=Error start=+\$'+ skip=+\\\\\|\\.+ end=+'+ contains=shStringSpecial
2010-08-05 22:08:47 +02:00
syn region shExDoubleQuote matchGroup=Error start=+\$"+ skip=+\\\\\|\\.+ end=+"+ contains=shStringSpecial
2005-02-22 08:39:57 +00:00
endif
2018-07-31 22:23:58 +02:00
syn region shSingleQuote matchgroup=shQuote start=+'+ end=+'+ contains=@Spell nextgroup=shSpecialStart,shSpecialSQ
2021-05-30 20:54:13 +02:00
syn region shDoubleQuote matchgroup=shQuote start=+\%(\%(\\\\\)*\\\)\@<!"+ skip=+\\.+ end=+"+ contains=@shDblQuoteList,shStringSpecial,@Spell nextgroup=shSpecialStart
2016-06-26 16:17:58 +02:00
syn match shStringSpecial "[^[:print:] \t]" contained
2021-05-30 20:54:13 +02:00
syn match shStringSpecial "[^\\]\zs\%(\\\\\)*\(\\[\\"'`$()#]\)\+" nextgroup=shComment
syn match shSpecialSQ "[^\\]\zs\%(\\\\\)*\(\\[\\"'`$()#]\)\+" contained nextgroup=shBkslshSnglQuote,@shNoZSList
syn match shSpecialDQ "[^\\]\zs\%(\\\\\)*\(\\[\\"'`$()#]\)\+" contained nextgroup=shBkslshDblQuote,@shNoZSList
2018-04-06 11:14:11 +02:00
syn match shSpecialStart "\%(\\\\\)*\\[\\"'`$()#]" contained nextgroup=shBkslshSnglQuote,shBkslshDblQuote,@shNoZSList
2015-10-13 23:21:27 +02:00
syn match shSpecial "^\%(\\\\\)*\\[\\"'`$()#]"
2017-11-05 18:19:24 +01:00
syn match shSpecialNoZS contained "\%(\\\\\)*\\[\\"'`$()#]"
syn match shSpecialNxt contained "\\[\\"'`$()#]"
2020-05-12 22:49:12 +02:00
"syn region shBkslshSnglQuote contained matchgroup=shQuote start=+'+ end=+'+ contains=@Spell nextgroup=shSpecialStart
"syn region shBkslshDblQuote contained matchgroup=shQuote start=+"+ skip=+\\"+ end=+"+ contains=@shDblQuoteList,shStringSpecial,@Spell nextgroup=shSpecialStart
2004-06-13 20:20:40 +00:00
2004-09-02 19:12:26 +00:00
" Comments: {{{1
"==========
2010-01-06 20:54:52 +01:00
syn cluster shCommentGroup contains=shTodo,@Spell
2016-10-27 17:00:16 +02:00
if exists("b:is_bash")
syn match shTodo contained "\<\%(COMBAK\|FIXME\|TODO\|XXX\)\ze:\=\>"
else
syn keyword shTodo contained COMBAK FIXME TODO XXX
endif
2010-01-06 20:54:52 +01:00
syn match shComment "^\s*\zs#.*$" contains=@shCommentGroup
syn match shComment "\s\zs#.*$" contains=@shCommentGroup
2012-11-15 21:28:22 +01:00
syn match shComment contained "#.*$" contains=@shCommentGroup
2021-11-07 20:27:04 +00:00
syn match shQuickComment contained "#.*$" contains=@shCommentGroup
2018-09-10 11:51:50 +02:00
syn match shBQComment contained "#.\{-}\ze`" contains=@shCommentGroup
2004-06-13 20:20:40 +00:00
2004-09-02 19:12:26 +00:00
" Here Documents: {{{1
2021-05-30 20:54:13 +02:00
" (modified by Felipe Contreras)
2004-09-02 19:12:26 +00:00
" =========================================
2022-12-06 18:20:10 +00:00
ShFoldHereDoc syn region shHereDoc matchgroup=shHereDoc01 start="<<\s*\z([^ \t|>]\+\)" matchgroup=shHereDoc01 end="^\z1$" contains=@shDblQuoteList
2023-04-22 22:40:14 +01:00
ShFoldHereDoc syn region shHereDoc matchgroup=shHereDoc02 start="<<-\s*\z([^ \t|>]\+\)" matchgroup=shHereDoc02 end="^\t*\z1$" contains=@shDblQuoteList
2022-12-06 18:20:10 +00:00
ShFoldHereDoc syn region shHereDoc matchgroup=shHereDoc03 start="<<\s*\\\z([^ \t|>]\+\)" matchgroup=shHereDoc03 end="^\z1$"
2023-04-22 22:40:14 +01:00
ShFoldHereDoc syn region shHereDoc matchgroup=shHereDoc04 start="<<-\s*\\\z([^ \t|>]\+\)" matchgroup=shHereDoc04 end="^\t*\z1$"
2022-12-06 18:20:10 +00:00
ShFoldHereDoc syn region shHereDoc matchgroup=shHereDoc05 start="<<\s*'\z([^']\+\)'" matchgroup=shHereDoc05 end="^\z1$"
2023-04-22 22:40:14 +01:00
ShFoldHereDoc syn region shHereDoc matchgroup=shHereDoc06 start="<<-\s*'\z([^']\+\)'" matchgroup=shHereDoc06 end="^\t*\z1$"
2022-12-06 18:20:10 +00:00
ShFoldHereDoc syn region shHereDoc matchgroup=shHereDoc07 start="<<\s*\"\z([^"]\+\)\"" matchgroup=shHereDoc07 end="^\z1$"
2023-04-22 22:40:14 +01:00
ShFoldHereDoc syn region shHereDoc matchgroup=shHereDoc08 start="<<-\s*\"\z([^"]\+\)\"" matchgroup=shHereDoc08 end="^\t*\z1$"
2022-12-06 18:20:10 +00:00
ShFoldHereDoc syn region shHereDoc matchgroup=shHereDoc09 start="<<\s*\\\_$\_s*\z([^ \t|>]\+\)" matchgroup=shHereDoc09 end="^\z1$" contains=@shDblQuoteList
2023-04-22 22:40:14 +01:00
ShFoldHereDoc syn region shHereDoc matchgroup=shHereDoc10 start="<<-\s*\\\_$\_s*\z([^ \t|>]\+\)" matchgroup=shHereDoc10 end="^\t*\z1$" contains=@shDblQuoteList
2022-12-06 18:20:10 +00:00
ShFoldHereDoc syn region shHereDoc matchgroup=shHereDoc11 start="<<\s*\\\_$\_s*\\\z([^ \t|>]\+\)" matchgroup=shHereDoc11 end="^\z1$"
2023-04-22 22:40:14 +01:00
ShFoldHereDoc syn region shHereDoc matchgroup=shHereDoc12 start="<<-\s*\\\_$\_s*\\\z([^ \t|>]\+\)" matchgroup=shHereDoc12 end="^\t*\z1$"
2022-12-06 18:20:10 +00:00
ShFoldHereDoc syn region shHereDoc matchgroup=shHereDoc13 start="<<\s*\\\_$\_s*'\z([^']\+\)'" matchgroup=shHereDoc13 end="^\z1$"
2023-04-22 22:40:14 +01:00
ShFoldHereDoc syn region shHereDoc matchgroup=shHereDoc14 start="<<-\s*\\\_$\_s*'\z([^']\+\)'" matchgroup=shHereDoc14 end="^\t*\z1$"
2022-12-06 18:20:10 +00:00
ShFoldHereDoc syn region shHereDoc matchgroup=shHereDoc15 start="<<\s*\\\_$\_s*\"\z([^"]\+\)\"" matchgroup=shHereDoc15 end="^\z1$"
2023-04-22 22:40:14 +01:00
ShFoldHereDoc syn region shHereDoc matchgroup=shHereDoc16 start="<<-\s*\\\_$\_s*\"\z([^"]\+\)\"" matchgroup=shHereDoc16 end="^\t*\z1$"
2020-11-29 14:36:24 +01:00
2004-06-13 20:20:40 +00:00
2004-09-02 19:12:26 +00:00
" Here Strings: {{{1
" =============
2016-10-27 17:00:16 +02:00
" available for: bash; ksh (really should be ksh93 only) but not if its a posix
2017-01-28 18:34:47 +01:00
if exists("b:is_bash") || (exists("b:is_kornshell") && !exists("b:is_posix"))
syn match shHereString "<<<" skipwhite nextgroup=shCmdParenRegion
2004-09-02 19:12:26 +00:00
endif
" Identifiers: {{{1
"=============
2008-07-13 17:41:49 +00:00
syn match shSetOption "\s\zs[-+][a-zA-Z0-9]\+\>" contained
2020-11-29 14:36:24 +01:00
syn match shVariable "\<\h\w*\ze=" nextgroup=shVarAssign
if exists("b:is_bash")
" The subscript form for array values, e.g. "foo=([2]=10 [4]=100)".
syn region shArrayValue contained start="\[\%(..\{-}\]=\)\@=" end="\]=\@=" contains=@shArrayValueList nextgroup=shVarAssign
syn cluster shArrayValueList contains=shArithmetic,shArithParen,shCommandSub,shDeref,shDerefSimple,shExpr,shNumber,shExSingleQuote,shExDoubleQuote,shSingleQuote,shDoubleQuote,shSpecial,shParen,bashSpecialVariables,shParenError
endif
if exists("b:is_bash") || exists("b:is_kornshell")
syn match shVariable "\<\h\w*\%(\[..\{-}\]\)\=\ze\%([|^&*/%+-]\|[<^]<\|[>^]>\)\==" contains=shDerefVarArray nextgroup=shVarAssign
syn match shVarAssign contained "\%([|^&*/%+-]\|[<^]<\|[>^]>\)\==" nextgroup=shArrayRegion,shPattern,shDeref,shDerefSimple,shDoubleQuote,shExDoubleQuote,shSingleQuote,shExSingleQuote,shVar
syn region shArrayRegion contained matchgroup=shShellVariables start="(" skip='\\\\\|\\.' end=")" contains=@shArrayValueList,shArrayValue,shComment
else
syn match shVarAssign contained "=" nextgroup=shPattern,shDeref,shDerefSimple,shDoubleQuote,shExDoubleQuote,shSingleQuote,shExSingleQuote,shVar
endif
2018-11-25 03:56:26 +01:00
syn match shVar contained "\h\w*"
2013-07-05 21:01:22 +02:00
syn region shAtExpr contained start="@(" end=")" contains=@shIdList
2004-06-13 20:20:40 +00:00
if exists("b:is_bash")
2018-11-25 03:56:26 +01:00
syn match shSet "^\s*set\ze\s\+$"
2022-06-12 22:15:57 +01:00
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
2018-11-25 03:56:26 +01:00
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
2018-04-06 11:14:11 +02:00
elseif exists("b:is_kornshell") || exists("b:is_posix")
2018-11-25 03:56:26 +01:00
syn match shSet "^\s*set\ze\s\+$"
2020-09-28 21:48:16 +02:00
if exists("b:is_dash")
2022-06-12 22:15:57 +01:00
syn region shSetList oneline matchgroup=shSet start="\<\%(local\)\>\ze[/]\@!" end="$" matchgroup=shSetListDelim end="\ze[}|);&]" matchgroup=NONE end="\ze\s\+[#=]" contains=@shIdList
2020-09-28 21:48:16 +02:00
endif
2022-06-12 22:15:57 +01:00
syn region shSetList oneline matchgroup=shSet start="\<\(export\)\>\ze[/]\@!" end="$" matchgroup=shSetListDelim end="\ze[}|);&]" matchgroup=NONE end="\ze\s\+[#=]" contains=@shIdList
2018-11-25 03:56:26 +01:00
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
2004-06-13 20:20:40 +00:00
else
2018-11-25 03:56:26 +01:00
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
2004-06-13 20:20:40 +00:00
endif
2022-06-12 22:15:57 +01:00
" KornShell namespace: {{{1
if exists("b:is_kornshell")
syn keyword shFunctionKey namespace skipwhite skipnl nextgroup=shFunctionTwo
endif
2004-09-02 19:12:26 +00:00
" Functions: {{{1
2017-01-28 18:34:47 +01:00
if !exists("b:is_posix")
2008-07-13 17:41:49 +00:00
syn keyword shFunctionKey function skipwhite skipnl nextgroup=shFunctionTwo
endif
if exists("b:is_bash")
syn keyword shFunctionKey coproc
2016-05-08 09:50:29 +02:00
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
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
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
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
2004-06-13 20:20:40 +00:00
else
2016-05-08 09:50:29 +02:00
ShFoldFunctions syn region shFunctionOne matchgroup=shFunction start="^\s*\h\w*\s*()\_s*{" end="}" contains=@shFunctionList skipwhite skipnl nextgroup=shFunctionStart,shQuickComment
ShFoldFunctions syn region shFunctionTwo matchgroup=shFunction start="\%(do\)\@!\&\<\h\w*\>\s*\%(()\)\=\_s*{" end="}" contains=shFunctionKey,@shFunctionList contained skipwhite skipnl nextgroup=shFunctionStart,shQuickComment
ShFoldFunctions syn region shFunctionThree matchgroup=shFunction start="^\s*\h\w*\s*()\_s*(" end=")" contains=@shFunctionList skipwhite skipnl nextgroup=shFunctionStart,shQuickComment
ShFoldFunctions syn region shFunctionFour matchgroup=shFunction start="\%(do\)\@!\&\<\h\w*\>\s*\%(()\)\=\_s*(" end=")" contains=shFunctionKey,@shFunctionList contained skipwhite skipnl nextgroup=shFunctionStart,shQuickComment
2004-06-13 20:20:40 +00:00
endif
2004-09-02 19:12:26 +00:00
" Parameter Dereferencing: {{{1
" ========================
2023-02-02 13:59:48 +00:00
" Note: sh04 failure with following line
"if !exists("g:sh_no_error") && !(exists("b:is_bash") || exists("b:is_kornshell") || exists("b:is_posix"))
if !exists("g:sh_no_error")
2016-05-08 09:50:29 +02:00
syn match shDerefWordError "[^}$[~]" contained
2012-01-20 21:08:56 +01:00
endif
2017-11-05 18:19:24 +01:00
syn match shDerefSimple "\$\%(\h\w*\|\d\)" nextgroup=@shNoZSList
if exists("b:is_kornshell")
syn region shDeref matchgroup=PreProc start="\${\ze[^ \t\n<|]" end="}" contains=@shDerefList,shDerefVarArray nextgroup=shSpecialStart
else
syn region shDeref matchgroup=PreProc start="\${" end="}" contains=@shDerefList,shDerefVarArray nextgroup=shSpecialStart
endif
2017-11-05 18:19:24 +01:00
syn match shDerefSimple "\$[-#*@!?]" nextgroup=@shNoZSList
syn match shDerefSimple "\$\$" nextgroup=@shNoZSList
2020-05-12 22:49:12 +02:00
syn match shDerefSimple "\${\d}" nextgroup=@shNoZSList nextgroup=shSpecialStart
2018-04-06 11:14:11 +02:00
if exists("b:is_bash") || exists("b:is_kornshell") || exists("b:is_posix")
2020-05-12 22:49:12 +02:00
syn region shDeref matchgroup=PreProc start="\${##\=" end="}" contains=@shDerefList nextgroup=@shSpecialNoZS,shSpecialStart
syn region shDeref matchgroup=PreProc start="\${\$\$" end="}" contains=@shDerefList nextgroup=@shSpecialNoZS,shSpecialStart
2004-06-13 20:20:40 +00:00
endif
2022-06-12 22:15:57 +01:00
" ksh: ${.sh.*} variables: {{{1
" ========================================
if exists("b:is_kornshell")
syn match shDerefVar contained "\.\+" nextgroup=@shDerefVarList
endif
2015-11-10 21:15:48 +01:00
" ksh: ${!var[*]} array index list syntax: {{{1
" ========================================
2018-04-06 11:14:11 +02:00
if exists("b:is_kornshell") || exists("b:is_posix")
2015-11-10 21:15:48 +01:00
syn region shDeref matchgroup=PreProc start="\${!" end="}" contains=@shDerefVarArray
endif
2004-09-02 19:12:26 +00:00
" bash: ${!prefix*} and ${#parameter}: {{{1
" ====================================
2004-06-13 20:20:40 +00:00
if exists("b:is_bash")
2020-09-28 21:48:16 +02:00
syn region shDeref matchgroup=PreProc start="\${!" end="\*\=}" contains=@shDerefList,shDerefOffset
2016-08-02 21:04:33 +02:00
syn match shDerefVar contained "{\@<=!\h\w*" nextgroup=@shDerefVarList
2004-06-13 20:20:40 +00:00
endif
2015-11-10 21:15:48 +01:00
if exists("b:is_kornshell")
2016-08-02 21:04:33 +02:00
syn match shDerefVar contained "{\@<=!\h\w*[[:alnum:]_.]*" nextgroup=@shDerefVarList
2015-11-10 21:15:48 +01:00
endif
2004-06-13 20:20:40 +00:00
2020-09-28 21:48:16 +02:00
syn match shDerefSpecial contained "{\@<=[-*@?0]" nextgroup=shDerefOp,shDerefOffset,shDerefOpError
2004-06-13 20:20:40 +00:00
syn match shDerefSpecial contained "\({[#!]\)\@<=[[:alnum:]*@_]\+" nextgroup=@shDerefVarList,shDerefOp
2016-08-02 21:04:33 +02:00
syn match shDerefVar contained "{\@<=\h\w*" nextgroup=@shDerefVarList
syn match shDerefVar contained '\d' nextgroup=@shDerefVarList
2018-04-06 11:14:11 +02:00
if exists("b:is_kornshell") || exists("b:is_posix")
2016-08-02 21:04:33 +02:00
syn match shDerefVar contained "{\@<=\h\w*[[:alnum:]_.]*" nextgroup=@shDerefVarList
2015-11-10 21:15:48 +01:00
endif
2004-06-13 20:20:40 +00:00
2004-09-02 19:12:26 +00:00
" sh ksh bash : ${var[... ]...} array reference: {{{1
syn region shDerefVarArray contained matchgroup=shDeref start="\[" end="]" contains=@shCommandSubList nextgroup=shDerefOp,shDerefOpError,shDerefOffset
2004-06-13 20:20:40 +00:00
2004-09-02 19:12:26 +00:00
" Special ${parameter OPERATOR word} handling: {{{1
2015-01-10 15:09:25 +01:00
" sh ksh bash : ${parameter:-word} word is default value
" sh ksh bash : ${parameter:=word} assign word as default value
" sh ksh bash : ${parameter:?word} display word if parameter is null
" sh ksh bash : ${parameter:+word} use word if parameter is not null, otherwise nothing
" ksh bash : ${parameter#pattern} remove small left pattern
" ksh bash : ${parameter##pattern} remove large left pattern
" ksh bash : ${parameter%pattern} remove small right pattern
" ksh bash : ${parameter%%pattern} remove large right pattern
" bash : ${parameter^pattern} Case modification
" bash : ${parameter^^pattern} Case modification
" bash : ${parameter,pattern} Case modification
" bash : ${parameter,,pattern} Case modification
2020-09-28 21:48:16 +02:00
" bash : ${@:start:qty} display command line arguments from start to start+qty-1 (inferred)
2023-02-27 15:49:53 +00:00
" bash : ${parameter@operator} transforms parameter (operator∈[uULqEPARa])
2004-06-13 20:20:40 +00:00
syn cluster shDerefPatternList contains=shDerefPattern,shDerefString
2012-01-20 21:08:56 +01:00
if !exists("g:sh_no_error")
syn match shDerefOpError contained ":[[:punct:]]"
endif
2004-06-13 20:20:40 +00:00
syn match shDerefOp contained ":\=[-=?]" nextgroup=@shDerefPatternList
syn match shDerefOp contained ":\=+" nextgroup=@shDerefPatternList
2018-04-06 11:14:11 +02:00
if exists("b:is_bash") || exists("b:is_kornshell") || exists("b:is_posix")
syn match shDerefOp contained "#\{1,2}" nextgroup=@shDerefPatternList
syn match shDerefOp contained "%\{1,2}" nextgroup=@shDerefPatternList
syn match shDerefPattern contained "[^{}]\+" contains=shDeref,shDerefSimple,shDerefPattern,shDerefString,shCommandSub,shDerefEscape nextgroup=shDerefPattern skipnl
2004-06-13 20:20:40 +00:00
syn region shDerefPattern contained start="{" end="}" contains=shDeref,shDerefSimple,shDerefString,shCommandSub nextgroup=shDerefPattern
" Match parametric bracket expressions with a leading whitespace character.
syn region shDerefPattern contained matchgroup=shBracketExprDelim start="\[" end="\]" contains=@shBracketExprList,shDoubleQuote nextgroup=shDerefPattern
call s:GenerateBracketExpressionItems({'itemGroup': 'shDerefPattern', 'bracketGroup': 'shBracketExprDelim', 'extraArgs': 'contained nextgroup=shDerefPattern'})
2005-08-16 23:01:50 +00:00
syn match shDerefEscape contained '\%(\\\\\)*\\.'
2004-06-13 20:20:40 +00:00
endif
2011-09-21 19:22:10 +02:00
if exists("b:is_bash")
syn match shDerefOp contained "[,^]\{1,2}" nextgroup=@shDerefPatternList
2023-02-27 15:49:53 +00:00
syn match shDerefOp contained "@[uULQEPAKa]"
2011-09-21 19:22:10 +02:00
endif
syn region shDerefString contained matchgroup=shDerefDelim start=+\%(\\\)\@<!'+ end=+'+ contains=shStringSpecial
syn region shDerefString contained matchgroup=shDerefDelim start=+\%(\\\)\@<!"+ skip=+\\"+ end=+"+ contains=@shDblQuoteList,shStringSpecial
2008-07-13 17:41:49 +00:00
syn match shDerefString contained "\\["']" nextgroup=shDerefPattern
2004-06-13 20:20:40 +00:00
2020-09-28 21:48:16 +02:00
if exists("b:is_bash") || exists("b:is_kornshell") || exists("b:is_posix")
" bash ksh posix : ${parameter:offset}
" bash ksh posix : ${parameter:offset:length}
syn region shDerefOffset contained start=':[^-=?+]' end='\ze:' end='\ze}' contains=shDeref,shDerefSimple,shDerefEscape nextgroup=shDerefLen,shDeref,shDerefSimple
syn region shDerefOffset contained start=':\s-' end='\ze:' end='\ze}' contains=shDeref,shDerefSimple,shDerefEscape nextgroup=shDerefLen,shDeref,shDerefSimple
2018-07-31 22:23:58 +02:00
syn match shDerefLen contained ":[^}]\+" contains=shDeref,shDerefSimple,shArithmetic
2020-09-28 21:48:16 +02:00
endif
2005-08-16 23:01:50 +00:00
2020-09-28 21:48:16 +02:00
if exists("b:is_bash")
" bash : ${parameter/pattern/string}
2005-08-16 23:01:50 +00:00
" bash : ${parameter//pattern/string}
syn match shDerefPPS contained '/\{1,2}' nextgroup=shDerefPPSleft
2020-09-28 21:48:16 +02:00
syn region shDerefPPSleft contained start='.' skip=@\%(\\\\\)*\\/@ matchgroup=shDerefOp end='/' end='\ze}' end='"' nextgroup=shDerefPPSright contains=@shPPSLeftList
2018-11-25 03:56:26 +01:00
syn region shDerefPPSright contained start='.' skip=@\%(\\\\\)\+@ end='\ze}' contains=@shPPSRightList
2016-01-10 15:59:26 +01:00
" bash : ${parameter/#pattern/string}
" bash : ${parameter/%pattern/string}
syn match shDerefPSR contained '/[#%]' nextgroup=shDerefPSRleft,shDoubleQuote,shSingleQuote
syn region shDerefPSRleft contained start='[^"']' skip=@\%(\\\\\)*\\/@ matchgroup=shDerefOp end='/' end='\ze}' nextgroup=shDerefPSRright contains=shBracketExpr
2016-01-10 15:59:26 +01:00
syn region shDerefPSRright contained start='.' skip=@\%(\\\\\)\+@ end='\ze}'
2004-06-13 20:20:40 +00:00
endif
2008-07-13 17:41:49 +00:00
" Arithmetic Parenthesized Expressions: {{{1
2013-07-05 21:01:22 +02:00
"syn region shParen matchgroup=shArithRegion start='[^$]\zs(\%(\ze[^(]\|$\)' end=')' contains=@shArithParenList
syn region shParen matchgroup=shArithRegion start='\$\@!(\%(\ze[^(]\|$\)' end=')' contains=@shArithParenList
2008-07-13 17:41:49 +00:00
2018-09-10 11:51:50 +02:00
" Additional sh Keywords: {{{1
2004-09-02 19:12:26 +00:00
" ===================
2004-06-13 20:20:40 +00:00
syn keyword shStatement break cd chdir continue eval exec exit kill newgrp pwd read readonly return shift test trap ulimit umask wait
syn keyword shConditional contained elif else then
2012-01-20 21:08:56 +01:00
if !exists("g:sh_no_error")
syn keyword shCondError elif else then
endif
2004-06-13 20:20:40 +00:00
2018-09-10 11:51:50 +02:00
" Additional ksh Keywords and Aliases: {{{1
" ===================================
2018-11-25 03:56:26 +01:00
if exists("b:is_kornshell") || exists("b:is_posix")
syn keyword shStatement bg builtin disown enum export false fg getconf getopts hist jobs let printf sleep true unalias whence
syn keyword shStatement typeset skipwhite nextgroup=shSetOption
2018-09-10 11:51:50 +02:00
syn keyword shStatement autoload compound fc float functions hash history integer nameref nohup r redirect source stop suspend times type
2017-01-28 18:34:47 +01:00
if exists("b:is_posix")
2008-07-13 17:41:49 +00:00
syn keyword shStatement command
else
syn keyword shStatement time
endif
2004-06-13 20:20:40 +00:00
2018-09-10 11:51:50 +02:00
" Additional bash Keywords: {{{1
2004-09-02 19:12:26 +00:00
" =====================
2018-11-25 03:56:26 +01:00
elseif exists("b:is_bash")
syn keyword shStatement bg builtin disown export false fg getopts jobs let printf true unalias
2018-11-25 03:56:26 +01:00
syn keyword shStatement typeset nextgroup=shSetOption
syn keyword shStatement fc hash history source suspend times type
syn keyword shStatement bind caller compopt declare dirs enable help logout local mapfile popd pushd readarray shopt typeset
2018-11-25 03:56:26 +01:00
else
syn keyword shStatement login newgrp
2004-06-13 20:20:40 +00:00
endif
2004-09-02 19:12:26 +00:00
" Synchronization: {{{1
" ================
2016-04-12 21:07:15 +02:00
if !exists("g:sh_minlines")
let s:sh_minlines = 200
else
let s:sh_minlines= g:sh_minlines
2004-06-13 20:20:40 +00:00
endif
2016-04-12 21:07:15 +02:00
if !exists("g:sh_maxlines")
let s:sh_maxlines = 2*s:sh_minlines
if s:sh_maxlines < 25
let s:sh_maxlines= 25
endif
else
let s:sh_maxlines= g:sh_maxlines
2004-06-13 20:20:40 +00:00
endif
2016-04-12 21:07:15 +02:00
exec "syn sync minlines=" . s:sh_minlines . " maxlines=" . s:sh_maxlines
2004-06-13 20:20:40 +00:00
syn sync match shCaseEsacSync grouphere shCaseEsac "\<case\>"
syn sync match shCaseEsacSync groupthere shCaseEsac "\<esac\>"
syn sync match shDoSync grouphere shDo "\<do\>"
syn sync match shDoSync groupthere shDo "\<done\>"
syn sync match shForSync grouphere shFor "\<for\>"
syn sync match shForSync groupthere shFor "\<in\>"
syn sync match shIfSync grouphere shIf "\<if\>"
syn sync match shIfSync groupthere shIf "\<fi\>"
syn sync match shUntilSync grouphere shRepeat "\<until\>"
syn sync match shWhileSync grouphere shRepeat "\<while\>"
2004-09-02 19:12:26 +00:00
" Default Highlighting: {{{1
" =====================
if !exists("skip_sh_syntax_inits")
hi def link shArithRegion shShellVariables
hi def link shArrayValue shDeref
hi def link shAstQuote shDoubleQuote
hi def link shAtExpr shSetList
2018-07-31 22:23:58 +02:00
hi def link shBkslshSnglQuote shSingleQuote
hi def link shBkslshDblQuote shDOubleQuote
hi def link shBeginHere shRedir
hi def link shCaseBar shConditional
hi def link shCaseCommandSub shCommandSub
hi def link shCaseDoubleQuote shDoubleQuote
hi def link shCaseIn shConditional
hi def link shQuote shOperator
hi def link shCaseSingleQuote shSingleQuote
hi def link shCaseStart shConditional
hi def link shCmdSubRegion shShellVariables
hi def link shColon shComment
hi def link shDerefOp shOperator
hi def link shDerefPOL shDerefOp
hi def link shDerefPPS shDerefOp
hi def link shDerefPSR shDerefOp
hi def link shDeref shShellVariables
hi def link shDerefDelim shOperator
hi def link shDerefSimple shDeref
hi def link shDerefSpecial shDeref
hi def link shDerefString shDoubleQuote
hi def link shDerefVar shDeref
hi def link shDoubleQuote shString
hi def link shEcho shString
hi def link shEchoDelim shOperator
hi def link shEchoQuote shString
hi def link shForPP shLoop
hi def link shFunction Function
hi def link shEmbeddedEcho shString
hi def link shEscape shCommandSub
hi def link shExDoubleQuote shDoubleQuote
hi def link shExSingleQuote shSingleQuote
hi def link shHereDoc shString
hi def link shHereString shRedir
hi def link shHerePayload shHereDoc
hi def link shLoop shStatement
hi def link shSpecialNxt shSpecial
hi def link shNoQuote shDoubleQuote
hi def link shOption shCommandSub
hi def link shPattern shString
hi def link shParen shArithmetic
hi def link shPosnParm shShellVariables
hi def link shQuickComment shComment
2018-09-10 11:51:50 +02:00
hi def link shBQComment shComment
hi def link shRange shOperator
hi def link shRedir shOperator
hi def link shSetListDelim shOperator
hi def link shSetOption shOption
hi def link shSingleQuote shString
hi def link shSource shOperator
hi def link shStringSpecial shSpecial
2018-04-06 11:14:11 +02:00
hi def link shSpecialStart shSpecial
hi def link shSubShRegion shOperator
hi def link shTestOpr shConditional
hi def link shTestPattern shString
hi def link shTestDoubleQuote shString
hi def link shTestSingleQuote shString
hi def link shTouchCmd shStatement
hi def link shVariable shSetList
hi def link shWrapLineOperator shOperator
2004-06-13 20:20:40 +00:00
if exists("b:is_bash")
hi def link bashAdminStatement shStatement
hi def link bashSpecialVariables shShellVariables
hi def link bashStatement shStatement
hi def link shCharClass shSpecial
2020-09-28 21:48:16 +02:00
hi def link shDerefOffset shDerefOp
hi def link shDerefLen shDerefOffset
endif
2018-04-06 11:14:11 +02:00
if exists("b:is_kornshell") || exists("b:is_posix")
hi def link kshSpecialVariables shShellVariables
hi def link kshStatement shStatement
endif
if !exists("g:sh_no_error")
hi def link shCaseError Error
hi def link shCondError Error
hi def link shCurlyError Error
hi def link shDerefOpError Error
hi def link shDerefWordError Error
hi def link shDoError Error
hi def link shEsacError Error
hi def link shIfError Error
hi def link shInError Error
hi def link shParenError Error
hi def link shTestError Error
2018-04-06 11:14:11 +02:00
if exists("b:is_kornshell") || exists("b:is_posix")
hi def link shDTestError Error
endif
2012-01-20 21:08:56 +01:00
endif
2004-06-13 20:20:40 +00:00
hi def link shArithmetic Special
hi def link shBracketExprDelim Delimiter
hi def link shCharClass Identifier
hi def link shCollSymb shCharClass
hi def link shEqClass shCharClass
hi def link shSnglCase Statement
hi def link shCommandSub Special
2018-07-31 22:23:58 +02:00
hi def link shCommandSubBQ shCommandSub
hi def link shSubshare shCommandSub
hi def link shValsub shCommandSub
hi def link shComment Comment
hi def link shConditional Conditional
hi def link shCtrlSeq Special
hi def link shExprRegion Delimiter
hi def link shFunctionKey Function
hi def link shFunctionName Function
hi def link shNumber Number
hi def link shOperator Operator
hi def link shRepeat Repeat
hi def link shSet Statement
hi def link shSetList Identifier
hi def link shShellVariables PreProc
hi def link shSpecial Special
2018-07-31 22:23:58 +02:00
hi def link shSpecialDQ Special
hi def link shSpecialSQ Special
2017-11-05 18:19:24 +01:00
hi def link shSpecialNoZS shSpecial
hi def link shStatement Statement
hi def link shString String
hi def link shTodo Todo
hi def link shAlias Identifier
hi def link shHereDoc01 shRedir
hi def link shHereDoc02 shRedir
hi def link shHereDoc03 shRedir
hi def link shHereDoc04 shRedir
hi def link shHereDoc05 shRedir
hi def link shHereDoc06 shRedir
hi def link shHereDoc07 shRedir
hi def link shHereDoc08 shRedir
hi def link shHereDoc09 shRedir
hi def link shHereDoc10 shRedir
hi def link shHereDoc11 shRedir
hi def link shHereDoc12 shRedir
hi def link shHereDoc13 shRedir
hi def link shHereDoc14 shRedir
hi def link shHereDoc15 shRedir
2020-11-29 14:36:24 +01:00
hi def link shHereDoc16 shRedir
endif
2015-11-10 21:15:48 +01:00
" Delete shell folding commands {{{1
" =============================
delc ShFoldFunctions
delc ShFoldHereDoc
delc ShFoldIfDoFor
2004-06-13 20:20:40 +00:00
" Delete the bracket expression function {{{1
" ======================================
delfun s:GenerateBracketExpressionItems
2004-09-02 19:12:26 +00:00
" Set Current Syntax: {{{1
" ===================
2004-06-13 20:20:40 +00:00
if exists("b:is_bash")
let b:current_syntax = "bash"
elseif exists("b:is_kornshell")
let b:current_syntax = "ksh"
2018-04-06 11:14:11 +02:00
elseif exists("b:is_posix")
let b:current_syntax = "posix"
2004-06-13 20:20:40 +00:00
else
let b:current_syntax = "sh"
endif
2004-09-02 19:12:26 +00:00
" vim: ts=16 fdm=marker