aboutsummaryrefslogtreecommitdiff
path: root/runtime/syntax/just.vim
blob: 79c81d0f9cf51b2618da5f9bbb81dbff30636414 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
" Vim syntax file
" Language:	Justfile
" Maintainer:	Peter Benjamin <@pbnj>
" Last Change:	2025 Jan 25
" Credits:	The original author, Noah Bogart <https://github.com/NoahTheDuke/vim-just/>

if exists('b:current_syntax')
  finish
endif

let s:cpo_save = &cpo
set cpo&vim

let b:current_syntax = 'just'

" syncing fromstart prevents mismatched highlighting when jumping around in a justfile
" linebreaks= keeps multi-line constructs highlighted correctly while typing
syn sync fromstart linebreaks=10

" a-zA-Z0-9_-
syn iskeyword @,48-57,_,-

syn match justComment "#.*$" contains=@Spell,justCommentTodo
syn match justCommentInBody '#.*$' contained contains=justCommentTodo,justInterpolation,@justOtherCurlyBraces
syn keyword justCommentTodo TODO FIXME XXX contained
syn match justShebang "^\s*#!.*$" contains=justInterpolation,@justOtherCurlyBraces
syn match justName "\h\k*" contained
syn match justFunction "\h\k*" contained

syn match justPreBodyComment "\v%(\s|\\\n)*%([^\\]\n)@3<!#%([^!].*)?\n%(\t+| +)@=" transparent contained contains=justComment
   \ nextgroup=@justBodies skipnl

syn region justBacktick start=/`/ end=/`/
syn region justBacktick start=/```/ end=/```/
syn region justRawString start=/'/ end=/'/
syn region justRawString start=/'''/ end=/'''/
syn region justString start=/"/ skip=/\\\\\|\\"/ end=/"/ contains=justStringEscapeSequence,justStringUEscapeSequence,justStringEscapeError
syn region justString start=/"""/ skip=/\\\\\|\\"/ end=/"""/ contains=justStringEscapeSequence,justStringUEscapeSequence,justStringEscapeError

syn region justShellExpandRawString start=/\v\k@1<!x'/ end=/'/
   \ contains=justShellExpandVarRaw,justDollarEscape
syn region justShellExpandRawString start=/\v\k@1<!x'''/ end=/'''/
   \ contains=justShellExpandVarRaw,justDollarEscape
syn region justShellExpandString
   \ start=/\v\k@1<!x"/ skip=/\\\\\|\\"/ end=/"/
   \ contains=justStringEscapeSequence,justStringUEscapeSequence,justStringEscapeError,justShellExpandVar,justDollarEscape,justDollarEscapeSplit
syn region justShellExpandString
   \ start=/\v\k@1<!x"""/ skip=/\\\\\|\\"/ end=/"""/
   \ contains=justStringEscapeSequence,justStringUEscapeSequence,justStringEscapeError,justShellExpandVar,justDollarEscape,justDollarEscapeSplit

syn cluster justStringLiterals
   \ contains=justRawString,justString,justShellExpandRawString,justShellExpandString
syn cluster justAllStrings contains=justBacktick,@justStringLiterals

syn match justRegexReplacement
   \ /\v,%(\_s|\\\n)*%('\_[^']*'|'''%(\_.%(''')@!)*\_.?''')%(\_s|\\\n)*%(,%(\_s|\\\n)*)?\)/me=e-1
   \ transparent contained contains=@justExpr,@justStringsWithRegexCapture
