chamba 0.7.0 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (134) hide show
  1. package/LICENSE +53 -14
  2. package/README.md +34 -8
  3. package/dist/commands/advanced.js +7 -278
  4. package/dist/commands/dev.js +11 -612
  5. package/dist/commands/doctor.js +1 -29
  6. package/dist/commands/menu.js +1 -80
  7. package/dist/commands/onboard.js +6 -230
  8. package/dist/commands/settings.js +15 -349
  9. package/dist/lib/agent-commands.js +2 -0
  10. package/dist/lib/agent-context.js +6 -210
  11. package/dist/lib/browser.js +1 -40
  12. package/dist/lib/chamba-yaml.js +10 -191
  13. package/dist/lib/constants.js +1 -125
  14. package/dist/lib/dockerfile-builder.js +41 -261
  15. package/dist/lib/env.js +2 -78
  16. package/dist/lib/git-env.js +1 -21
  17. package/dist/lib/global-config.js +4 -66
  18. package/dist/lib/pnpm-store.js +1 -19
  19. package/dist/lib/ports.js +1 -210
  20. package/dist/lib/safe-rm.js +1 -36
  21. package/dist/lib/sessions.js +2 -34
  22. package/dist/lib/shadows.js +1 -176
  23. package/dist/lib/skills.js +2 -0
  24. package/dist/lib/templates.js +1 -0
  25. package/dist/lib/webterm.js +1 -305
  26. package/dist/lib/workspace-identity.js +4 -260
  27. package/package.json +4 -4
  28. package/templates/Dockerfile +15 -22
  29. package/templates/claude-statusline.sh +5 -7
  30. package/templates/context/baseline.md +4 -2
  31. package/templates/context/web-pane-craft.md +1 -1
  32. package/templates/pane-apps/client/assets/api-BBDf_rzz.js +12 -0
  33. package/templates/pane-apps/client/assets/api-DNLbSBpK.css +1 -0
  34. package/templates/pane-apps/client/assets/bee-B7t97l5B.webp +0 -0
  35. package/templates/pane-apps/client/assets/buzz-CUUsbnXH.mp3 +0 -0
  36. package/templates/pane-apps/client/assets/c-BNa-DeUl.json +3552 -0
  37. package/templates/pane-apps/client/assets/cpp-B-T4NRoH.json +20239 -0
  38. package/templates/pane-apps/client/assets/csharp-BbxHChhA.json +6010 -0
  39. package/templates/pane-apps/client/assets/css-CWCxuwmz.json +1860 -0
  40. package/templates/pane-apps/client/assets/diff-B-2N89g8.json +154 -0
  41. package/templates/pane-apps/client/assets/docker-DWTvYW26.json +103 -0
  42. package/templates/pane-apps/client/assets/files-BkmyervY.js +1 -0
  43. package/templates/pane-apps/client/assets/go-B2hyYeNg.json +3156 -0
  44. package/templates/pane-apps/client/assets/graphql-Z6Id2aNO.json +1292 -0
  45. package/templates/pane-apps/client/assets/home-3SeGzySM.css +1 -0
  46. package/templates/pane-apps/client/assets/home-Cu9xOd2i.js +1 -0
  47. package/templates/pane-apps/client/assets/html-BtzvlIfu.json +2627 -0
  48. package/templates/pane-apps/client/assets/ini-Bn3Twap1.json +108 -0
  49. package/templates/pane-apps/client/assets/java-C7t2dwLO.json +1885 -0
  50. package/templates/pane-apps/client/assets/javascript-DuC2v0C0.json +5996 -0
  51. package/templates/pane-apps/client/assets/json-CwdkWeV5.json +206 -0
  52. package/templates/pane-apps/client/assets/jsonc-MYWDbTU3.json +206 -0
  53. package/templates/pane-apps/client/assets/jsx-Cn8EZuIC.json +5996 -0
  54. package/templates/pane-apps/client/assets/kotlin-CFNOz1gw.json +580 -0
  55. package/templates/pane-apps/client/assets/make-BVnlFCcl.json +629 -0
  56. package/templates/pane-apps/client/assets/markdown-B4Xk2WM_.json +3263 -0
  57. package/templates/pane-apps/client/assets/php-CAQzQmmI.json +4188 -0
  58. package/templates/pane-apps/client/assets/pop-D5ZANBC3.mp3 +0 -0
  59. package/templates/pane-apps/client/assets/python-CYQee8m4.json +4174 -0
  60. package/templates/pane-apps/client/assets/reviews-DMrGB-kG.js +153 -0
  61. package/templates/pane-apps/client/assets/reviews-nK_yRav9.css +1 -0
  62. package/templates/pane-apps/client/assets/ruby-D7R58tus.json +3114 -0
  63. package/templates/pane-apps/client/assets/rust-BFBbFiei.json +1103 -0
  64. package/templates/pane-apps/client/assets/scss-TQRhBkPG.json +1874 -0
  65. package/templates/pane-apps/client/assets/shellscript-DieAkC4W.json +2375 -0
  66. package/templates/pane-apps/client/assets/specs-Cabb15F0.js +13 -0
  67. package/templates/pane-apps/client/assets/sql-Bxd030LV.json +634 -0
  68. package/templates/pane-apps/client/assets/toml-ChrKGzsV.json +430 -0
  69. package/templates/pane-apps/client/assets/tsx-D2e90MFw.json +5996 -0
  70. package/templates/pane-apps/client/assets/typescript-DonXQ_n1.json +5747 -0
  71. package/templates/pane-apps/client/assets/useNow-BHFKFraS.js +1 -0
  72. package/templates/pane-apps/client/assets/xml-B17r2RXF.json +382 -0
  73. package/templates/pane-apps/client/assets/yaml-CKn4h1zy.json +627 -0
  74. package/templates/pane-apps/client/home/index.html +16 -0
  75. package/templates/pane-apps/client/reviews/index.html +17 -0
  76. package/templates/pane-apps/client/specs/index.html +4 -2
  77. package/templates/pane-apps/server/home.mjs +12 -0
  78. package/templates/pane-apps/server/reviews.mjs +21 -0
  79. package/templates/pane-apps/server/specs.mjs +5 -1588
  80. package/templates/skills/chamba-statusline/SKILL.md +7 -19
  81. package/templates/skills/dx-review/SKILL.md +136 -0
  82. package/templates/skills/dx-review/references/acts.md +233 -0
  83. package/templates/skills/dx-spec/SKILL.md +230 -30
  84. package/templates/skills/dx-spec/references/principles-template.md +2 -0
  85. package/templates/skills/dx-spec/references/review-guide.md +6 -52
  86. package/templates/skills/dx-spec/references/spec-guide.md +25 -5
  87. package/templates/skills/dx-spec/references/stages.md +149 -60
  88. package/templates/skills/dx-spec-execute/SKILL.md +217 -38
  89. package/templates/startup.mjs +22 -16
  90. package/templates/tool-helper.sh +168 -0
  91. package/templates/webterm/README.md +82 -27
  92. package/templates/webterm/color.js +61 -0
  93. package/templates/webterm/config.js +55 -4
  94. package/templates/webterm/context/claude.md +0 -1
  95. package/templates/webterm/public/app/alerts.js +95 -14
  96. package/templates/webterm/public/app/anchored.js +81 -0
  97. package/templates/webterm/public/app/composer.js +37 -3
  98. package/templates/webterm/public/app/connection.js +23 -0
  99. package/templates/webterm/public/app/dom.js +3 -0
  100. package/templates/webterm/public/app/frames.js +52 -18
  101. package/templates/webterm/public/app/home-host.js +16 -0
  102. package/templates/webterm/public/app/main.js +24 -8
  103. package/templates/webterm/public/app/new-session.js +13 -41
  104. package/templates/webterm/public/app/palette.js +58 -0
  105. package/templates/webterm/public/app/pane-shape.js +169 -0
  106. package/templates/webterm/public/app/pane-shell.js +240 -135
  107. package/templates/webterm/public/app/pane.js +39 -24
  108. package/templates/webterm/public/app/reviews-host.js +19 -0
  109. package/templates/webterm/public/app/specs-host.js +12 -218
  110. package/templates/webterm/public/app/state.js +5 -0
  111. package/templates/webterm/public/app/tabs.js +6 -2
  112. package/templates/webterm/public/app/theme.js +75 -27
  113. package/templates/webterm/public/app/tool-host.js +318 -0
  114. package/templates/webterm/public/app/workspace-color.js +192 -0
  115. package/templates/webterm/public/index.html +22 -4
  116. package/templates/webterm/public/styles.css +195 -21
  117. package/templates/webterm/server.js +198 -150
  118. package/templates/webterm/tool-document.js +3 -2
  119. package/templates/webterm/tools/commands.js +61 -0
  120. package/templates/webterm/tools/home.js +58 -0
  121. package/templates/webterm/tools/index.js +26 -0
  122. package/templates/webterm/tools/mount.js +337 -0
  123. package/templates/webterm/tools/paths.js +34 -0
  124. package/templates/webterm/tools/reviews.js +137 -0
  125. package/templates/webterm/tools/specs.js +154 -0
  126. package/templates/webterm/typed-line.js +70 -7
  127. package/templates/context/context-usage.md +0 -1
  128. package/templates/context-usage.sh +0 -266
  129. package/templates/pane-apps/client/assets/specs-B1970L17.css +0 -1
  130. package/templates/pane-apps/client/assets/specs-cEee_SPn.js +0 -23
  131. package/templates/skills/dx-spec-config/SKILL.md +0 -313
  132. package/templates/skills/dx-spec-config/references/principles-template.md +0 -12
  133. package/templates/specs.sh +0 -106
  134. package/templates/webterm/specs.js +0 -358
