just.vim (21043B)
1 " Vim syntax file 2 " Language: Justfile 3 " Maintainer: Peter Benjamin <@pbnj> 4 " Last Change: 2025 Jan 25 5 " Credits: The original author, Noah Bogart <https://github.com/NoahTheDuke/vim-just/> 6 7 if exists('b:current_syntax') 8 finish 9 endif 10 11 let s:cpo_save = &cpo 12 set cpo&vim 13 14 let b:current_syntax = 'just' 15 16 " syncing fromstart prevents mismatched highlighting when jumping around in a justfile 17 " linebreaks= keeps multi-line constructs highlighted correctly while typing 18 syn sync fromstart linebreaks=10 19 20 " a-zA-Z0-9_- 21 syn iskeyword @,48-57,_,- 22 23 syn match justComment "#.*$" contains=@Spell,justCommentTodo 24 syn match justCommentInBody '#.*$' contained contains=justCommentTodo,justInterpolation,@justOtherCurlyBraces 25 syn keyword justCommentTodo TODO FIXME XXX contained 26 syn match justShebang "^\s*#!.*$" contains=justInterpolation,@justOtherCurlyBraces 27 syn match justName "\h\k*" contained 28 syn match justFunction "\h\k*" contained 29 30 syn match justPreBodyComment "\v%(\s|\\\n)*%([^\\]\n)@3<!#%([^!].*)?\n%(\t+| +)@=" transparent contained contains=justComment 31 \ nextgroup=@justBodies skipnl 32 33 syn region justBacktick start=/`/ end=/`/ 34 syn region justBacktick start=/```/ end=/```/ 35 syn region justRawString start=/'/ end=/'/ 36 syn region justRawString start=/'''/ end=/'''/ 37 syn region justString start=/"/ skip=/\\\\\|\\"/ end=/"/ contains=justStringEscapeSequence,justStringUEscapeSequence,justStringEscapeError 38 syn region justString start=/"""/ skip=/\\\\\|\\"/ end=/"""/ contains=justStringEscapeSequence,justStringUEscapeSequence,justStringEscapeError 39 40 syn region justShellExpandRawString start=/\v\k@1<!x'/ end=/'/ 41 \ contains=justShellExpandVarRaw,justDollarEscape 42 syn region justShellExpandRawString start=/\v\k@1<!x'''/ end=/'''/ 43 \ contains=justShellExpandVarRaw,justDollarEscape 44 syn region justShellExpandString 45 \ start=/\v\k@1<!x"/ skip=/\\\\\|\\"/ end=/"/ 46 \ contains=justStringEscapeSequence,justStringUEscapeSequence,justStringEscapeError,justShellExpandVar,justDollarEscape,justDollarEscapeSplit 47 syn region justShellExpandString 48 \ start=/\v\k@1<!x"""/ skip=/\\\\\|\\"/ end=/"""/ 49 \ contains=justStringEscapeSequence,justStringUEscapeSequence,justStringEscapeError,justShellExpandVar,justDollarEscape,justDollarEscapeSplit 50 51 syn cluster justStringLiterals 52 \ contains=justRawString,justString,justShellExpandRawString,justShellExpandString 53 syn cluster justAllStrings contains=justBacktick,@justStringLiterals 54 55 syn match justRegexReplacement 56 \ /\v,%(\_s|\\\n)*%('\_[^']*'|'''%(\_.%(''')@!)*\_.?''')%(\_s|\\\n)*%(,%(\_s|\\\n)*)?\)/me=e-1 57 \ transparent contained contains=@justExpr,@justStringsWithRegexCapture 58 syn match justRegexReplacement 59 \ /\v,%(\_s|\\\n)*%("%(\_[^"]|\\")*"|"""%(\_.%(""")@!)*\_.?""")%(\_s|\\\n)*%(,%(\_s|\\\n)*)?\)/me=e-1 60 \ transparent contained contains=@justExpr,@justStringsWithRegexCapture 61 62 syn region justRawStrRegexRepl start=/\v'/ end=/'/ contained contains=justRegexCapture,justDollarEscape 63 syn region justRawStrRegexRepl start=/\v'''/ end=/'''/ contained contains=justRegexCapture,justDollarEscape 64 syn region justStringRegexRepl start=/\v"/ skip=/\\\\\|\\"/ end=/"/ contained contains=justStringEscapeSequence,justStringUEscapeSequence,justStringEscapeError,justRegexCapture,justDollarEscape,justDollarEscapeSplit 65 syn region justStringRegexRepl start=/\v"""/ skip=/\\\\\|\\"/ end=/"""/ contained contains=justStringEscapeSequence,justStringUEscapeSequence,justStringEscapeError,justRegexCapture,justDollarEscape,justDollarEscapeSplit 66 syn match justRegexCapture '\v\$%(\w+|\{\w+\})' contained 67 syn cluster justStringsWithRegexCapture contains=justRawStrRegexRepl,justStringRegexRepl 68 69 syn cluster justRawStrings contains=justRawString,justRawStrRegexRepl 70 71 syn region justStringInsideBody start=/\v\\@1<!'/ end=/'/ contained contains=justInterpolation,@justOtherCurlyBraces,justIndentError 72 syn region justStringInsideBody start=/\v\\@1<!"/ skip=/\v\\@1<!\\"/ end=/"/ contained contains=justInterpolation,@justOtherCurlyBraces,justIndentError 73 syn region justStringInShebangBody start=/\v\\@1<!'/ end=/'/ contained contains=justInterpolation,@justOtherCurlyBraces,justShebangIndentError 74 syn region justStringInShebangBody start=/\v\\@1<!"/ skip=/\v\\@1<!\\"/ end=/"/ contained contains=justInterpolation,@justOtherCurlyBraces,justShebangIndentError 75 76 syn match justStringEscapeError '\\.' contained 77 syn match justStringEscapeSequence '\v\\[tnr"\\]' contained 78 syn match justStringUEscapeSequence '\v\\u\{[0-9A-Fa-f]{1,6}\}' contained 79 80 syn match justAssignmentOperator "\V:=" contained 81 82 syn region justExprParen start='\V(' end='\V)' transparent contains=@justExpr 83 syn region justExprParenInInterp start='\V(' end='\V)' transparent contained contains=@justExprInInterp 84 85 syn match justRecipeAt "^@" contained 86 syn match justRecipeColon ":" contained 87 88 syn region justRecipeAttributes 89 \ matchgroup=justRecipeAttr start='\v^%(\\\n)@3<!\[' end='\V]' 90 \ contains=justRecipeAttr,justRecipeAttrSep,justRecipeAttrArgs,justRecipeAttrArgError,justRecipeAttrValueShort 91 92 syn keyword justRecipeAttr 93 \ confirm doc extension group linux macos no-cd no-exit-message no-quiet openbsd positional-arguments private script unix windows working-directory 94 \ contained 95 syn match justRecipeAttrSep ',' contained 96 syn match justRecipeAttrValueShort '\v:%(\_s|\\\n)*' transparent contained 97 \ contains=justRecipeAttrValueColon nextgroup=@justStringLiterals,justInvalidAttrValue 98 syn match justRecipeAttrValueColon '\V:' contained 99 syn region justRecipeAttrArgs matchgroup=justRecipeAttr start='\V(' end='\V)' contained 100 \ contains=@justStringLiterals 101 syn match justRecipeAttrArgError '\v\(%(\s|\\?\n)*\)' contained 102 103 syn match justInvalidAttrValue '\v[^"',]["']@![^,\]]*' contained 104 105 syn match justRecipeDeclSimple "\v^\@?\h\k*%(%(\s|\\\n)*:\=@!)@=" 106 \ transparent contains=justRecipeName 107 \ nextgroup=justRecipeNoDeps,justRecipeDeps 108 109 syn region justRecipeDeclComplex start="\v^\@?\h\k*%(\s|\\\n)+%([+*$]+%(\s|\\\n)*)*\h" end="\v%(:\=@!)@=|$" 110 \ transparent 111 \ contains=justRecipeName,justParameter 112 \ nextgroup=justRecipeNoDeps,justRecipeDeps 113 114 syn match justRecipeName "\v^\@?\h\k*" transparent contained contains=justRecipeAt,justFunction 115 116 syn match justParameter "\v%(\s|\\\n)@3<=%(%([*+]%(\s|\\\n)*)?%(\$%(\s|\\\n)*)?|\$%(\s|\\\n)*[*+]%(\s|\\\n)*)\h\k*" 117 \ transparent contained 118 \ contains=justName,justVariadicPrefix,justParamExport,justVariadicPrefixError 119 \ nextgroup=justPreParamValue 120 121 syn match justPreParamValue '\v%(\s|\\\n)*\=%(\s|\\\n)*' 122 \ contained transparent 123 \ contains=justParameterOperator 124 \ nextgroup=justParamValue 125 126 syn region justParamValue contained transparent 127 \ start="\v\S" 128 \ skip="\\\n" 129 \ end="\v%(\s|^)%([*+$:]|\h)@=|:@=|$" 130 \ contains=@justAllStrings,justRecipeParenDefault,@justExprFunc 131 \ nextgroup=justParameterError 132 syn match justParameterOperator "\V=" contained 133 134 syn match justVariadicPrefix "\v%(\s|\\\n)@3<=[*+]%(%(\s|\\\n)*\$?%(\s|\\\n)*\h)@=" contained 135 syn match justParamExport '\V$' contained 136 syn match justVariadicPrefixError "\v\$%(\s|\\\n)*[*+]" contained 137 138 syn match justParameterError "\v%(%([+*$]+%(\s|\\\n)*)*\h\k*)@>%(%(\s|\\\n)*\=)@!" contained 139 140 syn region justRecipeParenDefault 141 \ matchgroup=justRecipeDepParamsParen start='\v%(\=%(\s|\\\n)*)@<=\(' end='\V)' 142 \ contained 143 \ contains=@justExpr 144 syn match justRecipeSubsequentDeps '\V&&' contained 145 146 syn match justRecipeNoDeps '\v:%(\s|\\\n)*\n|:#@=|:%(\s|\\\n)+#@=' 147 \ transparent contained 148 \ contains=justRecipeColon 149 \ nextgroup=justPreBodyComment,@justBodies 150 syn region justRecipeDeps start="\v:%(\s|\\\n)*%([a-zA-Z_(]|\&\&)" skip='\\\n' end="\v#@=|\\@1<!\n" 151 \ transparent contained 152 \ contains=justFunction,justRecipeColon,justRecipeSubsequentDeps,justRecipeParamDep 153 \ nextgroup=justPreBodyComment,@justBodies 154 155 syn region justRecipeParamDep contained transparent 156 \ matchgroup=justRecipeDepParamsParen 157 \ start="\V(" 158 \ end="\V)" 159 \ contains=justRecipeDepParenName,@justExpr 160 161 syn keyword justBoolean true false contained 162 163 syn match justAssignment "\v^\h\k*%(\s|\\\n)*:\=" transparent contains=justAssignmentOperator 164 165 syn match justSet '\v^set' contained 166 syn keyword justSetKeywords 167 \ 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 168 \ contained 169 syn keyword justSetDeprecatedKeywords windows-powershell contained 170 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)*%($|#@=)" 171 \ contains=justSet,justSetKeywords,justSetDeprecatedKeywords,justAssignmentOperator,justBoolean 172 \ transparent 173 174 syn match justStringSet '\v^set%(\s|\\\n)+\k+%(\s|\\\n)*:\=%(\s|\\\n)*%(x?['"])@=' transparent contains=justSet,justSetKeywords,justAssignmentOperator 175 176 syn match justShellSet 177 \ "\v^set%(\s|\\\n)+%(s%(hell|cript-interpreter)|windows-shell)%(\s|\\\n)*:\=%(\s|\\\n)*\[@=" 178 \ contains=justSet,justSetKeywords,justAssignmentOperator 179 \ transparent skipwhite 180 \ nextgroup=justShellSetValue 181 syn region justShellSetValue 182 \ start='\V[' end='\V]' 183 \ contained 184 \ contains=@justStringLiterals,justShellSetError 185 186 syn match justShellSetError '\v\k+['"]@!' contained 187 188 syn match justAlias '\v^alias' contained 189 syn match justAliasDecl "\v^alias%(\s|\\\n)+\h\k*%(\s|\\\n)*:\=%(\s|\\\n)*" 190 \ transparent 191 \ contains=justAlias,justFunction,justAssignmentOperator 192 \ nextgroup=justAliasRes 193 syn match justAliasRes '\v\h\k*%(\s|\\\n)*%(#@=|$)' contained transparent contains=justFunction 194 195 syn match justExportedAssignment "\v^export%(\s|\\\n)+\h\k*%(\s|\\\n)*:\=" transparent 196 \ contains=justExport,justAssignmentOperator 197 198 syn match justExport '\v^export' contained 199 200 syn match justUnexportStatement '\v^unexport%(\s|\\\n)+\w+\s*$' contains=justUnexport 201 syn match justUnexport '\v^unexport' contained 202 203 syn keyword justConditional if else 204 syn region justConditionalBraces start="\v\{\{@!" end="\v\}@=" transparent contains=@justExpr 205 syn region justConditionalBracesInInterp start="\v\{\{@!" end="\v\}@=" transparent contained contains=@justExprInInterp 206 207 syn match justLineLeadingSymbol "\v^%(\\\n)@3<!\s+\zs%(\@-|-\@|\@|-)" 208 209 syn match justLineContinuation "\\$" 210 \ containedin=ALLBUT,justComment,justCommentInBody,justShebang,@justRawStrings,justRecipeAttrArgError,justShellExpandRawDefaultValue 211 212 syn region justBody 213 \ start=/\v^\z( +|\t+)%(#!)@!\S/ 214 \ skip='\v\\\n|\n\s*$' 215 \ end="\v\n\z1@!|%(^\S)@2<=\_.@=" 216 \ contains=justInterpolation,@justOtherCurlyBraces,justLineLeadingSymbol,justCommentInBody,justStringInsideBody,justIndentError 217 \ contained 218 219 syn region justShebangBody 220 \ start="\v^\z( +|\t+)#!" 221 \ skip='\v\\\n|\n\s*$' 222 \ end="\v\n\z1@!|%(^\S)@2<=\_.@=" 223 \ contains=justInterpolation,@justOtherCurlyBraces,justCommentInBody,justShebang,justStringInShebangBody,justShebangIndentError 224 \ contained 225 226 syn cluster justBodies contains=justBody,justShebangBody 227 228 syn match justIndentError '\v^%(\\\n)@3<!%( +\zs\t|\t+\zs )\s*\S@=' 229 syn match justShebangIndentError '\v^ +\zs\t\s*\S@=' 230 231 syn region justInterpolation 232 \ matchgroup=justInterpolationDelim 233 \ start="\v\{\{\{@!" end="\v%(%(\\\n\s|\S)\s*)@<=\}\}|$" 234 \ matchgroup=justInterpError end='^\S' 235 \ contained 236 \ contains=@justExprInInterp 237 238 syn match justBadCurlyBraces '\v\{{3}\ze[^{]' contained 239 syn match justCurlyBraces '\v\{{4}' contained 240 syn match justBadCurlyBraces '\v\{{5}\ze[^{]' contained 241 syn cluster justOtherCurlyBraces contains=justCurlyBraces,justBadCurlyBraces 242 243 syn match justFunctionCall "\v\w+%(\s|\\\n)*\(@=" transparent contains=justBuiltInFunction 244 245 " error() is intentionally not included in this list 246 syn keyword justBuiltInFunction 247 \ 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 248 \ contained 249 250 syn match justUserDefinedError "\v%(assert|error)%(%(\s|\\\n)*\()@=" 251 252 syn match justReplaceRegex '\vreplace_regex%(\s|\\\n)*\(@=' transparent contains=justBuiltInFunction nextgroup=justReplaceRegexCall 253 syn match justReplaceRegexInInterp '\vreplace_regex%(\s|\\\n)*\(@=' transparent contained contains=justBuiltInFunction nextgroup=justReplaceRegexCallInInterp 254 255 syn region justReplaceRegexCall 256 \ matchgroup=justReplaceRegexCall 257 \ start='\V(' end='\V)' 258 \ transparent contained 259 \ contains=@justExpr,justRegexReplacement 260 syn region justReplaceRegexCallInInterp 261 \ matchgroup=justReplaceRegexCall 262 \ start='\V(' end='\V)' 263 \ transparent contained 264 \ contains=@justExprInInterp,justRegexReplacement 265 266 syn match justParameterLineContinuation '\v%(\s|\\\n)*' contained nextgroup=justParameterError 267 268 syn match justRecipeDepParenName '\v%(\(\n?)@3<=%(\_s|\\\n)*\h\k*' 269 \ transparent contained 270 \ contains=justFunction 271 272 syn cluster justBuiltInFunctions contains=justFunctionCall,justUserDefinedError 273 274 syn match justConditionalOperator "\V==" 275 syn match justConditionalOperator "\V!=" 276 syn match justConditionalOperator "\V=~" 277 278 syn match justOperator "\V+" 279 syn match justOperator "\V/" 280 syn match justOperator "\V&&" 281 syn match justOperator "\V||" 282 283 syn keyword justConstant 284 \ HEX HEXLOWER HEXUPPER 285 \ CLEAR NORMAL BOLD ITALIC UNDERLINE INVERT HIDE STRIKETHROUGH 286 \ BLACK RED GREEN YELLOW BLUE MAGENTA CYAN WHITE 287 \ BG_BLACK BG_RED BG_GREEN BG_YELLOW BG_BLUE BG_MAGENTA BG_CYAN BG_WHITE 288 289 syn match justShellExpandVarRaw '\v\$%(\{\_[^}]*\}|\w+)' contained contains=justShellExpandRawDefaultDelimiter 290 syn match justShellExpandRawDefaultDelimiter '\V:-' contained nextgroup=justShellExpandRawDefaultValue 291 syn match justShellExpandRawDefaultValue '\v\_[^}]*' contained 292 syn match justShellExpandVar '\v\$%(\w|\\\n\s*)+' contained 293 syn region justShellExpandVar start='\v\$%(\\\n\s*)*\{' end='\V}' contains=justShellExpandDefaultDelimiter,justStringEscapeSequence,justStringUEscapeSequence,justStringEscapeError 294 syn match justShellExpandDefaultDelimiter '\v:%(\\\n\s*)*-@=' contained nextgroup=justShellExpandDefault 295 syn region justShellExpandDefault 296 \ matchgroup=justShellExpandDefaultDelimiter start='\V-' end='\v\}@=' 297 \ contained 298 \ contains=justStringEscapeSequence,justStringUEscapeSequence,justStringEscapeError 299 300 syn match justDollarEscape '\V$$' contained 301 syn match justDollarEscapeSplit '\v\$%(\\\n\s*)*\$' contained 302 303 syn cluster justExprBase contains=@justAllStrings,@justBuiltInFunctions,justConditional,justConditionalOperator,justOperator,justConstant 304 syn cluster justExpr contains=@justExprBase,justExprParen,justConditionalBraces,justReplaceRegex 305 syn cluster justExprInInterp contains=@justExprBase,justName,justExprParenInInterp,justConditionalBracesInInterp,justReplaceRegexInInterp 306 307 syn cluster justExprFunc contains=@justBuiltInFunctions,justReplaceRegex,justExprParen 308 309 syn match justImport /\v^import%(%(\s|\\\n)*\?|%(\s|\\\n)+%(x?['"])@=)/ transparent 310 \ contains=justImportStatement,justOptionalFile 311 syn match justImportStatement '^import' contained 312 313 syn match justOldInclude "^!include" 314 315 syn match justModule /\v^mod%(%(\s|\\\n)*\?)?%(\s|\\\n)+\h\k*\s*%($|%(\s|\\\n)*%(x?['"]|#)@=)/ 316 \ transparent contains=justModStatement,justName,justOptionalFile 317 syn match justModStatement '^mod' contained 318 319 syn match justOptionalFile '\V?' contained 320 321 " Most linked colorscheme colors are chosen based on semantics of the color name. 322 " Some are for parity with other syntax files (for example, Number for recipe body highlighting 323 " is to align with the make.vim distributed with Vim). 324 " Deprecated `just` syntaxes are highlighted as Underlined. 325 " 326 " Colors are linked 'def'(ault) so that users who prefer other colors 327 " can override them, e.g. in ~/.vim/after/syntax/just.vim 328 " 329 " Note that vim-just's highlight groups are an implementation detail and may be subject to change. 330 331 " The list of highlight links is sorted alphabetically. 332 333 hi def link justAlias Statement 334 hi def link justAssignmentOperator Operator 335 hi def link justBacktick Special 336 hi def link justBadCurlyBraces Error 337 hi def link justBody Number 338 hi def link justBoolean Boolean 339 hi def link justBuiltInFunction Function 340 hi def link justComment Comment 341 hi def link justCommentInBody Comment 342 hi def link justCommentTodo Todo 343 hi def link justConditional Conditional 344 hi def link justConditionalOperator Conditional 345 hi def link justConstant Constant 346 hi def link justCurlyBraces Special 347 hi def link justDollarEscape Special 348 hi def link justDollarEscapeSplit Special 349 hi def link justExport Statement 350 hi def link justFunction Function 351 hi def link justImportStatement Include 352 hi def link justIndentError Error 353 hi def link justInterpError Error 354 hi def link justInterpolation Normal 355 hi def link justInterpolationDelim Delimiter 356 hi def link justInvalidAttrValue Error 357 hi def link justLineContinuation Special 358 hi def link justLineLeadingSymbol Special 359 hi def link justModStatement Keyword 360 hi def link justName Identifier 361 hi def link justOldInclude Error 362 hi def link justOperator Operator 363 hi def link justOptionalFile Conditional 364 hi def link justParameterError Error 365 hi def link justParameterOperator Operator 366 hi def link justParamExport Statement 367 hi def link justRawString String 368 hi def link justRawStrRegexRepl String 369 hi def link justRecipeAt Special 370 hi def link justRecipeAttr Type 371 hi def link justRecipeAttrArgError Error 372 hi def link justRecipeAttrSep Operator 373 hi def link justRecipeAttrValueColon Operator 374 hi def link justRecipeColon Operator 375 hi def link justRecipeDepParamsParen Delimiter 376 hi def link justRecipeSubsequentDeps Delimiter 377 hi def link justRegexCapture Identifier 378 hi def link justSet Statement 379 hi def link justSetDeprecatedKeywords Underlined 380 hi def link justSetKeywords Keyword 381 hi def link justShebang SpecialComment 382 hi def link justShebangBody Number 383 hi def link justShebangIndentError Error 384 hi def link justShellExpandDefault Character 385 hi def link justShellExpandDefaultDelimiter Operator 386 hi def link justShellExpandRawDefaultDelimiter Operator 387 hi def link justShellExpandRawDefaultValue Character 388 hi def link justShellExpandRawString String 389 hi def link justShellExpandString String 390 hi def link justShellExpandVar PreProc 391 hi def link justShellExpandVarRaw PreProc 392 hi def link justShellSetError Error 393 hi def link justString String 394 hi def link justStringEscapeError Error 395 hi def link justStringEscapeSequence Special 396 hi def link justStringInShebangBody String 397 hi def link justStringInsideBody String 398 hi def link justStringRegexRepl String 399 hi def link justStringUEscapeSequence Special 400 hi def link justUnexport Statement 401 hi def link justUserDefinedError Exception 402 hi def link justVariadicPrefix Statement 403 hi def link justVariadicPrefixError Error 404 405 let &cpo = s:cpo_save 406 unlet s:cpo_save