syn match justRegexReplacement
   \ /\v,%(\_s|\\\n)*%("%(\_[^"]|\\")*"|"""%(\_.%(""")@!)*\_.?""")%(\_s|\\\n)*%(,%(\_s|\\\n)*)?\)/me=e-1
   \ transparent contained contains=@justExpr,@justStringsWithRegexCapture

syn region justRawStrRegexRepl start=/\v'/ end=/'/ contained contains=justRegexCapture,justDollarEscape
syn region justRawStrRegexRepl start=/\v'''/ end=/'''/ contained contains=justRegexCapture,justDollarEscape
syn region justStringRegexRepl start=/\v"/ skip=/\\\\\|\\"/ end=/"/ contained contains=justStringEscapeSequence,justStringUEscapeSequence,justStringEscapeError,justRegexCapture,justDollarEscape,justDollarEscapeSplit
syn region justStringRegexRepl start=/\v"""/ skip=/\\\\\|\\"/ end=/"""/ contained contains=justStringEscapeSequence,justStringUEscapeSequence,justStringEscapeError,justRegexCapture,justDollarEscape,justDollarEscapeSplit
syn match justRegexCapture '\v\$%(\w+|\{\w+\})' contained
syn cluster justStringsWithRegexCapture contains=justRawStrRegexRepl,justStringRegexRepl

syn cluster justRawStrings contains=justRawString,justRawStrRegexRepl

syn region justStringInsideBody start=/\v\\@1<!'/ end=/'/ contained contains=justInterpolation,@justOtherCurlyBraces,justIndentError
syn region justStringInsideBody start=/\v\\@1<!"/ skip=/\v\\@1<!\\"/ end=/"/ contained contains=justInterpolation,@justOtherCurlyBraces,justIndentError
syn region justStringInShebangBody start=/\v\\@1<!'/ end=/'/ contained contains=justInterpolation,@justOtherCurlyBraces,justShebangIndentError
syn region justStringInShebangBody start=/\v\\@1<!"/ skip=/\v\\@1<!\\"/ end=/"/ contained contains=justInterpolation,@justOtherCurlyBraces,justShebangIndentError

syn match justStringEscapeError '\\.' contained
syn match justStringEscapeSequence '\v\\[tnr"\\]' contained
syn match justStringUEscapeSequence '\v\\u\{[0-9A-Fa-f]{1,6}\}' contained

syn match justAssignmentOperator "\V:=" contained

syn region justExprParen start='\V(' end='\V)' transparent contains=@justExpr
syn region justExprParenInInterp start='\V(' end='\V)' transparent contained contains=@justExprInInterp

syn match justRecipeAt "^@" contained
syn match justRecipeColon ":" contained

syn region justRecipeAttributes
   \ matchgroup=justRecipeAttr start='\v^%(\\\n)@3<!\[' end='\V]'
   \ contains=justRecipeAttr,justRecipeAttrSep,justRecipeAttrArgs,justRecipeAttrArgError,justRecipeAttrValueShort

syn keyword justRecipeAttr
   \ confirm doc extension group linux macos no-cd no-exit-message no-quiet openbsd positional-arguments private script unix windows working-directory
   \ contained
syn match justRecipeAttrSep ',' contained
syn match justRecipeAttrValueShort '\v:%(\_s|\\\n)*' transparent contained
   \ contains=justRecipeAttrValueColon nextgroup=@justStringLiterals,justInvalidAttrValue
syn match justRecipeAttrValueColon '\V:' contained
syn region justRecipeAttrArgs matchgroup=justRecipeAttr start='\V(' end='\V)' contained
   \ contains=@justStringLiterals
syn match justRecipeAttrArgError '\v\(%(\s|\\?\n)*\)' contained