@@ -0,0 +1,2375 @@
1
+ {
2
+ "displayName": "Shell",
3
+ "name": "shellscript",
4
+ "patterns": [
5
+ {
6
+ "include": "#initial_context"
7
+ }
8
+ ],
9
+ "repository": {
10
+ "alias_statement": {
11
+ "begin": "[\\t ]*+(alias)[\\t ]*+((?:((?<!\\w)-\\w+)\\b[\\t ]*+)*)[\\t ]*+((?<!\\w)[-0-9A-Z_a-z]+(?!\\w))(?:(\\[)((?:(?:\\$?(?<!\\w)[-0-9A-Z_a-z]+(?!\\w)|@)|\\*)|(-?\\d+))(]))?(?:(?:(=)|(\\+=))|(-=))",
12
+ "beginCaptures": {
13
+ "1": {
14
+ "name": "storage.type.alias.shell"
15
+ },
16
+ "10": {
17
+ "name": "keyword.operator.assignment.compound.shell"
18
+ },
19
+ "11": {
20
+ "name": "keyword.operator.assignment.compound.shell"
21
+ },
22
+ "2": {
23
+ "patterns": [
24
+ {
25
+ "match": "(?<!\\w)-\\w+\\b",
26
+ "name": "string.unquoted.argument.shell constant.other.option.shell"
27
+ }
28
+ ]
29
+ },
30
+ "3": {
31
+ "name": "string.unquoted.argument.shell constant.other.option.shell"
32
+ },
33
+ "4": {
34
+ "name": "variable.other.assignment.shell"
35
+ },
36
+ "5": {
37
+ "name": "punctuation.definition.array.access.shell"
38
+ },
39
+ "6": {
40
+ "name": "variable.other.assignment.shell"
41
+ },
42
+ "7": {
43
+ "name": "constant.numeric.shell constant.numeric.integer.shell"
44
+ },
45
+ "8": {
46
+ "name": "punctuation.definition.array.access.shell"
47
+ },
48
+ "9": {
49
+ "name": "keyword.operator.assignment.shell"
50
+ }
51
+ },
52
+ "end": "(?=[\\t ]|$)|(?:(?:(?:(;)|(&&))|(\\|\\|))|(&))",
53
+ "endCaptures": {
54
+ "1": {
55
+ "name": "punctuation.terminator.statement.semicolon.shell"
56
+ },
57
+ "2": {
58
+ "name": "punctuation.separator.statement.and.shell"
59
+ },
60
+ "3": {
61
+ "name": "punctuation.separator.statement.or.shell"
62
+ },
63
+ "4": {
64
+ "name": "punctuation.separator.statement.background.shell"
65
+ }
66
+ },
67
+ "name": "meta.expression.assignment.alias.shell",
68
+ "patterns": [
69
+ {
70
+ "include": "#normal_context"
71
+ }
72
+ ]
73
+ },
74
+ "argument": {
75
+ "begin": "[\\t ]++(?![\\n#\\&(\\[|]|$|;)",
76
+ "beginCaptures": {
77
+ },
78
+ "end": "(?=[\\t \\&;|]|$|[\\n)`])",
79
+ "endCaptures": {
80
+ },
81
+ "name": "meta.argument.shell",
82
+ "patterns": [
83
+ {
84
+ "include": "#argument_context"
85
+ },
86
+ {
87
+ "include": "#line_continuation"
88
+ }
89
+ ]
90
+ },
91
+ "argument_context": {
92
+ "patterns": [
93
+ {
94
+ "captures": {
95
+ "1": {
96
+ "name": "string.unquoted.argument.shell",
97
+ "patterns": [
98
+ {
99
+ "match": "\\*",
100
+ "name": "variable.language.special.wildcard.shell"
101
+ },
102
+ {
103
+ "include": "#variable"
104
+ },
105
+ {
106
+ "include": "#numeric_literal"
107
+ },
108
+ {
109
+ "captures": {
110
+ "1": {
111
+ "name": "constant.language.$1.shell"
112
+ }
113
+ },
114
+ "match": "(?<!\\w)\\b(true|false)\\b(?!\\w)"
115
+ }
116
+ ]
117
+ }
118
+ },
119
+ "match": "[\\t ]*+([^\\t\\n \"$\\&-);<>\\\\`|]+(?!>))"
120
+ },
121
+ {
122
+ "include": "#normal_context"
123
+ }
124
+ ]
125
+ },
126
+ "arithmetic_double": {
127
+ "patterns": [
128
+ {
129
+ "begin": "\\(\\(",
130
+ "beginCaptures": {
131
+ "0": {
132
+ "name": "punctuation.section.arithmetic.double.shell"
133
+ }
134
+ },
135
+ "end": "\\)\\s*\\)",
136
+ "endCaptures": {
137
+ "0": {
138
+ "name": "punctuation.section.arithmetic.double.shell"
139
+ }
140
+ },
141
+ "name": "meta.arithmetic.shell",
142
+ "patterns": [
143
+ {
144
+ "include": "#math"
145
+ },
146
+ {
147
+ "include": "#string"
148
+ }
149
+ ]
150
+ }
151
+ ]
152
+ },
153
+ "arithmetic_no_dollar": {
154
+ "patterns": [
155
+ {
156
+ "begin": "\\(",
157
+ "beginCaptures": {
158
+ "0": {
159
+ "name": "punctuation.section.arithmetic.single.shell"
160
+ }
161
+ },
162
+ "end": "\\)",
163
+ "endCaptures": {
164
+ "0": {
165
+ "name": "punctuation.section.arithmetic.single.shell"
166
+ }
167
+ },
168
+ "name": "meta.arithmetic.shell",
169
+ "patterns": [
170
+ {
171
+ "include": "#math"
172
+ },
173
+ {
174
+ "include": "#string"
175
+ }
176
+ ]
177
+ }
178
+ ]
179
+ },
180
+ "array_access_inline": {
181
+ "captures": {
182
+ "1": {
183
+ "name": "punctuation.section.array.shell"
184
+ },
185
+ "2": {
186
+ "patterns": [
187
+ {
188
+ "include": "#special_expansion"
189
+ },
190
+ {
191
+ "include": "#string"
192
+ },
193
+ {
194
+ "include": "#variable"
195
+ }
196
+ ]
197
+ },
198
+ "3": {
199
+ "name": "punctuation.section.array.shell"
200
+ }
201
+ },
202
+ "match": "(\\[)([^]\\[]+)(])"
203
+ },
204
+ "array_value": {
205
+ "begin": "[\\t ]*+((?<!\\w)[-0-9A-Z_a-z]+(?!\\w))(?:(\\[)((?:(?:\\$?(?<!\\w)[-0-9A-Z_a-z]+(?!\\w)|@)|\\*)|(-?\\d+))(]))?(?:(?:(=)|(\\+=))|(-=))[\\t ]*+(\\()",
206
+ "beginCaptures": {
207
+ "1": {
208
+ "name": "variable.other.assignment.shell"
209
+ },
210
+ "2": {
211
+ "name": "punctuation.definition.array.access.shell"
212
+ },
213
+ "3": {
214
+ "name": "variable.other.assignment.shell"
215
+ },
216
+ "4": {
217
+ "name": "constant.numeric.shell constant.numeric.integer.shell"
218
+ },
219
+ "5": {
220
+ "name": "punctuation.definition.array.access.shell"
221
+ },
222
+ "6": {
223
+ "name": "keyword.operator.assignment.shell"
224
+ },
225
+ "7": {
226
+ "name": "keyword.operator.assignment.compound.shell"
227
+ },
228
+ "8": {
229
+ "name": "keyword.operator.assignment.compound.shell"
230
+ },
231
+ "9": {
232
+ "name": "punctuation.definition.array.shell"
233
+ }
234
+ },
235
+ "end": "\\)",
236
+ "endCaptures": {
237
+ "0": {
238
+ "name": "punctuation.definition.array.shell"
239
+ }
240
+ },
241
+ "patterns": [
242
+ {
243
+ "include": "#comment"
244
+ },
245
+ {
246
+ "captures": {
247
+ "1": {
248
+ "name": "variable.other.assignment.array.shell entity.other.attribute-name.shell"
249
+ },
250
+ "2": {
251
+ "name": "keyword.operator.assignment.shell punctuation.definition.assignment.shell"
252
+ }
253
+ },
254
+ "match": "((?<!\\w)[-0-9A-Z_a-z]+(?!\\w))(=)"
255
+ },
256
+ {
257
+ "captures": {
258
+ "1": {
259
+ "name": "punctuation.definition.bracket.named-array.shell"
260
+ },
261
+ "2": {
262
+ "name": "string.unquoted.shell entity.other.attribute-name.bracket.shell"
263
+ },
264
+ "3": {
265
+ "name": "punctuation.definition.bracket.named-array.shell"
266
+ },
267
+ "4": {
268
+ "name": "punctuation.definition.assignment.shell"
269
+ }
270
+ },
271
+ "match": "(\\[)(.+?)(])(=)"
272
+ },
273
+ {
274
+ "include": "#normal_context"
275
+ },
276
+ {
277
+ "include": "#simple_unquoted"
278
+ }
279
+ ]
280
+ },
281
+ "assignment_statement": {
282
+ "patterns": [
283
+ {
284
+ "include": "#array_value"
285
+ },
286
+ {
287
+ "include": "#modified_assignment_statement"
288
+ },
289
+ {
290
+ "include": "#normal_assignment_statement"
291
+ }
292
+ ]
293
+ },
294
+ "basic_command_name": {
295
+ "captures": {
296
+ "1": {
297
+ "name": "storage.modifier.$1.shell"
298
+ },
299
+ "2": {
300
+ "name": "entity.name.function.call.shell entity.name.command.shell",
301
+ "patterns": [
302
+ {
303
+ "match": "(?<!\\w)(?:continue|return|break)(?!\\w)",
304
+ "name": "keyword.control.$0.shell"
305
+ },
306
+ {
307
+ "match": "(?<!\\w)(?:unfunction|continue|autoload|unsetopt|bindkey|builtin|getopts|command|declare|unalias|history|unlimit|typeset|suspend|source|printf|unhash|disown|ulimit|return|which|alias|break|false|print|shift|times|umask|unset|read|type|exec|eval|wait|echo|dirs|jobs|kill|hash|stat|exit|test|trap|true|let|set|pwd|cd|fg|bg|fc|[.:])(?!/)(?!\\w)(?!-)",
308
+ "name": "support.function.builtin.shell"
309
+ },
310
+ {
311
+ "include": "#variable"
312
+ }
313
+ ]
314
+ }
315
+ },
316
+ "match": "(?![\\n!#\\&()<>\\[{|]|$|[\\t ;])(?!nocorrect |nocorrect\\t|nocorrect$|readonly |readonly\\t|readonly$|function |function\\t|function$|foreach |foreach\\t|foreach$|coproc |coproc\\t|coproc$|logout |logout\\t|logout$|export |export\\t|export$|select |select\\t|select$|repeat |repeat\\t|repeat$|pushd |pushd\\t|pushd$|until |until\\t|until$|while |while\\t|while$|local |local\\t|local$|case |case\\t|case$|done |done\\t|done$|elif |elif\\t|elif$|else |else\\t|else$|esac |esac\\t|esac$|popd |popd\\t|popd$|then |then\\t|then$|time |time\\t|time$|for |for\\t|for$|end |end\\t|end$|fi |fi\\t|fi$|do |do\\t|do$|in |in\\t|in$|if |if\\t|if$)(?:((?<=^|[\\t \\&;])(?:readonly|declare|typeset|export|local)(?=[\\t \\&;]|$))|((?![\"']|\\\\\\n?$)[^\\t\\n\\r !\"'<>]+?))(?:(?=[\\t ])|(?=[\\n\\&);`{|}]|[\\t ]*#|])(?<!\\\\))",
317
+ "name": "meta.statement.command.name.basic.shell"
318
+ },
319
+ "block_comment": {
320
+ "begin": "\\s*+(/\\*)",
321
+ "beginCaptures": {
322
+ "1": {
323
+ "name": "punctuation.definition.comment.begin.shell"
324
+ }
325
+ },
326
+ "end": "\\*/",
327
+ "endCaptures": {
328
+ "0": {
329
+ "name": "punctuation.definition.comment.end.shell"
330
+ }
331
+ },
332
+ "name": "comment.block.shell"
333
+ },
334
+ "boolean": {
335
+ "match": "\\b(?:true|false)\\b",
336
+ "name": "constant.language.$0.shell"
337
+ },
338
+ "case_statement": {
339
+ "begin": "\\b(case)\\b[\\t ]*+(.+?)[\\t ]*+\\b(in)\\b",
340
+ "beginCaptures": {
341
+ "1": {
342
+ "name": "keyword.control.case.shell"
343
+ },
344
+ "2": {
345
+ "patterns": [
346
+ {
347
+ "include": "#initial_context"
348
+ }
349
+ ]
350
+ },
351
+ "3": {
352
+ "name": "keyword.control.in.shell"
353
+ }
354
+ },
355
+ "end": "\\besac\\b",
356
+ "endCaptures": {
357
+ "0": {
358
+ "name": "keyword.control.esac.shell"
359
+ }
360
+ },
361
+ "name": "meta.case.shell",
362
+ "patterns": [
363
+ {
364
+ "include": "#comment"
365
+ },
366
+ {
367
+ "captures": {
368
+ "1": {
369
+ "name": "keyword.operator.pattern.case.default.shell"
370
+ }
371
+ },
372
+ "match": "[\\t ]*+(\\* *\\))"
373
+ },
374
+ {
375
+ "begin": "(?<!\\))(?![\\t ]*+(?:esac\\b|$))",
376
+ "beginCaptures": {
377
+ },
378
+ "end": "(?=\\besac\\b)|(\\))",
379
+ "endCaptures": {
380
+ "1": {
381
+ "name": "keyword.operator.pattern.case.shell"
382
+ }
383
+ },
384
+ "name": "meta.case.entry.pattern.shell",
385
+ "patterns": [
386
+ {
387
+ "include": "#case_statement_context"
388
+ }
389
+ ]
390
+ },
391
+ {
392
+ "begin": "(?<=\\))",
393
+ "beginCaptures": {
394
+ },
395
+ "end": "(;;)|(?=\\besac\\b)",
396
+ "endCaptures": {
397
+ "1": {
398
+ "name": "punctuation.terminator.statement.case.shell"
399
+ }
400
+ },
401
+ "name": "meta.case.entry.body.shell",
402
+ "patterns": [
403
+ {
404
+ "include": "#typical_statements"
405
+ },
406
+ {
407
+ "include": "#initial_context"
408
+ }
409
+ ]
410
+ }
411
+ ]
412
+ },
413
+ "case_statement_context": {
414
+ "patterns": [
415
+ {
416
+ "match": "\\*",
417
+ "name": "variable.language.special.quantifier.star.shell keyword.operator.quantifier.star.shell punctuation.definition.arbitrary-repetition.shell punctuation.definition.regex.arbitrary-repetition.shell"
418
+ },
419
+ {
420
+ "match": "\\+",
421
+ "name": "variable.language.special.quantifier.plus.shell keyword.operator.quantifier.plus.shell punctuation.definition.arbitrary-repetition.shell punctuation.definition.regex.arbitrary-repetition.shell"
422
+ },
423
+ {
424
+ "match": "\\?",
425
+ "name": "variable.language.special.quantifier.question.shell keyword.operator.quantifier.question.shell punctuation.definition.arbitrary-repetition.shell punctuation.definition.regex.arbitrary-repetition.shell"
426
+ },
427
+ {
428
+ "match": "@",
429
+ "name": "variable.language.special.at.shell keyword.operator.at.shell punctuation.definition.regex.at.shell"
430
+ },
431
+ {
432
+ "match": "\\|",
433
+ "name": "keyword.operator.orvariable.language.special.or.shell keyword.operator.alternation.ruby.shell punctuation.definition.regex.alternation.shell punctuation.separator.regex.alternation.shell"
434
+ },
435
+ {
436
+ "match": "\\\\.",
437
+ "name": "constant.character.escape.shell"
438
+ },
439
+ {
440
+ "match": "(?<=\\tin| in|[\\t ]|;;)\\(",
441
+ "name": "keyword.operator.pattern.case.shell"
442
+ },
443
+ {
444
+ "begin": "(?<=\\S)(\\()",
445
+ "beginCaptures": {
446
+ "1": {
447
+ "name": "punctuation.definition.group.shell punctuation.definition.regex.group.shell"
448
+ }
449
+ },
450
+ "end": "\\)",
451
+ "endCaptures": {
452
+ "0": {
453
+ "name": "punctuation.definition.group.shell punctuation.definition.regex.group.shell"
454
+ }
455
+ },
456
+ "name": "meta.parenthese.shell",
457
+ "patterns": [
458
+ {
459
+ "include": "#case_statement_context"
460
+ }
461
+ ]
462
+ },
463
+ {
464
+ "begin": "\\[",
465
+ "beginCaptures": {
466
+ "0": {
467
+ "name": "punctuation.definition.character-class.shell"
468
+ }
469
+ },
470
+ "end": "]",
471
+ "endCaptures": {
472
+ "0": {
473
+ "name": "punctuation.definition.character-class.shell"
474
+ }
475
+ },
476
+ "name": "string.regexp.character-class.shell",
477
+ "patterns": [
478
+ {
479
+ "match": "\\\\.",
480
+ "name": "constant.character.escape.shell"
481
+ }
482
+ ]
483
+ },
484
+ {
485
+ "include": "#string"
486
+ },
487
+ {
488
+ "match": "[^\\t\\n )*?@\\[|]",
489
+ "name": "string.unquoted.pattern.shell string.regexp.unquoted.shell"
490
+ }
491
+ ]
492
+ },
493
+ "command_name_range": {
494
+ "begin": "\\G",
495
+ "beginCaptures": {
496
+ },
497
+ "end": "(?=[\\t \\&;|]|$|[\\n)`])|(?=<)",
498
+ "endCaptures": {
499
+ },
500
+ "name": "meta.statement.command.name.shell",
501
+ "patterns": [
502
+ {
503
+ "match": "(?<!\\w)(?:continue|return|break)(?!\\w)",
504
+ "name": "entity.name.function.call.shell entity.name.command.shell keyword.control.$0.shell"
505
+ },
506
+ {
507
+ "match": "(?<!\\w)(?:unfunction|continue|autoload|unsetopt|bindkey|builtin|getopts|command|declare|unalias|history|unlimit|typeset|suspend|source|printf|unhash|disown|ulimit|return|which|alias|break|false|print|shift|times|umask|unset|read|type|exec|eval|wait|echo|dirs|jobs|kill|hash|stat|exit|test|trap|true|let|set|pwd|cd|fg|bg|fc|[.:])(?!/)(?!\\w)(?!-)",
508
+ "name": "entity.name.function.call.shell entity.name.command.shell support.function.builtin.shell"
509
+ },
510
+ {
511
+ "include": "#variable"
512
+ },
513
+ {
514
+ "captures": {
515
+ "1": {
516
+ "name": "entity.name.function.call.shell entity.name.command.shell"
517
+ }
518
+ },
519
+ "match": "(?<!\\w)(?<=\\G|[\"')}])([^\\t\\n\\r \"\\&');->`{|]+)"
520
+ },
521
+ {
522
+ "begin": "(?:\\G|(?<![\\t\\n #\\&;{|]))(\\$?)((\")|('))",
523
+ "beginCaptures": {
524
+ "1": {
525
+ "name": "meta.statement.command.name.quoted.shell punctuation.definition.string.shell entity.name.function.call.shell entity.name.command.shell"
526
+ },
527
+ "2": {
528
+ },
529
+ "3": {
530
+ "name": "meta.statement.command.name.quoted.shell string.quoted.double.shell punctuation.definition.string.begin.shell entity.name.function.call.shell entity.name.command.shell"
531
+ },
532
+ "4": {
533
+ "name": "meta.statement.command.name.quoted.shell string.quoted.single.shell punctuation.definition.string.begin.shell entity.name.function.call.shell entity.name.command.shell"
534
+ }
535
+ },
536
+ "end": "(?<!\\G)(?<=\\2)",
537
+ "endCaptures": {
538
+ },
539
+ "patterns": [
540
+ {
541
+ "include": "#continuation_of_single_quoted_command_name"
542
+ },
543
+ {
544
+ "include": "#continuation_of_double_quoted_command_name"
545
+ }
546
+ ]
547
+ },
548
+ {
549
+ "include": "#line_continuation"
550
+ },
551
+ {
552
+ "include": "#simple_unquoted"
553
+ }
554
+ ]
555
+ },
556
+ "command_statement": {
557
+ "begin": "[\\t ]*+(?![\\n!#\\&()<>\\[{|]|$|[\\t ;])(?!nocorrect |nocorrect\\t|nocorrect$|readonly |readonly\\t|readonly$|function |function\\t|function$|foreach |foreach\\t|foreach$|coproc |coproc\\t|coproc$|logout |logout\\t|logout$|export |export\\t|export$|select |select\\t|select$|repeat |repeat\\t|repeat$|pushd |pushd\\t|pushd$|until |until\\t|until$|while |while\\t|while$|local |local\\t|local$|case |case\\t|case$|done |done\\t|done$|elif |elif\\t|elif$|else |else\\t|else$|esac |esac\\t|esac$|popd |popd\\t|popd$|then |then\\t|then$|time |time\\t|time$|for |for\\t|for$|end |end\\t|end$|fi |fi\\t|fi$|do |do\\t|do$|in |in\\t|in$|if |if\\t|if$)(?!\\\\\\n?$)",
558
+ "beginCaptures": {
559
+ },
560
+ "end": "(?=[\\n\\&);`{|}]|[\\t ]*#|])(?<!\\\\)",
561
+ "endCaptures": {
562
+ },
563
+ "name": "meta.statement.command.shell",
564
+ "patterns": [
565
+ {
566
+ "include": "#command_name_range"
567
+ },
568
+ {
569
+ "include": "#line_continuation"
570
+ },
571
+ {
572
+ "include": "#option"
573
+ },
574
+ {
575
+ "include": "#argument"
576
+ },
577
+ {
578
+ "include": "#string"
579
+ },
580
+ {
581
+ "include": "#heredoc"
582
+ }
583
+ ]
584
+ },
585
+ "comment": {
586
+ "captures": {
587
+ "1": {
588
+ "name": "comment.line.number-sign.shell meta.shebang.shell"
589
+ },
590
+ "2": {
591
+ "name": "punctuation.definition.comment.shebang.shell"
592
+ },
593
+ "3": {
594
+ "name": "comment.line.number-sign.shell"
595
+ },
596
+ "4": {
597
+ "name": "punctuation.definition.comment.shell"
598
+ }
599
+ },
600
+ "match": "(?:^|[\\t ]++)(?:((#!).*)|((#).*))"
601
+ },
602
+ "comments": {
603
+ "patterns": [
604
+ {
605
+ "include": "#block_comment"
606
+ },
607
+ {
608
+ "include": "#line_comment"
609
+ }
610
+ ]
611
+ },
612
+ "compound-command": {
613
+ "patterns": [
614
+ {
615
+ "begin": "\\[",
616
+ "beginCaptures": {
617
+ "0": {
618
+ "name": "punctuation.definition.logical-expression.shell"
619
+ }
620
+ },
621
+ "end": "]",
622
+ "endCaptures": {
623
+ "0": {
624
+ "name": "punctuation.definition.logical-expression.shell"
625
+ }
626
+ },
627
+ "name": "meta.scope.logical-expression.shell",
628
+ "patterns": [
629
+ {
630
+ "include": "#logical-expression"
631
+ },
632
+ {
633
+ "include": "#initial_context"
634
+ }
635
+ ]
636
+ },
637
+ {
638
+ "begin": "(?<=\\s|^)\\{(?=\\s|$)",
639
+ "beginCaptures": {
640
+ "0": {
641
+ "name": "punctuation.definition.group.shell"
642
+ }
643
+ },
644
+ "end": "(?<=^|;)\\s*(})",
645
+ "endCaptures": {
646
+ "1": {
647
+ "name": "punctuation.definition.group.shell"
648
+ }
649
+ },
650
+ "name": "meta.scope.group.shell",
651
+ "patterns": [
652
+ {
653
+ "include": "#initial_context"
654
+ }
655
+ ]
656
+ }
657
+ ]
658
+ },
659
+ "continuation_of_double_quoted_command_name": {
660
+ "begin": "\\G(?<=\")",
661
+ "beginCaptures": {
662
+ },
663
+ "contentName": "meta.statement.command.name.continuation string.quoted.double entity.name.function.call entity.name.command",
664
+ "end": "\"",
665
+ "endCaptures": {
666
+ "0": {
667
+ "name": "string.quoted.double.shell punctuation.definition.string.end.shell entity.name.function.call.shell entity.name.command.shell"
668
+ }
669
+ },
670
+ "patterns": [
671
+ {
672
+ "match": "\\\\[\\n\"$\\\\`]",
673
+ "name": "constant.character.escape.shell"
674
+ },
675
+ {
676
+ "include": "#variable"
677
+ },
678
+ {
679
+ "include": "#interpolation"
680
+ }
681
+ ]
682
+ },
683
+ "continuation_of_single_quoted_command_name": {
684
+ "begin": "\\G(?<=')",
685
+ "beginCaptures": {
686
+ },
687
+ "contentName": "meta.statement.command.name.continuation string.quoted.single entity.name.function.call entity.name.command",
688
+ "end": "'",
689
+ "endCaptures": {
690
+ "0": {
691
+ "name": "string.quoted.single.shell punctuation.definition.string.end.shell entity.name.function.call.shell entity.name.command.shell"
692
+ }
693
+ }
694
+ },
695
+ "custom_command_names": {
696
+ "patterns": [
697
+ ]
698
+ },
699
+ "custom_commands": {
700
+ "patterns": [
701
+ ]
702
+ },
703
+ "double_quote_context": {
704
+ "patterns": [
705
+ {
706
+ "match": "\\\\[\\n\"$\\\\`]",
707
+ "name": "constant.character.escape.shell"
708
+ },
709
+ {
710
+ "include": "#variable"
711
+ },
712
+ {
713
+ "include": "#interpolation"
714
+ }
715
+ ]
716
+ },
717
+ "double_quote_escape_char": {
718
+ "match": "\\\\[\\n\"$\\\\`]",
719
+ "name": "constant.character.escape.shell"
720
+ },
721
+ "floating_keyword": {
722
+ "patterns": [
723
+ {
724
+ "match": "(?<=^|[\\t \\&;])(?:then|elif|else|done|end|do|if|fi)(?=[\\t \\&;]|$)",
725
+ "name": "keyword.control.$0.shell"
726
+ }
727
+ ]
728
+ },
729
+ "for_statement": {
730
+ "patterns": [
731
+ {
732
+ "begin": "\\b(for)\\b[\\t ]*+((?<!\\w)[-0-9A-Z_a-z]+(?!\\w))[\\t ]*+\\b(in)\\b",
733
+ "beginCaptures": {
734
+ "1": {
735
+ "name": "keyword.control.for.shell"
736
+ },
737
+ "2": {
738
+ "name": "variable.other.for.shell"
739
+ },
740
+ "3": {
741
+ "name": "keyword.control.in.shell"
742
+ }
743
+ },
744
+ "end": "(?=[\\n\\&);`{|}]|[\\t ]*#|])(?<!\\\\)",
745
+ "endCaptures": {
746
+ },
747
+ "name": "meta.for.in.shell",
748
+ "patterns": [
749
+ {
750
+ "include": "#string"
751
+ },
752
+ {
753
+ "include": "#simple_unquoted"
754
+ },
755
+ {
756
+ "include": "#normal_context"
757
+ }
758
+ ]
759
+ },
760
+ {
761
+ "begin": "\\b(for)\\b",
762
+ "beginCaptures": {
763
+ "1": {
764
+ "name": "keyword.control.for.shell"
765
+ }
766
+ },
767
+ "end": "(?=[\\n\\&);`{|}]|[\\t ]*#|])(?<!\\\\)",
768
+ "endCaptures": {
769
+ },
770
+ "name": "meta.for.shell",
771
+ "patterns": [
772
+ {
773
+ "include": "#arithmetic_double"
774
+ },
775
+ {
776
+ "include": "#normal_context"
777
+ }
778
+ ]
779
+ }
780
+ ]
781
+ },
782
+ "function_definition": {
783
+ "applyEndPatternLast": 1,
784
+ "begin": "[\\t ]*+(?:\\b(function)\\b[\\t ]*+([^\\t\\n\\r \"'()=]+)(?:(\\()[\\t ]*+(\\)))?|([^\\t\\n\\r \"'()=]+)[\\t ]*+(\\()[\\t ]*+(\\)))",
785
+ "beginCaptures": {
786
+ "1": {
787
+ "name": "storage.type.function.shell"
788
+ },
789
+ "2": {
790
+ "name": "entity.name.function.shell"
791
+ },
792
+ "3": {
793
+ "name": "punctuation.definition.arguments.shell"
794
+ },
795
+ "4": {
796
+ "name": "punctuation.definition.arguments.shell"
797
+ },
798
+ "5": {
799
+ "name": "entity.name.function.shell"
800
+ },
801
+ "6": {
802
+ "name": "punctuation.definition.arguments.shell"
803
+ },
804
+ "7": {
805
+ "name": "punctuation.definition.arguments.shell"
806
+ }
807
+ },
808
+ "end": "(?<=[)}])",
809
+ "endCaptures": {
810
+ },
811
+ "name": "meta.function.shell",
812
+ "patterns": [
813
+ {
814
+ "match": "\\G[\\t\\n ]"
815
+ },
816
+ {
817
+ "begin": "\\{",
818
+ "beginCaptures": {
819
+ "0": {
820
+ "name": "punctuation.definition.group.shell punctuation.section.function.definition.shell"
821
+ }
822
+ },
823
+ "end": "}",
824
+ "endCaptures": {
825
+ "0": {
826
+ "name": "punctuation.definition.group.shell punctuation.section.function.definition.shell"
827
+ }
828
+ },
829
+ "name": "meta.function.body.shell",
830
+ "patterns": [
831
+ {
832
+ "include": "#initial_context"
833
+ }
834
+ ]
835
+ },
836
+ {
837
+ "begin": "\\(",
838
+ "beginCaptures": {
839
+ "0": {
840
+ "name": "punctuation.definition.group.shell punctuation.section.function.definition.shell"
841
+ }
842
+ },
843
+ "end": "\\)",
844
+ "endCaptures": {
845
+ "0": {
846
+ "name": "punctuation.definition.group.shell punctuation.section.function.definition.shell"
847
+ }
848
+ },
849
+ "name": "meta.function.body.shell",
850
+ "patterns": [
851
+ {
852
+ "include": "#initial_context"
853
+ }
854
+ ]
855
+ },
856
+ {
857
+ "include": "#initial_context"
858
+ }
859
+ ]
860
+ },
861
+ "heredoc": {
862
+ "patterns": [
863
+ {
864
+ "begin": "((?<!<)<<-)[\\t ]*+([\"'])[\\t ]*+([^\"']+?)(?=[\"\\&';<\\s])(\\2)(.*)",
865
+ "beginCaptures": {
866
+ "1": {
867
+ "name": "keyword.operator.heredoc.shell"
868
+ },
869
+ "2": {
870
+ "name": "punctuation.definition.string.heredoc.quote.shell"
871
+ },
872
+ "3": {
873
+ "name": "punctuation.definition.string.heredoc.delimiter.shell"
874
+ },
875
+ "4": {
876
+ "name": "punctuation.definition.string.heredoc.quote.shell"
877
+ },
878
+ "5": {
879
+ "patterns": [
880
+ {
881
+ "include": "#redirect_fix"
882
+ },
883
+ {
884
+ "include": "#typical_statements"
885
+ }
886
+ ]
887
+ }
888
+ },
889
+ "contentName": "string.quoted.heredoc.indent.$3",
890
+ "end": "^\\t*\\3(?=[\\&;\\s]|$)",
891
+ "endCaptures": {
892
+ "0": {
893
+ "name": "punctuation.definition.string.heredoc.$0.shell"
894
+ }
895
+ },
896
+ "patterns": [
897
+ ]
898
+ },
899
+ {
900
+ "begin": "((?<!<)<<(?!<))[\\t ]*+([\"'])[\\t ]*+([^\"']+?)(?=[\"\\&';<\\s])(\\2)(.*)",
901
+ "beginCaptures": {
902
+ "1": {
903
+ "name": "keyword.operator.heredoc.shell"
904
+ },
905
+ "2": {
906
+ "name": "punctuation.definition.string.heredoc.quote.shell"
907
+ },
908
+ "3": {
909
+ "name": "punctuation.definition.string.heredoc.delimiter.shell"
910
+ },
911
+ "4": {
912
+ "name": "punctuation.definition.string.heredoc.quote.shell"
913
+ },
914
+ "5": {
915
+ "patterns": [
916
+ {
917
+ "include": "#redirect_fix"
918
+ },
919
+ {
920
+ "include": "#typical_statements"
921
+ }
922
+ ]
923
+ }
924
+ },
925
+ "contentName": "string.quoted.heredoc.no-indent.$3",
926
+ "end": "^\\3(?=[\\&;\\s]|$)",
927
+ "endCaptures": {
928
+ "0": {
929
+ "name": "punctuation.definition.string.heredoc.delimiter.shell"
930
+ }
931
+ },
932
+ "patterns": [
933
+ ]
934
+ },
935
+ {
936
+ "begin": "((?<!<)<<-)[\\t ]*+([^\\t \"']+)(?=[\"\\&';<\\s])(.*)",
937
+ "beginCaptures": {
938
+ "1": {
939
+ "name": "keyword.operator.heredoc.shell"
940
+ },
941
+ "2": {
942
+ "name": "punctuation.definition.string.heredoc.delimiter.shell"
943
+ },
944
+ "3": {
945
+ "patterns": [
946
+ {
947
+ "include": "#redirect_fix"
948
+ },
949
+ {
950
+ "include": "#typical_statements"
951
+ }
952
+ ]
953
+ }
954
+ },
955
+ "contentName": "string.unquoted.heredoc.indent.$2",
956
+ "end": "^\\t*\\2(?=[\\&;\\s]|$)",
957
+ "endCaptures": {
958
+ "0": {
959
+ "name": "punctuation.definition.string.heredoc.delimiter.shell"
960
+ }
961
+ },
962
+ "patterns": [
963
+ {
964
+ "include": "#double_quote_escape_char"
965
+ },
966
+ {
967
+ "include": "#variable"
968
+ },
969
+ {
970
+ "include": "#interpolation"
971
+ }
972
+ ]
973
+ },
974
+ {
975
+ "begin": "((?<!<)<<(?!<))[\\t ]*+([^\\t \"']+)(?=[\"\\&';<\\s])(.*)",
976
+ "beginCaptures": {
977
+ "1": {
978
+ "name": "keyword.operator.heredoc.shell"
979
+ },
980
+ "2": {
981
+ "name": "punctuation.definition.string.heredoc.delimiter.shell"
982
+ },
983
+ "3": {
984
+ "patterns": [
985
+ {
986
+ "include": "#redirect_fix"
987
+ },
988
+ {
989
+ "include": "#typical_statements"
990
+ }
991
+ ]
992
+ }
993
+ },
994
+ "contentName": "string.unquoted.heredoc.no-indent.$2",
995
+ "end": "^\\2(?=[\\&;\\s]|$)",
996
+ "endCaptures": {
997
+ "0": {
998
+ "name": "punctuation.definition.string.heredoc.delimiter.shell"
999
+ }
1000
+ },
1001
+ "patterns": [
1002
+ {
1003
+ "include": "#double_quote_escape_char"
1004
+ },
1005
+ {
1006
+ "include": "#variable"
1007
+ },
1008
+ {
1009
+ "include": "#interpolation"
1010
+ }
1011
+ ]
1012
+ }
1013
+ ]
1014
+ },
1015
+ "herestring": {
1016
+ "patterns": [
1017
+ {
1018
+ "begin": "(<<<)\\s*(('))",
1019
+ "beginCaptures": {
1020
+ "1": {
1021
+ "name": "keyword.operator.herestring.shell"
1022
+ },
1023
+ "2": {
1024
+ "name": "string.quoted.single.shell"
1025
+ },
1026
+ "3": {
1027
+ "name": "punctuation.definition.string.begin.shell"
1028
+ }
1029
+ },
1030
+ "contentName": "string.quoted.single.shell",
1031
+ "end": "(')",
1032
+ "endCaptures": {
1033
+ "0": {
1034
+ "name": "string.quoted.single.shell"
1035
+ },
1036
+ "1": {
1037
+ "name": "punctuation.definition.string.end.shell"
1038
+ }
1039
+ },
1040
+ "name": "meta.herestring.shell"
1041
+ },
1042
+ {
1043
+ "begin": "(<<<)\\s*((\"))",
1044
+ "beginCaptures": {
1045
+ "1": {
1046
+ "name": "keyword.operator.herestring.shell"
1047
+ },
1048
+ "2": {
1049
+ "name": "string.quoted.double.shell"
1050
+ },
1051
+ "3": {
1052
+ "name": "punctuation.definition.string.begin.shell"
1053
+ }
1054
+ },
1055
+ "contentName": "string.quoted.double.shell",
1056
+ "end": "(\")",
1057
+ "endCaptures": {
1058
+ "0": {
1059
+ "name": "string.quoted.double.shell"
1060
+ },
1061
+ "1": {
1062
+ "name": "punctuation.definition.string.end.shell"
1063
+ }
1064
+ },
1065
+ "name": "meta.herestring.shell",
1066
+ "patterns": [
1067
+ {
1068
+ "include": "#double_quote_context"
1069
+ }
1070
+ ]
1071
+ },
1072
+ {
1073
+ "captures": {
1074
+ "1": {
1075
+ "name": "keyword.operator.herestring.shell"
1076
+ },
1077
+ "2": {
1078
+ "name": "string.unquoted.herestring.shell",
1079
+ "patterns": [
1080
+ {
1081
+ "include": "#initial_context"
1082
+ }
1083
+ ]
1084
+ }
1085
+ },
1086
+ "match": "(<<<)\\s*(([^)\\\\\\s]|\\\\.)+)",
1087
+ "name": "meta.herestring.shell"
1088
+ }
1089
+ ]
1090
+ },
1091
+ "initial_context": {
1092
+ "patterns": [
1093
+ {
1094
+ "include": "#comment"
1095
+ },
1096
+ {
1097
+ "include": "#pipeline"
1098
+ },
1099
+ {
1100
+ "include": "#normal_statement_seperator"
1101
+ },
1102
+ {
1103
+ "include": "#logical_expression_double"
1104
+ },
1105
+ {
1106
+ "include": "#logical_expression_single"
1107
+ },
1108
+ {
1109
+ "include": "#assignment_statement"
1110
+ },
1111
+ {
1112
+ "include": "#case_statement"
1113
+ },
1114
+ {
1115
+ "include": "#for_statement"
1116
+ },
1117
+ {
1118
+ "include": "#loop"
1119
+ },
1120
+ {
1121
+ "include": "#function_definition"
1122
+ },
1123
+ {
1124
+ "include": "#line_continuation"
1125
+ },
1126
+ {
1127
+ "include": "#arithmetic_double"
1128
+ },
1129
+ {
1130
+ "include": "#misc_ranges"
1131
+ },
1132
+ {
1133
+ "include": "#variable"
1134
+ },
1135
+ {
1136
+ "include": "#interpolation"
1137
+ },
1138
+ {
1139
+ "include": "#heredoc"
1140
+ },
1141
+ {
1142
+ "include": "#herestring"
1143
+ },
1144
+ {
1145
+ "include": "#redirection"
1146
+ },
1147
+ {
1148
+ "include": "#pathname"
1149
+ },
1150
+ {
1151
+ "include": "#floating_keyword"
1152
+ },
1153
+ {
1154
+ "include": "#alias_statement"
1155
+ },
1156
+ {
1157
+ "include": "#normal_statement"
1158
+ },
1159
+ {
1160
+ "include": "#string"
1161
+ },
1162
+ {
1163
+ "include": "#support"
1164
+ }
1165
+ ]
1166
+ },
1167
+ "inline_comment": {
1168
+ "captures": {
1169
+ "1": {
1170
+ "name": "comment.block.shell punctuation.definition.comment.begin.shell"
1171
+ },
1172
+ "2": {
1173
+ "name": "comment.block.shell"
1174
+ },
1175
+ "3": {
1176
+ "patterns": [
1177
+ {
1178
+ "match": "\\*/",
1179
+ "name": "comment.block.shell punctuation.definition.comment.end.shell"
1180
+ },
1181
+ {
1182
+ "match": "\\*",
1183
+ "name": "comment.block.shell"
1184
+ }
1185
+ ]
1186
+ }
1187
+ },
1188
+ "match": "(/\\*)((?:[^*]|\\*++[^/])*+(\\*++/))"
1189
+ },
1190
+ "interpolation": {
1191
+ "patterns": [
1192
+ {
1193
+ "include": "#arithmetic_dollar"
1194
+ },
1195
+ {
1196
+ "include": "#subshell_dollar"
1197
+ },
1198
+ {
1199
+ "begin": "`",
1200
+ "beginCaptures": {
1201
+ "0": {
1202
+ "name": "punctuation.definition.evaluation.backticks.shell"
1203
+ }
1204
+ },
1205
+ "end": "`",
1206
+ "endCaptures": {
1207
+ "0": {
1208
+ "name": "punctuation.definition.evaluation.backticks.shell"
1209
+ }
1210
+ },
1211
+ "name": "string.interpolated.backtick.shell",
1212
+ "patterns": [
1213
+ {
1214
+ "match": "\\\\[$\\\\`]",
1215
+ "name": "constant.character.escape.shell"
1216
+ },
1217
+ {
1218
+ "begin": "(?<=\\W)(?=#)(?!#\\{)",
1219
+ "beginCaptures": {
1220
+ "1": {
1221
+ "name": "punctuation.whitespace.comment.leading.shell"
1222
+ }
1223
+ },
1224
+ "end": "(?!\\G)",
1225
+ "patterns": [
1226
+ {
1227
+ "begin": "#",
1228
+ "beginCaptures": {
1229
+ "0": {
1230
+ "name": "punctuation.definition.comment.shell"
1231
+ }
1232
+ },
1233
+ "end": "(?=`)",
1234
+ "name": "comment.line.number-sign.shell"
1235
+ }
1236
+ ]
1237
+ },
1238
+ {
1239
+ "include": "#initial_context"
1240
+ }
1241
+ ]
1242
+ }
1243
+ ]
1244
+ },
1245
+ "keyword": {
1246
+ "patterns": [
1247
+ {
1248
+ "match": "(?<=^|[\\&;\\s])(then|else|elif|fi|for|in|do|done|select|continue|esac|while|until|return)(?=[\\&;\\s]|$)",
1249
+ "name": "keyword.control.shell"
1250
+ },
1251
+ {
1252
+ "match": "(?<=^|[\\&;\\s])(?:export|declare|typeset|local|readonly)(?=[\\&;\\s]|$)",
1253
+ "name": "storage.modifier.shell"
1254
+ }
1255
+ ]
1256
+ },
1257
+ "line_comment": {
1258
+ "begin": "\\s*+(//)",
1259
+ "beginCaptures": {
1260
+ "1": {
1261
+ "name": "punctuation.definition.comment.shell"
1262
+ }
1263
+ },
1264
+ "end": "(?<=\\n)(?<!\\\\\\n)",
1265
+ "endCaptures": {
1266
+ },
1267
+ "name": "comment.line.double-slash.shell",
1268
+ "patterns": [
1269
+ {
1270
+ "include": "#line_continuation_character"
1271
+ }
1272
+ ]
1273
+ },
1274
+ "line_continuation": {
1275
+ "match": "\\\\(?=\\n)",
1276
+ "name": "constant.character.escape.line-continuation.shell"
1277
+ },
1278
+ "logical-expression": {
1279
+ "patterns": [
1280
+ {
1281
+ "include": "#arithmetic_no_dollar"
1282
+ },
1283
+ {
1284
+ "match": "=[=~]?|!=?|[<>]|&&|\\|\\|",
1285
+ "name": "keyword.operator.logical.shell"
1286
+ },
1287
+ {
1288
+ "match": "(?<!\\S)-(nt|ot|ef|eq|ne|l[et]|g[et]|[GLNOSa-hknopr-uwxz])\\b",
1289
+ "name": "keyword.operator.logical.shell"
1290
+ }
1291
+ ]
1292
+ },
1293
+ "logical_expression_context": {
1294
+ "patterns": [
1295
+ {
1296
+ "include": "#regex_comparison"
1297
+ },
1298
+ {
1299
+ "include": "#arithmetic_no_dollar"
1300
+ },
1301
+ {
1302
+ "include": "#logical-expression"
1303
+ },
1304
+ {
1305
+ "include": "#logical_expression_single"
1306
+ },
1307
+ {
1308
+ "include": "#logical_expression_double"
1309
+ },
1310
+ {
1311
+ "include": "#comment"
1312
+ },
1313
+ {
1314
+ "include": "#boolean"
1315
+ },
1316
+ {
1317
+ "include": "#redirect_number"
1318
+ },
1319
+ {
1320
+ "include": "#numeric_literal"
1321
+ },
1322
+ {
1323
+ "include": "#pipeline"
1324
+ },
1325
+ {
1326
+ "include": "#normal_statement_seperator"
1327
+ },
1328
+ {
1329
+ "include": "#string"
1330
+ },
1331
+ {
1332
+ "include": "#variable"
1333
+ },
1334
+ {
1335
+ "include": "#interpolation"
1336
+ },
1337
+ {
1338
+ "include": "#heredoc"
1339
+ },
1340
+ {
1341
+ "include": "#herestring"
1342
+ },
1343
+ {
1344
+ "include": "#pathname"
1345
+ },
1346
+ {
1347
+ "include": "#floating_keyword"
1348
+ },
1349
+ {
1350
+ "include": "#support"
1351
+ }
1352
+ ]
1353
+ },
1354
+ "logical_expression_double": {
1355
+ "begin": "\\[\\[",
1356
+ "beginCaptures": {
1357
+ "0": {
1358
+ "name": "punctuation.definition.logical-expression.shell"
1359
+ }
1360
+ },
1361
+ "end": "]]",
1362
+ "endCaptures": {
1363
+ "0": {
1364
+ "name": "punctuation.definition.logical-expression.shell"
1365
+ }
1366
+ },
1367
+ "name": "meta.scope.logical-expression.shell",
1368
+ "patterns": [
1369
+ {
1370
+ "include": "#logical_expression_context"
1371
+ }
1372
+ ]
1373
+ },
1374
+ "logical_expression_single": {
1375
+ "begin": "\\[",
1376
+ "beginCaptures": {
1377
+ "0": {
1378
+ "name": "punctuation.definition.logical-expression.shell"
1379
+ }
1380
+ },
1381
+ "end": "]",
1382
+ "endCaptures": {
1383
+ "0": {
1384
+ "name": "punctuation.definition.logical-expression.shell"
1385
+ }
1386
+ },
1387
+ "name": "meta.scope.logical-expression.shell",
1388
+ "patterns": [
1389
+ {
1390
+ "include": "#logical_expression_context"
1391
+ }
1392
+ ]
1393
+ },
1394
+ "loop": {
1395
+ "patterns": [
1396
+ {
1397
+ "begin": "(?<=^|[\\&;\\s])(for)\\s+(.+?)\\s+(in)(?=[\\&;\\s]|$)",
1398
+ "beginCaptures": {
1399
+ "1": {
1400
+ "name": "keyword.control.shell"
1401
+ },
1402
+ "2": {
1403
+ "name": "variable.other.loop.shell",
1404
+ "patterns": [
1405
+ {
1406
+ "include": "#string"
1407
+ }
1408
+ ]
1409
+ },
1410
+ "3": {
1411
+ "name": "keyword.control.shell"
1412
+ }
1413
+ },
1414
+ "end": "(?<=^|[\\&;\\s])done(?=[\\&;\\s]|$|\\))",
1415
+ "endCaptures": {
1416
+ "0": {
1417
+ "name": "keyword.control.shell"
1418
+ }
1419
+ },
1420
+ "name": "meta.scope.for-in-loop.shell",
1421
+ "patterns": [
1422
+ {
1423
+ "include": "#initial_context"
1424
+ }
1425
+ ]
1426
+ },
1427
+ {
1428
+ "begin": "(?<=^|[\\&;\\s])(while|until)(?=[\\&;\\s]|$)",
1429
+ "beginCaptures": {
1430
+ "1": {
1431
+ "name": "keyword.control.shell"
1432
+ }
1433
+ },
1434
+ "end": "(?<=^|[\\&;\\s])done(?=[\\&;\\s]|$|\\))",
1435
+ "endCaptures": {
1436
+ "0": {
1437
+ "name": "keyword.control.shell"
1438
+ }
1439
+ },
1440
+ "name": "meta.scope.while-loop.shell",
1441
+ "patterns": [
1442
+ {
1443
+ "include": "#initial_context"
1444
+ }
1445
+ ]
1446
+ },
1447
+ {
1448
+ "begin": "(?<=^|[\\&;\\s])(select)\\s+((?:[^\\\\\\s]|\\\\.)+)(?=[\\&;\\s]|$)",
1449
+ "beginCaptures": {
1450
+ "1": {
1451
+ "name": "keyword.control.shell"
1452
+ },
1453
+ "2": {
1454
+ "name": "variable.other.loop.shell"
1455
+ }
1456
+ },
1457
+ "end": "(?<=^|[\\&;\\s])(done)(?=[\\&;\\s]|$|\\))",
1458
+ "endCaptures": {
1459
+ "1": {
1460
+ "name": "keyword.control.shell"
1461
+ }
1462
+ },
1463
+ "name": "meta.scope.select-block.shell",
1464
+ "patterns": [
1465
+ {
1466
+ "include": "#initial_context"
1467
+ }
1468
+ ]
1469
+ },
1470
+ {
1471
+ "begin": "(?<=^|[\\&;\\s])if(?=[\\&;\\s]|$)",
1472
+ "beginCaptures": {
1473
+ "0": {
1474
+ "name": "keyword.control.if.shell"
1475
+ }
1476
+ },
1477
+ "end": "(?<=^|[\\&;\\s])fi(?=[\\&;\\s]|$)",
1478
+ "endCaptures": {
1479
+ "0": {
1480
+ "name": "keyword.control.fi.shell"
1481
+ }
1482
+ },
1483
+ "name": "meta.scope.if-block.shell",
1484
+ "patterns": [
1485
+ {
1486
+ "include": "#initial_context"
1487
+ }
1488
+ ]
1489
+ }
1490
+ ]
1491
+ },
1492
+ "math": {
1493
+ "patterns": [
1494
+ {
1495
+ "include": "#variable"
1496
+ },
1497
+ {
1498
+ "match": "\\+{1,2}|-{1,2}|[!~]|\\*{1,2}|[%/]|<[<=]?|>[=>]?|==|!=|^|\\|{1,2}|&{1,2}|[,:=?]|[-%\\&*+/^|]=|<<=|>>=",
1499
+ "name": "keyword.operator.arithmetic.shell"
1500
+ },
1501
+ {
1502
+ "match": "0[Xx]\\h+",
1503
+ "name": "constant.numeric.hex.shell"
1504
+ },
1505
+ {
1506
+ "match": ";",
1507
+ "name": "punctuation.separator.semicolon.range"
1508
+ },
1509
+ {
1510
+ "match": "0\\d+",
1511
+ "name": "constant.numeric.octal.shell"
1512
+ },
1513
+ {
1514
+ "match": "\\d{1,2}#[0-9@-Z_a-z]+",
1515
+ "name": "constant.numeric.other.shell"
1516
+ },
1517
+ {
1518
+ "match": "\\d+",
1519
+ "name": "constant.numeric.integer.shell"
1520
+ },
1521
+ {
1522
+ "match": "(?<!\\w)[0-9A-Z_a-z]+(?!\\w)",
1523
+ "name": "variable.other.normal.shell"
1524
+ }
1525
+ ]
1526
+ },
1527
+ "math_operators": {
1528
+ "patterns": [
1529
+ {
1530
+ "match": "\\+{1,2}|-{1,2}|[!~]|\\*{1,2}|[%/]|<[<=]?|>[=>]?|==|!=|^|\\|{1,2}|&{1,2}|[,:=?]|[-%\\&*+/^|]=|<<=|>>=",
1531
+ "name": "keyword.operator.arithmetic.shell"
1532
+ },
1533
+ {
1534
+ "match": "0[Xx]\\h+",
1535
+ "name": "constant.numeric.hex.shell"
1536
+ },
1537
+ {
1538
+ "match": "0\\d+",
1539
+ "name": "constant.numeric.octal.shell"
1540
+ },
1541
+ {
1542
+ "match": "\\d{1,2}#[0-9@-Z_a-z]+",
1543
+ "name": "constant.numeric.other.shell"
1544
+ },
1545
+ {
1546
+ "match": "\\d+",
1547
+ "name": "constant.numeric.integer.shell"
1548
+ }
1549
+ ]
1550
+ },
1551
+ "misc_ranges": {
1552
+ "patterns": [
1553
+ {
1554
+ "include": "#logical_expression_single"
1555
+ },
1556
+ {
1557
+ "include": "#logical_expression_double"
1558
+ },
1559
+ {
1560
+ "include": "#subshell_dollar"
1561
+ },
1562
+ {
1563
+ "begin": "(?<![^\\t ])(\\{)(?![$\\w])",
1564
+ "beginCaptures": {
1565
+ "1": {
1566
+ "name": "punctuation.definition.group.shell"
1567
+ }
1568
+ },
1569
+ "end": "}",
1570
+ "endCaptures": {
1571
+ "0": {
1572
+ "name": "punctuation.definition.group.shell"
1573
+ }
1574
+ },
1575
+ "name": "meta.scope.group.shell",
1576
+ "patterns": [
1577
+ {
1578
+ "include": "#initial_context"
1579
+ }
1580
+ ]
1581
+ }
1582
+ ]
1583
+ },
1584
+ "modified_assignment_statement": {
1585
+ "begin": "(?<=^|[\\t \\&;])(?:readonly|declare|typeset|export|local)(?=[\\t \\&;]|$)",
1586
+ "beginCaptures": {
1587
+ "0": {
1588
+ "name": "storage.modifier.$0.shell"
1589
+ }
1590
+ },
1591
+ "end": "(?=[\\n\\&);`{|}]|[\\t ]*#|])(?<!\\\\)",
1592
+ "endCaptures": {
1593
+ },
1594
+ "name": "meta.statement.shell meta.expression.assignment.modified.shell",
1595
+ "patterns": [
1596
+ {
1597
+ "match": "(?<!\\w)-\\w+\\b",
1598
+ "name": "string.unquoted.argument.shell constant.other.option.shell"
1599
+ },
1600
+ {
1601
+ "include": "#array_value"
1602
+ },
1603
+ {
1604
+ "captures": {
1605
+ "1": {
1606
+ "name": "variable.other.assignment.shell"
1607
+ },
1608
+ "10": {
1609
+ "name": "constant.numeric.shell constant.numeric.octal.shell"
1610
+ },
1611
+ "11": {
1612
+ "name": "constant.numeric.shell constant.numeric.other.shell"
1613
+ },
1614
+ "12": {
1615
+ "name": "constant.numeric.shell constant.numeric.decimal.shell"
1616
+ },
1617
+ "13": {
1618
+ "name": "constant.numeric.shell constant.numeric.version.shell"
1619
+ },
1620
+ "14": {
1621
+ "name": "constant.numeric.shell constant.numeric.integer.shell"
1622
+ },
1623
+ "2": {
1624
+ "name": "punctuation.definition.array.access.shell"
1625
+ },
1626
+ "3": {
1627
+ "name": "variable.other.assignment.shell"
1628
+ },
1629
+ "4": {
1630
+ "name": "constant.numeric.shell constant.numeric.integer.shell"
1631
+ },
1632
+ "5": {
1633
+ "name": "punctuation.definition.array.access.shell"
1634
+ },
1635
+ "6": {
1636
+ "name": "keyword.operator.assignment.shell"
1637
+ },
1638
+ "7": {
1639
+ "name": "keyword.operator.assignment.compound.shell"
1640
+ },
1641
+ "8": {
1642
+ "name": "keyword.operator.assignment.compound.shell"
1643
+ },
1644
+ "9": {
1645
+ "name": "constant.numeric.shell constant.numeric.hex.shell"
1646
+ }
1647
+ },
1648
+ "match": "((?<!\\w)[-0-9A-Z_a-z]+(?!\\w))(?:(\\[)((?:(?:\\$?(?<!\\w)[-0-9A-Z_a-z]+(?!\\w)|@)|\\*)|(-?\\d+))(]))?(?:(?:(=)|(\\+=))|(-=))?(?:(?<=[\\t =]|^|[(\\[{])(?:(?:(?:(?:(?:(0[Xx]\\h+)|(0\\d+))|(\\d{1,2}#[0-9@-Z_a-z]+))|(-?\\d+\\.\\d+))|(-?\\d+(?:\\.\\d+)+))|(-?\\d+))(?=[\\t ]|$|[);}]))?"
1649
+ },
1650
+ {
1651
+ "include": "#normal_context"
1652
+ }
1653
+ ]
1654
+ },
1655
+ "modifiers": {
1656
+ "match": "(?<=^|[\\t \\&;])(?:readonly|declare|typeset|export|local)(?=[\\t \\&;]|$)",
1657
+ "name": "storage.modifier.$0.shell"
1658
+ },
1659
+ "normal_assignment_statement": {
1660
+ "begin": "[\\t ]*+((?<!\\w)[-0-9A-Z_a-z]+(?!\\w))(?:(\\[)((?:(?:\\$?(?<!\\w)[-0-9A-Z_a-z]+(?!\\w)|@)|\\*)|(-?\\d+))(]))?(?:(?:(=)|(\\+=))|(-=))",
1661
+ "beginCaptures": {
1662
+ "1": {
1663
+ "name": "variable.other.assignment.shell"
1664
+ },
1665
+ "2": {
1666
+ "name": "punctuation.definition.array.access.shell"
1667
+ },
1668
+ "3": {
1669
+ "name": "variable.other.assignment.shell"
1670
+ },
1671
+ "4": {
1672
+ "name": "constant.numeric.shell constant.numeric.integer.shell"
1673
+ },
1674
+ "5": {
1675
+ "name": "punctuation.definition.array.access.shell"
1676
+ },
1677
+ "6": {
1678
+ "name": "keyword.operator.assignment.shell"
1679
+ },
1680
+ "7": {
1681
+ "name": "keyword.operator.assignment.compound.shell"
1682
+ },
1683
+ "8": {
1684
+ "name": "keyword.operator.assignment.compound.shell"
1685
+ }
1686
+ },
1687
+ "end": "(?=[\\n\\&);`{|}]|[\\t ]*#|])(?<!\\\\)",
1688
+ "endCaptures": {
1689
+ },
1690
+ "name": "meta.expression.assignment.shell",
1691
+ "patterns": [
1692
+ {
1693
+ "include": "#comment"
1694
+ },
1695
+ {
1696
+ "include": "#string"
1697
+ },
1698
+ {
1699
+ "include": "#normal_assignment_statement"
1700
+ },
1701
+ {
1702
+ "begin": "(?<=[\\t ])(?![\\t ]|\\w+=)",
1703
+ "beginCaptures": {
1704
+ },
1705
+ "end": "(?=[\\n\\&);`{|}]|[\\t ]*#|])(?<!\\\\)",
1706
+ "endCaptures": {
1707
+ },
1708
+ "name": "meta.statement.command.env.shell",
1709
+ "patterns": [
1710
+ {
1711
+ "include": "#command_name_range"
1712
+ },
1713
+ {
1714
+ "include": "#line_continuation"
1715
+ },
1716
+ {
1717
+ "include": "#option"
1718
+ },
1719
+ {
1720
+ "include": "#argument"
1721
+ },
1722
+ {
1723
+ "include": "#string"
1724
+ }
1725
+ ]
1726
+ },
1727
+ {
1728
+ "include": "#simple_unquoted"
1729
+ },
1730
+ {
1731
+ "include": "#normal_context"
1732
+ }
1733
+ ]
1734
+ },
1735
+ "normal_context": {
1736
+ "patterns": [
1737
+ {
1738
+ "include": "#comment"
1739
+ },
1740
+ {
1741
+ "include": "#pipeline"
1742
+ },
1743
+ {
1744
+ "include": "#normal_statement_seperator"
1745
+ },
1746
+ {
1747
+ "include": "#misc_ranges"
1748
+ },
1749
+ {
1750
+ "include": "#boolean"
1751
+ },
1752
+ {
1753
+ "include": "#redirect_number"
1754
+ },
1755
+ {
1756
+ "include": "#numeric_literal"
1757
+ },
1758
+ {
1759
+ "include": "#string"
1760
+ },
1761
+ {
1762
+ "include": "#variable"
1763
+ },
1764
+ {
1765
+ "include": "#interpolation"
1766
+ },
1767
+ {
1768
+ "include": "#heredoc"
1769
+ },
1770
+ {
1771
+ "include": "#herestring"
1772
+ },
1773
+ {
1774
+ "include": "#redirection"
1775
+ },
1776
+ {
1777
+ "include": "#pathname"
1778
+ },
1779
+ {
1780
+ "include": "#floating_keyword"
1781
+ },
1782
+ {
1783
+ "include": "#support"
1784
+ },
1785
+ {
1786
+ "include": "#parenthese"
1787
+ }
1788
+ ]
1789
+ },
1790
+ "normal_statement": {
1791
+ "begin": "(?!^[\\t ]*+$)(?:(?<=(?:^until| until|\\tuntil|^while| while|\\twhile|^elif| elif|\\telif|^else| else|\\telse|^then| then|\\tthen|^do| do|\\tdo|^if| if|\\tif) )|(?<=^|[!\\&(;`{|]))[\\t ]*+(?!nocorrect\\W|nocorrect\\$|function\\W|function\\$|foreach\\W|foreach\\$|repeat\\W|repeat\\$|logout\\W|logout\\$|coproc\\W|coproc\\$|select\\W|select\\$|while\\W|while\\$|pushd\\W|pushd\\$|until\\W|until\\$|case\\W|case\\$|done\\W|done\\$|elif\\W|elif\\$|else\\W|else\\$|esac\\W|esac\\$|popd\\W|popd\\$|then\\W|then\\$|time\\W|time\\$|for\\W|for\\$|end\\W|end\\$|fi\\W|fi\\$|do\\W|do\\$|in\\W|in\\$|if\\W|if\\$)",
1792
+ "beginCaptures": {
1793
+ },
1794
+ "end": "(?=[\\n\\&);`{|}]|[\\t ]*#|])(?<!\\\\)",
1795
+ "endCaptures": {
1796
+ },
1797
+ "name": "meta.statement.shell",
1798
+ "patterns": [
1799
+ {
1800
+ "include": "#typical_statements"
1801
+ }
1802
+ ]
1803
+ },
1804
+ "normal_statement_seperator": {
1805
+ "captures": {
1806
+ "1": {
1807
+ "name": "punctuation.terminator.statement.semicolon.shell"
1808
+ },
1809
+ "2": {
1810
+ "name": "punctuation.separator.statement.and.shell"
1811
+ },
1812
+ "3": {
1813
+ "name": "punctuation.separator.statement.or.shell"
1814
+ },
1815
+ "4": {
1816
+ "name": "punctuation.separator.statement.background.shell"
1817
+ }
1818
+ },
1819
+ "match": "(?:(?:(;)|(&&))|(\\|\\|))|(&)"
1820
+ },
1821
+ "numeric_literal": {
1822
+ "captures": {
1823
+ "1": {
1824
+ "name": "constant.numeric.shell constant.numeric.hex.shell"
1825
+ },
1826
+ "2": {
1827
+ "name": "constant.numeric.shell constant.numeric.octal.shell"
1828
+ },
1829
+ "3": {
1830
+ "name": "constant.numeric.shell constant.numeric.other.shell"
1831
+ },
1832
+ "4": {
1833
+ "name": "constant.numeric.shell constant.numeric.decimal.shell"
1834
+ },
1835
+ "5": {
1836
+ "name": "constant.numeric.shell constant.numeric.version.shell"
1837
+ },
1838
+ "6": {
1839
+ "name": "constant.numeric.shell constant.numeric.integer.shell"
1840
+ }
1841
+ },
1842
+ "match": "(?<=[\\t =]|^|[(\\[{])(?:(?:(?:(?:(?:(0[Xx]\\h+)|(0\\d+))|(\\d{1,2}#[0-9@-Z_a-z]+))|(-?\\d+\\.\\d+))|(-?\\d+(?:\\.\\d+)+))|(-?\\d+))(?=[\\t ]|$|[);}])"
1843
+ },
1844
+ "option": {
1845
+ "begin": "[\\t ]++(-)((?![\\n!#\\&()<>\\[{|]|$|[\\t ;]))",
1846
+ "beginCaptures": {
1847
+ "1": {
1848
+ "name": "string.unquoted.argument.shell constant.other.option.dash.shell"
1849
+ },
1850
+ "2": {
1851
+ "name": "string.unquoted.argument.shell constant.other.option.shell"
1852
+ }
1853
+ },
1854
+ "contentName": "string.unquoted.argument constant.other.option",
1855
+ "end": "(?=[\\t ])|(?=[\\n\\&);`{|}]|[\\t ]*#|])(?<!\\\\)",
1856
+ "endCaptures": {
1857
+ },
1858
+ "patterns": [
1859
+ {
1860
+ "include": "#option_context"
1861
+ }
1862
+ ]
1863
+ },
1864
+ "option_context": {
1865
+ "patterns": [
1866
+ {
1867
+ "include": "#misc_ranges"
1868
+ },
1869
+ {
1870
+ "include": "#string"
1871
+ },
1872
+ {
1873
+ "include": "#variable"
1874
+ },
1875
+ {
1876
+ "include": "#interpolation"
1877
+ },
1878
+ {
1879
+ "include": "#heredoc"
1880
+ },
1881
+ {
1882
+ "include": "#herestring"
1883
+ },
1884
+ {
1885
+ "include": "#redirection"
1886
+ },
1887
+ {
1888
+ "include": "#pathname"
1889
+ },
1890
+ {
1891
+ "include": "#floating_keyword"
1892
+ },
1893
+ {
1894
+ "include": "#support"
1895
+ }
1896
+ ]
1897
+ },
1898
+ "parenthese": {
1899
+ "patterns": [
1900
+ {
1901
+ "begin": "\\(",
1902
+ "beginCaptures": {
1903
+ "0": {
1904
+ "name": "punctuation.section.parenthese.shell"
1905
+ }
1906
+ },
1907
+ "end": "\\)",
1908
+ "endCaptures": {
1909
+ "0": {
1910
+ "name": "punctuation.section.parenthese.shell"
1911
+ }
1912
+ },
1913
+ "name": "meta.parenthese.group.shell",
1914
+ "patterns": [
1915
+ {
1916
+ "include": "#initial_context"
1917
+ }
1918
+ ]
1919
+ }
1920
+ ]
1921
+ },
1922
+ "pathname": {
1923
+ "patterns": [
1924
+ {
1925
+ "match": "(?<=[:=\\s]|^)~",
1926
+ "name": "keyword.operator.tilde.shell"
1927
+ },
1928
+ {
1929
+ "match": "[*?]",
1930
+ "name": "keyword.operator.glob.shell"
1931
+ },
1932
+ {
1933
+ "begin": "([!*+?@])(\\()",
1934
+ "beginCaptures": {
1935
+ "1": {
1936
+ "name": "keyword.operator.extglob.shell"
1937
+ },
1938
+ "2": {
1939
+ "name": "punctuation.definition.extglob.shell"
1940
+ }
1941
+ },
1942
+ "end": "\\)",
1943
+ "endCaptures": {
1944
+ "0": {
1945
+ "name": "punctuation.definition.extglob.shell"
1946
+ }
1947
+ },
1948
+ "name": "meta.structure.extglob.shell",
1949
+ "patterns": [
1950
+ {
1951
+ "include": "#initial_context"
1952
+ }
1953
+ ]
1954
+ }
1955
+ ]
1956
+ },
1957
+ "pipeline": {
1958
+ "patterns": [
1959
+ {
1960
+ "match": "(?<=^|[\\&;\\s])(time)(?=[\\&;\\s]|$)",
1961
+ "name": "keyword.other.shell"
1962
+ },
1963
+ {
1964
+ "match": "[!|]",
1965
+ "name": "keyword.operator.pipe.shell"
1966
+ }
1967
+ ]
1968
+ },
1969
+ "redirect_fix": {
1970
+ "captures": {
1971
+ "1": {
1972
+ "name": "keyword.operator.redirect.shell"
1973
+ },
1974
+ "2": {
1975
+ "name": "string.unquoted.argument.shell"
1976
+ }
1977
+ },
1978
+ "match": "(>>?)[\\t ]*+([^\\t\\n \"$\\&-);<>\\\\`|]+)"
1979
+ },
1980
+ "redirect_number": {
1981
+ "captures": {
1982
+ "1": {
1983
+ "name": "keyword.operator.redirect.stdout.shell"
1984
+ },
1985
+ "2": {
1986
+ "name": "keyword.operator.redirect.stderr.shell"
1987
+ },
1988
+ "3": {
1989
+ "name": "keyword.operator.redirect.$3.shell"
1990
+ }
1991
+ },
1992
+ "match": "(?<=[\\t ])(?:(1)|(2)|(\\d+))(?=>)"
1993
+ },
1994
+ "redirection": {
1995
+ "patterns": [
1996
+ {
1997
+ "begin": "[<>]\\(",
1998
+ "beginCaptures": {
1999
+ "0": {
2000
+ "name": "punctuation.definition.string.begin.shell"
2001
+ }
2002
+ },
2003
+ "end": "\\)",
2004
+ "endCaptures": {
2005
+ "0": {
2006
+ "name": "punctuation.definition.string.end.shell"
2007
+ }
2008
+ },
2009
+ "name": "string.interpolated.process-substitution.shell",
2010
+ "patterns": [
2011
+ {
2012
+ "include": "#initial_context"
2013
+ }
2014
+ ]
2015
+ },
2016
+ {
2017
+ "match": "(?<![<>])(&>|\\d*>&\\d*|\\d*(>>|[<>])|\\d*<&|\\d*<>)(?![<>])",
2018
+ "name": "keyword.operator.redirect.shell"
2019
+ }
2020
+ ]
2021
+ },
2022
+ "regex_comparison": {
2023
+ "match": "=~",
2024
+ "name": "keyword.operator.logical.regex.shell"
2025
+ },
2026
+ "regexp": {
2027
+ "patterns": [
2028
+ {
2029
+ "match": ".+"
2030
+ }
2031
+ ]
2032
+ },
2033
+ "simple_options": {
2034
+ "captures": {
2035
+ "0": {
2036
+ "patterns": [
2037
+ {
2038
+ "captures": {
2039
+ "1": {
2040
+ "name": "string.unquoted.argument.shell constant.other.option.dash.shell"
2041
+ },
2042
+ "2": {
2043
+ "name": "string.unquoted.argument.shell constant.other.option.shell"
2044
+ }
2045
+ },
2046
+ "match": "[\\t ]++(-)(\\w+)"
2047
+ }
2048
+ ]
2049
+ }
2050
+ },
2051
+ "match": "(?:[\\t ]++-\\w+)*"
2052
+ },
2053
+ "simple_unquoted": {
2054
+ "match": "[^\\t\\n \"$\\&-);<>\\\\`|]",
2055
+ "name": "string.unquoted.shell"
2056
+ },
2057
+ "special_expansion": {
2058
+ "match": "!|:[-=?]?|[*@]|##?|%%|[%/]",
2059
+ "name": "keyword.operator.expansion.shell"
2060
+ },
2061
+ "start_of_command": {
2062
+ "match": "[\\t ]*+(?![\\n!#\\&()<>\\[{|]|$|[\\t ;])(?!nocorrect |nocorrect\\t|nocorrect$|readonly |readonly\\t|readonly$|function |function\\t|function$|foreach |foreach\\t|foreach$|coproc |coproc\\t|coproc$|logout |logout\\t|logout$|export |export\\t|export$|select |select\\t|select$|repeat |repeat\\t|repeat$|pushd |pushd\\t|pushd$|until |until\\t|until$|while |while\\t|while$|local |local\\t|local$|case |case\\t|case$|done |done\\t|done$|elif |elif\\t|elif$|else |else\\t|else$|esac |esac\\t|esac$|popd |popd\\t|popd$|then |then\\t|then$|time |time\\t|time$|for |for\\t|for$|end |end\\t|end$|fi |fi\\t|fi$|do |do\\t|do$|in |in\\t|in$|if |if\\t|if$)(?!\\\\\\n?$)"
2063
+ },
2064
+ "string": {
2065
+ "patterns": [
2066
+ {
2067
+ "match": "\\\\.",
2068
+ "name": "constant.character.escape.shell"
2069
+ },
2070
+ {
2071
+ "begin": "'",
2072
+ "beginCaptures": {
2073
+ "0": {
2074
+ "name": "punctuation.definition.string.begin.shell"
2075
+ }
2076
+ },
2077
+ "end": "'",
2078
+ "endCaptures": {
2079
+ "0": {
2080
+ "name": "punctuation.definition.string.end.shell"
2081
+ }
2082
+ },
2083
+ "name": "string.quoted.single.shell"
2084
+ },
2085
+ {
2086
+ "begin": "\\$?\"",
2087
+ "beginCaptures": {
2088
+ "0": {
2089
+ "name": "punctuation.definition.string.begin.shell"
2090
+ }
2091
+ },
2092
+ "end": "\"",
2093
+ "endCaptures": {
2094
+ "0": {
2095
+ "name": "punctuation.definition.string.end.shell"
2096
+ }
2097
+ },
2098
+ "name": "string.quoted.double.shell",
2099
+ "patterns": [
2100
+ {
2101
+ "match": "\\\\[\\n\"$\\\\`]",
2102
+ "name": "constant.character.escape.shell"
2103
+ },
2104
+ {
2105
+ "include": "#variable"
2106
+ },
2107
+ {
2108
+ "include": "#interpolation"
2109
+ }
2110
+ ]
2111
+ },
2112
+ {
2113
+ "begin": "\\$'",
2114
+ "beginCaptures": {
2115
+ "0": {
2116
+ "name": "punctuation.definition.string.begin.shell"
2117
+ }
2118
+ },
2119
+ "end": "'",
2120
+ "endCaptures": {
2121
+ "0": {
2122
+ "name": "punctuation.definition.string.end.shell"
2123
+ }
2124
+ },
2125
+ "name": "string.quoted.single.dollar.shell",
2126
+ "patterns": [
2127
+ {
2128
+ "match": "\\\\['\\\\abefnrtv]",
2129
+ "name": "constant.character.escape.ansi-c.shell"
2130
+ },
2131
+ {
2132
+ "match": "\\\\[0-9]{3}\"",
2133
+ "name": "constant.character.escape.octal.shell"
2134
+ },
2135
+ {
2136
+ "match": "\\\\x\\h{2}\"",
2137
+ "name": "constant.character.escape.hex.shell"
2138
+ },
2139
+ {
2140
+ "match": "\\\\c.\"",
2141
+ "name": "constant.character.escape.control-char.shell"
2142
+ }
2143
+ ]
2144
+ }
2145
+ ]
2146
+ },
2147
+ "subshell_dollar": {
2148
+ "patterns": [
2149
+ {
2150
+ "begin": "\\$\\(",
2151
+ "beginCaptures": {
2152
+ "0": {
2153
+ "name": "punctuation.definition.subshell.single.shell"
2154
+ }
2155
+ },
2156
+ "end": "\\)",
2157
+ "endCaptures": {
2158
+ "0": {
2159
+ "name": "punctuation.definition.subshell.single.shell"
2160
+ }
2161
+ },
2162
+ "name": "meta.scope.subshell",
2163
+ "patterns": [
2164
+ {
2165
+ "include": "#parenthese"
2166
+ },
2167
+ {
2168
+ "include": "#initial_context"
2169
+ }
2170
+ ]
2171
+ }
2172
+ ]
2173
+ },
2174
+ "support": {
2175
+ "patterns": [
2176
+ {
2177
+ "match": "(?<=^|[\\&;\\s])[.:](?=[\\&;\\s]|$)",
2178
+ "name": "support.function.builtin.shell"
2179
+ }
2180
+ ]
2181
+ },
2182
+ "typical_statements": {
2183
+ "patterns": [
2184
+ {
2185
+ "include": "#assignment_statement"
2186
+ },
2187
+ {
2188
+ "include": "#case_statement"
2189
+ },
2190
+ {
2191
+ "include": "#for_statement"
2192
+ },
2193
+ {
2194
+ "include": "#while_statement"
2195
+ },
2196
+ {
2197
+ "include": "#function_definition"
2198
+ },
2199
+ {
2200
+ "include": "#command_statement"
2201
+ },
2202
+ {
2203
+ "include": "#line_continuation"
2204
+ },
2205
+ {
2206
+ "include": "#arithmetic_double"
2207
+ },
2208
+ {
2209
+ "include": "#normal_context"
2210
+ }
2211
+ ]
2212
+ },
2213
+ "variable": {
2214
+ "patterns": [
2215
+ {
2216
+ "captures": {
2217
+ "1": {
2218
+ "name": "punctuation.definition.variable.shell variable.parameter.positional.all.shell"
2219
+ },
2220
+ "2": {
2221
+ "name": "variable.parameter.positional.all.shell"
2222
+ }
2223
+ },
2224
+ "match": "(\\$)(@(?!\\w))"
2225
+ },
2226
+ {
2227
+ "captures": {
2228
+ "1": {
2229
+ "name": "punctuation.definition.variable.shell variable.parameter.positional.shell"
2230
+ },
2231
+ "2": {
2232
+ "name": "variable.parameter.positional.shell"
2233
+ }
2234
+ },
2235
+ "match": "(\\$)([0-9](?!\\w))"
2236
+ },
2237
+ {
2238
+ "captures": {
2239
+ "1": {
2240
+ "name": "punctuation.definition.variable.shell variable.language.special.shell"
2241
+ },
2242
+ "2": {
2243
+ "name": "variable.language.special.shell"
2244
+ }
2245
+ },
2246
+ "match": "(\\$)([-!#$*0?_](?!\\w))"
2247
+ },
2248
+ {
2249
+ "begin": "(\\$)(\\{)[\\t ]*+(?=\\d)",
2250
+ "beginCaptures": {
2251
+ "1": {
2252
+ "name": "punctuation.definition.variable.shell variable.parameter.positional.shell"
2253
+ },
2254
+ "2": {
2255
+ "name": "punctuation.section.bracket.curly.variable.begin.shell punctuation.definition.variable.shell variable.parameter.positional.shell"
2256
+ }
2257
+ },
2258
+ "contentName": "meta.parameter-expansion",
2259
+ "end": "}",
2260
+ "endCaptures": {
2261
+ "0": {
2262
+ "name": "punctuation.section.bracket.curly.variable.end.shell punctuation.definition.variable.shell variable.parameter.positional.shell"
2263
+ }
2264
+ },
2265
+ "patterns": [
2266
+ {
2267
+ "include": "#special_expansion"
2268
+ },
2269
+ {
2270
+ "include": "#array_access_inline"
2271
+ },
2272
+ {
2273
+ "match": "[0-9]+",
2274
+ "name": "variable.parameter.positional.shell"
2275
+ },
2276
+ {
2277
+ "match": "(?<!\\w)[-0-9A-Z_a-z]+(?!\\w)",
2278
+ "name": "variable.other.normal.shell"
2279
+ },
2280
+ {
2281
+ "include": "#variable"
2282
+ },
2283
+ {
2284
+ "include": "#string"
2285
+ }
2286
+ ]
2287
+ },
2288
+ {
2289
+ "begin": "(\\$)(\\{)",
2290
+ "beginCaptures": {
2291
+ "1": {
2292
+ "name": "punctuation.definition.variable.shell"
2293
+ },
2294
+ "2": {
2295
+ "name": "punctuation.section.bracket.curly.variable.begin.shell punctuation.definition.variable.shell"
2296
+ }
2297
+ },
2298
+ "contentName": "meta.parameter-expansion",
2299
+ "end": "}",
2300
+ "endCaptures": {
2301
+ "0": {
2302
+ "name": "punctuation.section.bracket.curly.variable.end.shell punctuation.definition.variable.shell"
2303
+ }
2304
+ },
2305
+ "patterns": [
2306
+ {
2307
+ "include": "#special_expansion"
2308
+ },
2309
+ {
2310
+ "include": "#array_access_inline"
2311
+ },
2312
+ {
2313
+ "match": "(?<!\\w)[-0-9A-Z_a-z]+(?!\\w)",
2314
+ "name": "variable.other.normal.shell"
2315
+ },
2316
+ {
2317
+ "include": "#variable"
2318
+ },
2319
+ {
2320
+ "include": "#string"
2321
+ }
2322
+ ]
2323
+ },
2324
+ {
2325
+ "captures": {
2326
+ "1": {
2327
+ "name": "punctuation.definition.variable.shell variable.other.normal.shell"
2328
+ },
2329
+ "2": {
2330
+ "name": "variable.other.normal.shell"
2331
+ }
2332
+ },
2333
+ "match": "(\\$)(\\w+(?!\\w))"
2334
+ }
2335
+ ]
2336
+ },
2337
+ "while_statement": {
2338
+ "patterns": [
2339
+ {
2340
+ "begin": "\\b(while)\\b",
2341
+ "beginCaptures": {
2342
+ "1": {
2343
+ "name": "keyword.control.while.shell"
2344
+ }
2345
+ },
2346
+ "end": "(?=[\\n\\&);`{|}]|[\\t ]*#|])(?<!\\\\)",
2347
+ "endCaptures": {
2348
+ },
2349
+ "name": "meta.while.shell",
2350
+ "patterns": [
2351
+ {
2352
+ "include": "#line_continuation"
2353
+ },
2354
+ {
2355
+ "include": "#math_operators"
2356
+ },
2357
+ {
2358
+ "include": "#option"
2359
+ },
2360
+ {
2361
+ "include": "#simple_unquoted"
2362
+ },
2363
+ {
2364
+ "include": "#normal_context"
2365
+ },
2366
+ {
2367
+ "include": "#string"
2368
+ }
2369
+ ]
2370
+ }
2371
+ ]
2372
+ }
2373
+ },
2374
+ "scopeName": "source.shell"
2375
+ }