Files
website/syntaxes/mcfunction.sublime-syntax

290 lines
8.1 KiB
YAML

%YAML 1.2
---
# The following syntax definition is based on:
# https://github.com/MinecraftCommands/syntax-mcfunction/tree/51eb8bf4ca04355bb89f5538b7331cb0c0f3df2b
name: mcfunction
file_extensions: [mcfunction]
scope: source.mcfunction
contexts:
main:
- include: root
comments:
- match: '^\s*(#[>!#])(.+)$'
captures:
"1": comment.block.mcfunction
"2": markup.bold.mcfunction
push:
- meta_scope: meta.comments
- include: comments_block
- match: ^(?!#)
pop: true
- match: ^\s*#.*$
scope: meta.comments
captures:
"0": comment.line.mcfunction
comments_block:
- match: '^\s*#[>!]'
push:
- meta_scope: meta.comments_block
- include: comments_block_emphasized
- match: $
pop: true
- match: '^\s*#'
push:
- meta_scope: meta.comments_block
- include: comments_block_normal
- match: $
pop: true
comments_block_emphasized:
- include: comments_block_special
- match: \S+
scope: meta.comments_block_emphasized
captures:
"0": markup.bold.mcfunction
comments_block_normal:
- include: comments_block_special
- match: \S+
scope: meta.comments_block_normal
captures:
"0": comment.block.mcfunction
comments_block_special:
- match: '@\S+'
scope: meta.comments_block_special
captures:
"0": markup.heading.mcfunction
- include: resource-name
- match: "[#%$][A-Za-z0-9_.#%$]+"
scope: meta.comments_block_special
captures:
"0": variable.other.mcfunction
comments_inline:
- match: "#.*$"
scope: meta.comments
captures:
"0": comment.line.mcfunction
literals:
- match: \b(true|false|True|False)\b
scope: meta.literals
captures:
"0": constant.numeric.boolean.mcfunction
- match: '\b[0-9a-fA-F]+(?:-[0-9a-fA-F]+){4}\b'
scope: meta.names
captures:
"0": variable.uuid.mcfunction
- match: '[+-]?\d*\.?\d+([eE]?[+-]?\d+)?[df]?\b'
scope: meta.literals
captures:
"0": constant.numeric.float.mcfunction
- match: '[+-]?\d+(b|B|L|l|s|S)?\b'
scope: meta.literals
captures:
"0": constant.numeric.integer.mcfunction
- match: \.\.
scope: meta.ellipse.literals
captures:
"0": variable.other.mcfunction
- match: '"'
push:
- meta_scope: string.quoted.double.mcfunction
- include: literals_string-double
- match: '"'
pop: true
- match: "'"
push:
- meta_scope: string.quoted.single.mcfunction
- include: literals_string-single
- match: "'"
pop: true
literals_string-double:
- match: \\.
scope: meta.literals_string-double
captures:
"0": constant.character.escape.mcfunction
- match: \\
scope: meta.literals_string-double
captures:
"0": constant.character.escape.mcfunction
- include: macro-name
- match: '[^\\"]'
scope: meta.literals_string-double
captures:
"0": string.quoted.double.mcfunction
literals_string-single:
- match: \\.
scope: meta.literals_string-single
captures:
"0": constant.character.escape.mcfunction
- match: \\
scope: meta.literals_string-double
captures:
"0": constant.character.escape.mcfunction
- include: macro-name
- match: '[^\\'']'
scope: meta.literals_string-single
captures:
"0": string.quoted.single.mcfunction
macro-name:
- match: '(\$\()([A-Za-z0-9_]*)(\))'
scope: meta.macro-name
captures:
"1": punctuation.definition.template-expression.begin.mcfunction
"2": variable.other.mcfunction
"3": punctuation.definition.template-expression.end.mcfunction
names:
- match: '^(\s*)([a-z_]+)(?=\s)'
scope: meta.names
captures:
"1": whitespace.mcfunction
"2": keyword.control.flow.mcfunction
- match: '^(\s*)(\$)( ?)([a-z_]*)'
scope: meta.names
captures:
"1": whitespace.mcfunction
"2": markup.italic.mcfunction
"3": whitespace.mcfunction
"4": keyword.control.flow.mcfunction
- match: '(run)(\s+)([a-z_]+)'
scope: meta.names
captures:
"1": entity.name.mcfunction
"2": whitespace.mcfunction
"3": keyword.control.flow.mcfunction
- include: resource-name
- match: '[A-Za-z]+(?=\W)'
scope: meta.names
captures:
"0": entity.name.mcfunction
- match: "[A-Za-z_][A-Za-z0-9_.#%$]*"
scope: meta.names
captures:
"0": string.unquoted.mcfunction
- include: macro-name
- match: '([#%$]|((?<=\s)\.))[A-Za-z0-9_.#%$\-]+'
scope: meta.names
captures:
"0": variable.other.mcfunction
operators:
- match: "[~^]"
scope: meta.operators
captures:
"0": constant.numeric.mcfunction
- match: '[\-%?!+*<>\\/|&=.:,;]'
scope: meta.operators
captures:
"0": keyword.operator.mcfunction
property:
- match: '\{'
push:
- meta_scope: meta.property.curly
- include: resource-name
- include: literals
- include: property_key
- include: operators
- include: property_value
- include: main
- match: '\}'
pop: true
- match: '\['
push:
- meta_scope: meta.property.square
- include: resource-name
- include: literals
- include: property_key
- include: operators
- include: property_value
- include: main
- match: '\]'
pop: true
- match: \(
push:
- meta_scope: meta.property.paren
- include: resource-name
- include: literals
- include: property_key
- include: operators
- include: property_value
- include: main
- match: \)
pop: true
property_key:
- match: '#?[a-z_][a-z_\.\-]*\:[a-z0-9_\.\-/]+(?=\s*\=:)'
scope: meta.property_key
captures:
"0": variable.other.mcfunction
- match: '#?[a-z_][a-z0-9_\.\-/]+'
scope: meta.property_key
captures:
"0": variable.other.mcfunction
- match: '[A-Za-z_]+[A-Za-z_\-\+]*'
scope: meta.property_key
captures:
"0": variable.other.mcfunction
property_value:
- match: '#?[a-z_][a-z_\.\-]*\:[a-z0-9_\.\-/]+'
scope: meta.property_value
captures:
"0": string.unquoted.mcfunction
- match: '#?[a-z_][a-z0-9_\.\-/]+'
scope: meta.property_value
captures:
"0": string.unquoted.mcfunction
resource-name:
- match: "#?[a-z_][a-z0-9_.-]*:[a-z0-9_./-]+"
scope: meta.resource-name
captures:
"0": entity.name.function.mcfunction
- match: '#?[a-z0-9_\.\-]+\/[a-z0-9_\.\-\/]+'
scope: meta.resource-name
captures:
"0": entity.name.function.mcfunction
root:
- include: literals
- include: comments
- include: say
- include: names
- include: comments_inline
- include: subcommands
- include: property
- include: operators
- include: selectors
say:
- match: ^(\s*)(say)
captures:
"1": whitespace.mcfunction
"2": keyword.control.flow.mcfunction
push:
- meta_scope: meta.say.mcfunction
- match: \n
pop: true
- match: \\\s*\n
captures:
"0": constant.character.escape.mcfunction
- include: literals_string-double
- include: literals_string-single
- match: (run)(\s+)(say)
captures:
"1": entity.name.mcfunction
"2": whitespace.mcfunction
"3": keyword.control.flow.mcfunction
push:
- meta_scope: meta.say.mcfunction
- match: \n
pop: true
- match: \\\s*\n
captures:
"0": constant.character.escape.mcfunction
- include: literals_string-double
- include: literals_string-single
selectors:
- match: "@[a-z]+"
scope: meta.selectors
captures:
"0": support.class.mcfunction
subcommands:
- match: "[a-z_]+"
scope: meta.literals
captures:
"0": entity.name.class.mcfunction