syn match justInvalidAttrValue '\v[^"',]["']@![^,\]]*' contained

syn match justRecipeDeclSimple "\v^\@?\h\k*%(%(\s|\\\n)*:\=@!)@="
   \ transparent contains=justRecipeName
   \ nextgroup=justRecipeNoDeps,justRecipeDeps

syn region justRecipeDeclComplex start="\v^\@?\h\k*%(\s|\\\n)+%([+*$]+%(\s|\\\n)*)*\h" end="\v%(:\=@!)@=|$"
   \ transparent
   \ contains=justRecipeName,justParameter
   \ nextgroup=justRecipeNoDeps,justRecipeDeps

syn match justRecipeName "\v^\@?\h\k*" transparent contained contains=justRecipeAt,justFunction

syn match justParameter "\v%(\s|\\\n)@3<=%(%([*+]%(\s|\\\n)*)?%(\$%(\s|\\\n)*)?|\$%(\s|\\\n)*[*+]%(\s|\\\n)*)\h\k*"
   \ transparent contained
   \ contains=justName,justVariadicPrefix,justParamExport,justVariadicPrefixError
   \ nextgroup=justPreParamValue

syn match justPreParamValue '\v%(\s|\\\n)*\=%(\s|\\\n)*'
   \ contained transparent
   \ contains=justParameterOperator
   \ nextgroup=justParamValue

syn region justParamValue contained transparent
   \ start="\v\S"
   \ skip="\\\n"
   \ end="\v%(\s|^)%([*+$:]|\h)@=|:@=|$"
   \ contains=@justAllStrings,justRecipeParenDefault,@justExprFunc
   \ nextgroup=justParameterError
syn match justParameterOperator "\V=" contained

syn match justVariadicPrefix "\v%(\s|\\\n)@3<=[*+]%(%(\s|\\\n)*\$?%(\s|\\\n)*\h)@=" contained
syn match justParamExport '\V$' contained
syn match justVariadicPrefixError "\v\$%(\s|\\\n)*[*+]" contained

syn match justParameterError "\v%(%([+*$]+%(\s|\\\n)*)*\h\k*)@>%(%(\s|\\\n)*\=)@!" contained

syn region justRecipeParenDefault
   \ matchgroup=justRecipeDepParamsParen start='\v%(\=%(\s|\\\n)*)@<=\(' end='\V)'
   \ contained
   \ contains=@justExpr
syn match justRecipeSubsequentDeps '\V&&' contained

syn match justRecipeNoDeps '\v:%(\s|\\\n)*\n|:#@=|:%(\s|\\\n)+#@='
   \ transparent contained
   \ contains=justRecipeColon
   \ nextgroup=justPreBodyComment,@justBodies
syn region justRecipeDeps start="\v:%(\s|\\\n)*%([a-zA-Z_(]|\&\&)" skip='\\\n' end="\v#@=|\\@1<!\n"
   \ transparent contained
   \ contains=justFunction,justRecipeColon,justRecipeSubsequentDeps,justRecipeParamDep
   \ nextgroup=justPreBodyComment,@justBodies

syn region justRecipeParamDep contained transparent
   \ matchgroup=justRecipeDepParamsParen
   \ start="\V("
   \ end="\V)"
   \ contains=justRecipeDepParenName,@justExpr

syn keyword justBoolean true false contained

syn match justAssignment "\v^\h\k*%(\s|\\\n)*:\=" transparent contains=justAssignmentOperator

syn match justSet '\v^set' contained
syn keyword justSetKeywords
   \ allow-duplicate-recipes allow-duplicate-variables dotenv-load dotenv-filename dotenv-path dotenv-required export fallback ignore-comments positional-arguments quiet script-interpreter shell tempdir unstable windows-shell working-directory
   \ contained
syn keyword justSetDeprecatedKeywords windows-powershell contained
syn match justBooleanSet "\v^set%(\s|\\\n)+%(allow-duplicate-%(recip|variabl)es|dotenv-%(loa|require)d|export|fallback|ignore-comments|positional-arguments|quiet|unstable|windows-powershell)%(%(\s|\\\n)*:\=%(\s|\\\n)*%(true|false))?%(\s|\\\n)*%($|#@=)"
   \ contains=justSet,justSetKeywords,justSetDeprecatedKeywords,justAssignmentOperator,justBoolean
   \ transparent

syn match justStringSet '\v^set%(\s|\\\n)+\k+%(\s|\\\n)*:\=%(\s|\\\n)*%(x?['"])@=' transparent contains=justSet,justSetKeywords,justAssignmentOperator

syn match justShellSet
   \ "\v^set%(\s|\\\n)+%(s%(hell|cript-interpreter)|windows-shell)%(\s|\\\n)*:\=%(\s|\\\n)*\[@="
   \ contains=justSet,justSetKeywords,justAssignmentOperator
   \ transparent skipwhite
   \ nextgroup=justShellSetValue
syn region justShellSetValue
   \ start='\V[' end='\V]'
   \ contained
   \ contains=@justStringLiterals,justShellSetError

syn match justShellSetError '\v\k+['"]@!' contained

syn match justAlias '\v^alias' contained
syn match justAliasDecl "\v^alias%(\s|\\\n)+\h\k*%(\s|\\\n)*:\=%(\s|\\\n)*"
   \ transparent
   \ contains=justAlias,justFunction,justAssignmentOperator
   \ nextgroup=justAliasRes
syn match justAliasRes '\v\h\k*%(\s|\\\n)*%(#@=|$)' contained transparent contains=justFunction

syn match justExportedAssignment "\v^export%(\s|\\\n)+\h\k*%(\s|\\\n)*:\=" transparent
   \ contains=justExport,justAssignmentOperator

syn match justExport '\v^export' contained

syn match justUnexportStatement '\v^unexport%(\s|\\\n)+\w+\s*$' contains=justUnexport
syn match justUnexport '\v^unexport' contained

syn keyword justConditional if else
syn region justConditionalBraces start="\v\{\{@!" end="\v\}@=" transparent contains=@justExpr
syn region justConditionalBracesInInterp start="\v\{\{@!" end="\v\}@=" transparent contained contains=@justExprInInterp

syn match justLineLeadingSymbol "\v^%(\\\n)@3<!\s+\zs%(\@-|-\@|\@|-)"

syn match justLineContinuation "\\$"
   \ containedin=ALLBUT,justComment,justCommentInBody,justShebang,@justRawStrings,justRecipeAttrArgError,justShellExpandRawDefaultValue

syn region justBody
   \ start=/\v^\z( +|\t+)%(#!)@!\S/
   \ skip='\v\\\n|\n\s*$'
   \ end="\v\n\z1@!|%(^\S)@2<=\_.@="
   \ contains=justInterpolation,@justOtherCurlyBraces,justLineLeadingSymbol,justCommentInBody,justStringInsideBody,justIndentError
   \ contained

syn region justShebangBody
   \ start="\v^\z( +|\t+)#!"
   \ skip='\v\\\n|\n\s*$'
   \ end="\v\n\z1@!|%(^\S)@2<=\_.@="
   \ contains=justInterpolation,@justOtherCurlyBraces,justCommentInBody,justShebang,justStringInShebangBody,justShebangIndentError
   \ contained

syn cluster justBodies contains=justBody,justShebangBody

syn match justIndentError '\v^%(\\\n)@3<!%( +\zs\t|\t+\zs )\s*\S@='
syn match justShebangIndentError '\v^ +\zs\t\s*\S@='

syn region justInterpolation
   \ matchgroup=justInterpolationDelim
   \ start="\v\{\{\{@!" end="\v%(%(\\\n\s|\S)\s*)@<=\}\}|$"
   \ matchgroup=justInterpError end='^\S'
   \ contained
   \ contains=@justExprInInterp

syn match justBadCurlyBraces '\v\{{3}\ze[^{]' contained
syn match justCurlyBraces '\v\{{4}' contained
syn match justBadCurlyBraces '\v\{{5}\ze[^{]' contained
syn cluster justOtherCurlyBraces contains=justCurlyBraces,justBadCurlyBraces

syn match justFunctionCall "\v\w+%(\s|\\\n)*\(@=" transparent contains=justBuiltInFunction

" error() is intentionally not included in this list
syn keyword justBuiltInFunction
   \ absolute_path append arch blake3 blake3_file cache_dir cache_directory canonicalize capitalize choose clean config_dir config_directory config_local_dir config_local_directory data_dir data_directory data_local_dir data_local_directory datetime datetime_utc encode_uri_component env env_var env_var_or_default executable_dir executable_directory extension file_name file_stem home_dir home_directory invocation_dir invocation_dir_native invocation_directory invocation_directory_native is_dependency join just_executable just_pid justfile justfile_dir justfile_directory kebabcase lowercamelcase lowercase module_dir module_directory module_file num_cpus os os_family parent_dir parent_directory path_exists prepend quote replace replace_regex semver_matches sha256 sha256_file shell shoutykebabcase shoutysnakecase snakecase source_dir source_directory source_file style titlecase trim trim_end trim_end_match trim_end_matches trim_start trim_start_match trim_start_matches uppercamelcase uppercase uuid without_extension
   \ contained

syn match justUserDefinedError "\v%(assert|error)%(%(\s|\\\n)*\()@="

syn match justReplaceRegex '\vreplace_regex%(\s|\\\n)*\(@=' transparent contains=justBuiltInFunction nextgroup=justReplaceRegexCall
syn match justReplaceRegexInInterp '\vreplace_regex%(\s|\\\n)*\(@=' transparent contained contains=justBuiltInFunction nextgroup=justReplaceRegexCallInInterp

syn region justReplaceRegexCall
   \ matchgroup=justReplaceRegexCall
   \ start='\V(' end='\V)'
   \ transparent contained
   \ contains=@justExpr,justRegexReplacement
syn region justReplaceRegexCallInInterp
   \ matchgroup=justReplaceRegexCall
   \ start='\V(' end='\V)'
   \ transparent contained
   \ contains=@justExprInInterp,justRegexReplacement

syn match justParameterLineContinuation '\v%(\s|\\\n)*' contained nextgroup=justParameterError

syn match justRecipeDepParenName '\v%(\(\n?)@3<=%(\_s|\\\n)*\h\k*'
   \ transparent contained
   \ contains=justFunction

syn cluster justBuiltInFunctions contains=justFunctionCall,justUserDefinedError

syn match justConditionalOperator "\V=="
syn match justConditionalOperator "\V!="
syn match justConditionalOperator "\V=~"

syn match justOperator "\V+"
syn match justOperator "\V/"
syn match justOperator "\V&&"
syn match justOperator "\V||"

syn keyword justConstant
   \ HEX HEXLOWER HEXUPPER
   \ CLEAR NORMAL BOLD ITALIC UNDERLINE INVERT HIDE STRIKETHROUGH
   \ BLACK RED GREEN YELLOW BLUE MAGENTA CYAN WHITE
   \ BG_BLACK BG_RED BG_GREEN BG_YELLOW BG_BLUE BG_MAGENTA BG_CYAN BG_WHITE

syn match justShellExpandVarRaw '\v\$%(\{\_[^}]*\}|\w+)' contained contains=justShellExpandRawDefaultDelimiter
syn match justShellExpandRawDefaultDelimiter '\V:-' contained nextgroup=justShellExpandRawDefaultValue
syn match justShellExpandRawDefaultValue '\v\_[^}]*' contained
syn match justShellExpandVar '\v\$%(\w|\\\n\s*)+' contained
syn region justShellExpandVar start='\v\$%(\\\n\s*)*\{' end='\V}' contains=justShellExpandDefaultDelimiter,justStringEscapeSequence,justStringUEscapeSequence,justStringEscapeError
syn match justShellExpandDefaultDelimiter '\v:%(\\\n\s*)*-@=' contained nextgroup=justShellExpandDefault
syn region justShellExpandDefault
   \ matchgroup=justShellExpandDefaultDelimiter start='\V-' end='\v\}@='
   \ contained
   \ contains=justStringEscapeSequence,justStringUEscapeSequence,justStringEscapeError

syn match justDollarEscape '\V$$' contained
syn match justDollarEscapeSplit '\v\$%(\\\n\s*)*\$' contained

syn cluster justExprBase contains=@justAllStrings,@justBuiltInFunctions,justConditional,justConditionalOperator,justOperator,justConstant
syn cluster justExpr contains=@justExprBase,justExprParen,justConditionalBraces,justReplaceRegex
syn cluster justExprInInterp contains=@justExprBase,justName,justExprParenInInterp,justConditionalBracesInInterp,justReplaceRegexInInterp

syn cluster justExprFunc contains=@justBuiltInFunctions,justReplaceRegex,justExprParen

syn match justImport /\v^import%(%(\s|\\\n)*\?|%(\s|\\\n)+%(x?['"])@=)/ transparent
   \ contains=justImportStatement,justOptionalFile
syn match justImportStatement '^import' contained

syn match justOldInclude "^!include"

syn match justModule /\v^mod%(%(\s|\\\n)*\?)?%(\s|\\\n)+\h\k*\s*%($|%(\s|\\\n)*%(x?['"]|#)@=)/
   \ transparent contains=justModStatement,justName,justOptionalFile
syn match justModStatement '^mod' contained

syn match justOptionalFile '\V?' contained

" Most linked colorscheme colors are chosen based on semantics of the color name.
" Some are for parity with other syntax files (for example, Number for recipe body highlighting
" is to align with the make.vim distributed with Vim).
" Deprecated `just` syntaxes are highlighted as Underlined.
"
" Colors are linked 'def'(ault) so that users who prefer other colors
" can override them, e.g. in ~/.vim/after/syntax/just.vim
"
" Note that vim-just's highlight groups are an implementation detail and may be subject to change.

" The list of highlight links is sorted alphabetically.

hi def link justAlias                            Statement
hi def link justAssignmentOperator               Operator
hi def link justBacktick                         Special
hi def link justBadCurlyBraces                   Error
hi def link justBody                             Number
hi def link justBoolean                          Boolean
hi def link justBuiltInFunction                  Function
hi def link justComment                          Comment
hi def link justCommentInBody                    Comment
hi def link justCommentTodo                      Todo
hi def link justConditional                      Conditional
hi def link justConditionalOperator              Conditional
hi def link justConstant                         Constant
hi def link justCurlyBraces                      Special
hi def link justDollarEscape                     Special
hi def link justDollarEscapeSplit                Special
hi def link justExport                           Statement
hi def link justFunction                         Function
hi def link justImportStatement                  Include
hi def link justIndentError                      Error
hi def link justInterpError                      Error
hi def link justInterpolation                    Normal
hi def link justInterpolationDelim               Delimiter
hi def link justInvalidAttrValue                 Error
hi def link justLineContinuation                 Special
hi def link justLineLeadingSymbol                Special
hi def link justModStatement                     Keyword
hi def link justName                             Identifier
hi def link justOldInclude                       Error
hi def link justOperator                         Operator
hi def link justOptionalFile                     Conditional
hi def link justParameterError                   Error
hi def link justParameterOperator                Operator
hi def link justParamExport                      Statement
hi def link justRawString                        String
hi def link justRawStrRegexRepl                  String
hi def link justRecipeAt                         Special
hi def link justRecipeAttr                       Type
hi def link justRecipeAttrArgError               Error
hi def link justRecipeAttrSep                    Operator
hi def link justRecipeAttrValueColon             Operator
hi def link justRecipeColon                      Operator
hi def link justRecipeDepParamsParen             Delimiter
hi def link justRecipeSubsequentDeps             Delimiter
hi def link justRegexCapture                     Identifier
hi def link justSet                              Statement
hi def link justSetDeprecatedKeywords            Underlined
hi def link justSetKeywords                      Keyword
hi def link justShebang                          SpecialComment
hi def link justShebangBody                      Number
hi def link justShebangIndentError               Error
hi def link justShellExpandDefault               Character
hi def link justShellExpandDefaultDelimiter      Operator
hi def link justShellExpandRawDefaultDelimiter   Operator
hi def link justShellExpandRawDefaultValue       Character
hi def link justShellExpandRawString             String
hi def link justShellExpandString                String
hi def link justShellExpandVar                   PreProc
hi def link justShellExpandVarRaw                PreProc
hi def link justShellSetError                    Error
hi def link justString                           String
hi def link justStringEscapeError                Error
hi def link justStringEscapeSequence             Special
hi def link justStringInShebangBody              String
hi def link justStringInsideBody                 String
hi def link justStringRegexRepl                  String
hi def link justStringUEscapeSequence            Special
hi def link justUnexport                         Statement
hi def link justUserDefinedError                 Exception
hi def link justVariadicPrefix                   Statement
hi def link justVariadicPrefixError              Error

let &cpo = s:cpo_save
unlet s:cpo_save