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