From 2c0077a9a618ebe2138f851e542bfe2e68db3b9d Mon Sep 17 00:00:00 2001
From: koroshiya <3969837+koroshiya@users.noreply.github.com>
Date: Sat, 28 Sep 2019 12:39:25 +1000
Subject: [PATCH 1/3] Revert "Changed package name of imported sublime-syntax
file so it can be"
This reverts commit b4972370828e49efb1744eb6af81a33819810616.
---
Python.sublime-syntax | 11 ++++++-----
RenpyLanguage.JSON-tmLanguage | 2 +-
RenpyLanguage.tmLanguage | 2 +-
3 files changed, 8 insertions(+), 7 deletions(-)
diff --git a/Python.sublime-syntax b/Python.sublime-syntax
index 2451aea..38326e7 100644
--- a/Python.sublime-syntax
+++ b/Python.sublime-syntax
@@ -23,7 +23,7 @@ file_extensions:
- Snakefile
- wscript
first_line_match: ^#!\s*/.*\bpython(\d(\.\d)?)?\b
-scope: source.python.compat
+scope: source.python
variables:
# We support unicode here because Python 3 is the future
@@ -57,6 +57,7 @@ variables:
| [urfb]*'(?:\\.|[^'])*' # ^
| [\d.ej]+ # numerics
| [+*/%@-] | // | and | or # operators
+ | {{path}} # a path
)*
@@ -129,7 +130,7 @@ contexts:
scope: keyword.control.import.from.python
push:
- meta_scope: meta.statement.import.python
- - meta_content_scope: meta.import-source.python.compat
+ - meta_content_scope: meta.import-source.python
- include: line-continuation-or-pop
- match: \b(import)\b
scope: keyword.control.import.python
@@ -1420,7 +1421,7 @@ contexts:
- include: f-string-content
- match: ''
push:
- - meta_content_scope: source.python.compat.embedded
+ - meta_content_scope: source.python.embedded
- match: (?=![^=]|:|\})
pop: true
- match: \\
@@ -1431,7 +1432,7 @@ contexts:
f-string-replacement-reset:
# Same as f-string-replacement, but with clear_scopes: true
- clear_scopes: true
- - meta_scope: source.python.compat meta.string.interpolated.python
+ - meta_scope: source.python meta.string.interpolated.python
- match: \}
scope: meta.interpolation.python punctuation.section.interpolation.end.python
pop: true
@@ -1451,7 +1452,7 @@ contexts:
- include: f-string-content
- match: ''
push:
- - meta_content_scope: source.python.compat.embedded
+ - meta_content_scope: source.python.embedded
- match: (?=![^=]|:|\})
pop: true
- match: \\
diff --git a/RenpyLanguage.JSON-tmLanguage b/RenpyLanguage.JSON-tmLanguage
index 98aa1a1..0a74290 100644
--- a/RenpyLanguage.JSON-tmLanguage
+++ b/RenpyLanguage.JSON-tmLanguage
@@ -128,7 +128,7 @@
"source_python":{
"comment": "Context for python statements + Renpy autocompletes",
"name": "source.renpy.python",
- "include": "source.python.compat"
+ "include": "source.python"
},
"default":{
"comment": "Default context",
diff --git a/RenpyLanguage.tmLanguage b/RenpyLanguage.tmLanguage
index c1928a8..a2cacde 100644
--- a/RenpyLanguage.tmLanguage
+++ b/RenpyLanguage.tmLanguage
@@ -638,7 +638,7 @@
comment
Context for python statements + Renpy autocompletes
include
- source.python.compat
+ source.python
name
source.renpy.python
From 5a24ffbf660c7ec677184c00ef736d73cbcbfdfa Mon Sep 17 00:00:00 2001
From: koroshiya <3969837+koroshiya@users.noreply.github.com>
Date: Sat, 28 Sep 2019 12:39:33 +1000
Subject: [PATCH 2/3] Revert "Added the sublime-syntax file from the sublimehq
packages repo."
This reverts commit 1526f06107a345df4a120ff38933a3d6efb9bbee.
---
LICENSE | 3 -
Python.sublime-syntax | 2140 -----------------------------------------
2 files changed, 2143 deletions(-)
delete mode 100644 Python.sublime-syntax
diff --git a/LICENSE b/LICENSE
index ea68767..e48ea04 100644
--- a/LICENSE
+++ b/LICENSE
@@ -19,6 +19,3 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
-
-
-Python.sublime-syntax is part of the sublimehq package repository and is used by this project as per its own license: https://raw.githubusercontent.com/sublimehq/Packages/5919f45faabdfcf3932c13886f626f87070bff09/LICENSE
\ No newline at end of file
diff --git a/Python.sublime-syntax b/Python.sublime-syntax
deleted file mode 100644
index 38326e7..0000000
--- a/Python.sublime-syntax
+++ /dev/null
@@ -1,2140 +0,0 @@
-%YAML 1.2
----
-name: Python
-file_extensions:
- - py
- - py3
- - pyw
- - pyi
- - pyx
- - pyx.in
- - pxd
- - pxd.in
- - pxi
- - pxi.in
- - rpy
- - cpy
- - SConstruct
- - Sconstruct
- - sconstruct
- - SConscript
- - gyp
- - gypi
- - Snakefile
- - wscript
-first_line_match: ^#!\s*/.*\bpython(\d(\.\d)?)?\b
-scope: source.python
-
-variables:
- # We support unicode here because Python 3 is the future
- identifier_continue: '[[:alnum:]_]'
- identifier: '\b[[:alpha:]_]{{identifier_continue}}*\b'
- identifier_constant: '\b(?:[\p{Lu}_][\p{Lu}_\d]*)?[\p{Lu}]{2,}[\p{Lu}_\d]*\b' # require 2 consecutive upper-case letters
- digitpart: (?:\d(?:_?\d)*)
- path: '({{identifier}} *\. *)*{{identifier}}'
- sql_indicator: \s*(?:SELECT|INSERT|UPDATE|DELETE|CREATE|REPLACE|ALTER|WITH)\b
- illegal_names: (?:and|as|assert|break|class|continue|def|del|elif|else|except|finally|for|from|global|if|import|in|is|lambda|not|or|pass|raise|return|try|while|with|yield)
- format_spec: |-
- (?x:
- (?:.? [<>=^])? # fill align
- [ +-]? # sign
- \#? # alternate form
- # technically, octal and hexadecimal integers are also supported as 'width', but rarely used
- \d* # width
- ,? # thousands separator
- (?:\.\d+)? # precision
- [bcdeEfFgGnosxX%]? # type
- )
- strftime_spec: '(?:%(?:[aAwdbBGmyYHIpMSfzZjuUVWcxX%]|-[dmHIMSj]))'
- # This can be used in look-aheads to parse simple expressions.
- # Can't be recursive, because sregex doesn't support that,
- # so we're skipping parentheses.
- # Can't parse multiple lines as well, for obvious reasons
- simple_expression: |-
- (?x:
- \s+ # whitespace
- | [urfb]*"(?:\\.|[^"])*" # strings
- | [urfb]*'(?:\\.|[^'])*' # ^
- | [\d.ej]+ # numerics
- | [+*/%@-] | // | and | or # operators
- | {{path}} # a path
- )*
-
-
-
-contexts:
- main:
- - include: statements
-
- statements:
- - include: docstrings
- - include: line-statements
- - include: block-statements
- - include: classes
- - include: functions
- - include: modifiers
- - include: assignments
- - match: ;
- scope: punctuation.terminator.statement.python
- - include: line-expressions
-
- line-statements:
- - include: imports
- - include: decorators
- - match: \b(raise)\b
- scope: keyword.control.flow.raise.python
- push:
- - meta_scope: meta.statement.raise.python
- - include: line-continuation-or-pop
- - match: \b(from)\b
- scope: keyword.control.flow.raise.from.python
- set:
- - meta_scope: meta.statement.raise.python
- - include: line-continuation-or-pop
- - include: expressions
- - include: expressions
- - match: \b(assert)\b
- scope: keyword.other.assert.python
- - match: \b(del)\b
- scope: keyword.other.del.python
- - match: \b(print)\b(?! *([,.()\]}]))
- scope: keyword.other.print.python
- - match: \b(exec)\b(?! *($|[,.()\]}]))
- scope: keyword.other.exec.python
- - match: \b(return)\b
- scope: keyword.control.flow.return.python
- - match: \b(break)\b
- scope: keyword.control.flow.break.python
- - match: \b(continue)\b
- scope: keyword.control.flow.continue.python
- - match: \b(pass)\b
- scope: keyword.control.flow.pass.python
- - match: ':'
- scope: punctuation.separator.annotation.variable.python
-
- imports:
- - match: \b(import)\b
- scope: keyword.control.import.python
- push:
- - meta_scope: meta.statement.import.python
- - include: line-continuation-or-pop
- - match: ','
- scope: punctuation.separator.import-list.python
- - match: \.
- scope: invalid.illegal.unexpected-relative-import.python
- - include: import-alias
- - include: qualified-name
- - match: (?=\S)
- pop: true
- - match: \b(from)\b
- scope: keyword.control.import.from.python
- push:
- - meta_scope: meta.statement.import.python
- - meta_content_scope: meta.import-source.python
- - include: line-continuation-or-pop
- - match: \b(import)\b
- scope: keyword.control.import.python
- set:
- - meta_scope: meta.statement.import.python
- - include: line-continuation-or-pop
- - match: ' *(\()'
- captures:
- 1: punctuation.section.import-list.begin.python
- set:
- - meta_scope: meta.statement.import.python
- - include: comments
- - match: \)
- scope: punctuation.section.import-list.end.python
- pop: true
- - include: import-name-list
- - match: (?=\S)
- pop: true
- - match: ''
- set:
- - meta_scope: meta.statement.import.python
- - include: line-continuation-or-pop
- - include: import-name-list
- - match: (?=\S)
- pop: true
- - match: (?=\S)
- pop: true
- - include: import-from-name
- - match: (?=\S)
- pop: true
-
- import-name-list:
- - match: ','
- scope: punctuation.separator.import-list.python
- - include: import-alias
- - include: name
- - match: \*
- scope: constant.language.import-all.python
- - match: \S+
- scope: invalid.illegal.name.import.python
-
- import-alias:
- - match: \b(as)\b
- scope: keyword.control.import.as.python
-
- import-from-name:
- - match: \.+
- scope: meta.import-path.python keyword.control.import.relative.python
- - match: (?={{path}})
- push:
- - meta_scope: meta.import-path.python
- - match: '{{illegal_names}}\b'
- scope: invalid.illegal.name.python
- - match: '{{identifier}}'
- scope: meta.import-name.python
- - match: \s*(\.) *(?:({{illegal_names}}\b)|({{identifier}}))
- captures:
- 1: punctuation.accessor.dot.python
- 2: invalid.illegal.name.python
- 3: meta.import-name.python
- - match: \ *(\. *\S+) # matches and consumes the remainder of "abc.123" or "abc.+"
- captures:
- 1: invalid.illegal.name.python
- pop: true
- - match: ''
- pop: true
-
- block-statements:
- # async for ... in ...:
- - match: \b(async +)?(for)\b
- captures:
- 1: storage.modifier.async.python
- 2: keyword.control.flow.for.python
- push:
- - meta_scope: meta.statement.for.python
- - include: line-continuation-or-pop
- - match: \b(in)\b
- scope: keyword.control.flow.for.in.python
- set:
- - meta_scope: meta.statement.for.python
- - include: line-continuation-or-pop
- - match: ':'
- scope: punctuation.section.block.for.python
- pop: true
- - include: expressions
- - match: ':'
- scope: invalid.illegal.missing-in.python
- pop: true
- - include: target-list
- # async with ... as ...:
- - match: \b(async +)?(with)\b
- captures:
- 1: storage.modifier.async.python
- 2: keyword.control.flow.with.python
- push: with-body
- # except ... as ...:
- - match: \b(except)\b
- scope: keyword.control.flow.except.python
- push:
- - meta_scope: meta.statement.except.python
- - include: line-continuation-or-pop
- - match: ':'
- scope: punctuation.section.block.except.python
- pop: true
- - match: '\b(as)\b'
- scope: keyword.control.flow.as.python
- set:
- - meta_content_scope: meta.statement.except.python
- - include: line-continuation-or-pop
- - match: ':'
- scope: meta.statement.except.python punctuation.section.block.except.python
- pop: true
- - include: name
- - include: target-list
- - match: \bif\b
- scope: keyword.control.flow.conditional.python
- push:
- - meta_scope: meta.statement.if.python
- - include: line-continuation-or-pop
- - match: ':'
- scope: punctuation.section.block.conditional.python
- pop: true
- - include: expressions
- - match: \bwhile\b
- scope: keyword.control.flow.while.python
- push:
- - meta_scope: meta.statement.while.python
- - include: line-continuation-or-pop
- - match: ':'
- scope: punctuation.section.block.while.python
- pop: true
- - include: expressions
- - match: \b(else)\b(?:\s*(:))?
- scope: meta.statement.conditional.python
- captures:
- 1: keyword.control.flow.conditional.python
- 2: punctuation.section.block.python
- - match: \b(try)\b(?:\s*(:))?
- scope: meta.statement.try.python
- captures:
- 1: keyword.control.flow.try.python
- 2: punctuation.section.block.try.python
- - match: \b(finally)\b(?:\s*(:))?
- scope: meta.statement.finally.python
- captures:
- 1: keyword.control.flow.finally.python
- 2: punctuation.section.block.finally.python
- - match: \belif\b
- scope: keyword.control.flow.conditional.python
- push:
- - meta_scope: meta.statement.conditional.python
- - match: ':'
- scope: punctuation.section.block.python
- pop: true
- - match: $\n?
- pop: true
- - include: line-expressions
-
- with-body:
- - meta_scope: meta.statement.with.python
- - include: line-continuation-or-pop
- - match: \b(as)\b
- scope: keyword.control.flow.with.as.python
- set: with-as
- - match: ':'
- scope: punctuation.section.block.with.python
- pop: true
- - match: ','
- scope: punctuation.separator.with-resources.python
- - include: expressions
-
- with-as:
- - meta_scope: meta.statement.with.python
- - include: line-continuation-or-pop
- - match: ':'
- scope: punctuation.section.block.with.python
- pop: true
- - match: ','
- scope: punctuation.separator.with-resources.python
- set: with-body
- - include: name
- - include: groups
- - include: lists
-
- expressions-common:
- - include: comments
- - include: constants
- - include: numbers
- - include: yields
- - include: operators
- - include: lambda
- - match: \b(await)\b
- scope: keyword.other.await.python
- - include: inline-if
- - include: strings
- - include: function-calls
- - include: item-access
- - include: lists
- - include: dictionaries-and-sets
- - include: tuples
- - include: groups
- - match: \)
- scope: invalid.illegal.stray.brace.round.python
- - match: \]
- scope: invalid.illegal.stray.brace.square.python
- - match: \}
- scope: invalid.illegal.stray.brace.curly.python
- - include: line-continuation
-
- line-expressions: # Always include this last!
- - include: expressions-common
- - include: qualified-name
-
- expressions: # Always include this last!
- # Differs from the line scope in that invalid-name matches will pop the current context
- # and matches accessors continued on a different line
- - include: expressions-common
- - include: illegal-names-pop
- - include: qualified-name
- - match: '(\.) *(?={{identifier}})'
- captures:
- 1: punctuation.accessor.dot.python
- push:
- - include: magic-function-names
- - include: magic-variable-names
- - include: illegal-names
- - include: generic-names
- - match: ''
- pop: true
-
- after-expression:
- # direct function call
- - match: '\s*(\()'
- captures:
- 1: punctuation.section.arguments.begin.python
- push:
- - meta_scope: meta.function-call.arguments.python
- - match: \)
- scope: punctuation.section.arguments.end.python
- pop: true
- - include: arguments
- # item access
- - match: '\s*(\[)'
- captures:
- 1: meta.item-access.python punctuation.section.brackets.begin.python
- push:
- - meta_content_scope: meta.item-access.arguments.python
- - match: \]
- scope: meta.item-access.python punctuation.section.brackets.end.python
- pop: true
- - match: ':'
- scope: punctuation.separator.slice.python
- - include: expressions
- # indirect function call following attribute access
- - include: function-calls
- # arbitrary attribute access
- - match: '\s*(\.)'
- captures:
- 1: punctuation.accessor.dot.python
- push:
- - include: magic-function-names
- - include: magic-variable-names
- - include: illegal-names
- - include: generic-names
- - match: ''
- pop: true
- - match: ''
- pop: true
-
- comments:
- - match: "#"
- scope: punctuation.definition.comment.python
- push:
- - meta_scope: comment.line.number-sign.python
- - match: \n
- pop: true
-
- constants:
- - match: \b(None|True|False|Ellipsis|NotImplemented|__debug__)\b
- scope: constant.language.python
- - match: \.{3}(?!\w)
- scope: constant.language.python
-
- numbers:
- # https://docs.python.org/3/reference/lexical_analysis.html#numeric-literals
- # hexadecimal
- - match: \b(?i)(0x)\h*(L) # py2
- scope: constant.numeric.integer.long.hexadecimal.python
- captures:
- 1: punctuation.definition.numeric.hexadecimal.python
- 2: storage.type.numeric.long.python
- - match: \b(?i)(0x)(_?\h)+
- scope: constant.numeric.integer.hexadecimal.python
- captures:
- 1: punctuation.definition.numeric.hexadecimal.python
- # octal
- - match: \b(?i)(0o?)(?=o|[0-7])[0-7]*(L) # py2
- scope: constant.numeric.integer.long.octal.python
- captures:
- 1: punctuation.definition.integer.octal.python
- 2: storage.type.numeric.long.python
- - match: \b(?i)(0)[0-7]+ # py2
- scope: constant.numeric.integer.octal.python
- captures:
- 1: punctuation.definition.numeric.octal.python
- - match: \b(?i)(0o)(_?[0-7])+
- scope: constant.numeric.integer.octal.python
- captures:
- 1: punctuation.definition.numeric.octal.python
- # binary
- - match: \b(?i)(0b)[01]*(L) # py2
- scope: constant.numeric.integer.long.binary.python
- captures:
- 1: punctuation.definition.numeric.binary.python
- 2: storage.type.numeric.long.python
- - match: \b(?i)(0b)(_?[01])*
- scope: constant.numeric.integer.binary.python
- captures:
- 1: punctuation.definition.numeric.binary.python
- # complex
- - match: (?i){{digitpart}}?(\.){{digitpart}}(?:e[\-\+]?{{digitpart}})?(j) # mandatory fraction
- scope: constant.numeric.complex.python
- captures:
- 1: punctuation.separator.decimal.python
- 2: storage.type.numeric.complex.python
- - match: \b(?i)(?:{{digitpart}}(?:(\.){{digitpart}}?)?|(\.){{digitpart}})(?:e[\-\+]?{{digitpart}})(j) # mandatory exponent
- scope: constant.numeric.complex.python
- captures:
- 1: punctuation.separator.decimal.python
- 2: punctuation.separator.decimal.python
- 3: storage.type.numeric.complex.python
- - match: (?i){{digitpart}}(\.)?(j) # mandatory digitpart
- scope: constant.numeric.complex.python
- captures:
- 1: punctuation.separator.decimal.python
- 2: storage.type.numeric.complex.python
- # floating point
- - match: (?i){{digitpart}}?(\.){{digitpart}}(?:e[\-\+]?{{digitpart}})? # mandatory fraction
- scope: constant.numeric.float.python
- captures:
- 1: punctuation.separator.decimal.python
- - match: \b(?i)(?:{{digitpart}}(?:(\.){{digitpart}}?)?|(\.){{digitpart}})(?:e[\-\+]?{{digitpart}}) # mandatory exponent
- scope: constant.numeric.float.python
- captures:
- 1: punctuation.separator.decimal.python
- 2: punctuation.separator.decimal.python
- - match: (?i){{digitpart}}(\.) # mandatory digitpart
- scope: constant.numeric.float.python
- captures:
- 1: punctuation.separator.decimal.python
- # integer
- - match: \b(?i)(?:[1-9]\d*|0)(L)\b # py2
- scope: constant.numeric.integer.long.decimal.python
- captures:
- 1: storage.type.numeric.long.python
- - match: \b(?i)([1-9][\d_]*|0)\b
- scope: constant.numeric.integer.decimal.python
-
- modifiers:
- - match: \b(?:(global)|(nonlocal))\b
- captures:
- 1: storage.modifier.global.python
- 2: storage.modifier.nonlocal.python
- push:
- - include: line-continuation-or-pop
- - match: ','
- scope: punctuation.separator.storage-list.python
- - include: name
- - match: \S+
- scope: invalid.illegal.name.storage.python
-
- yields:
- - match: \b(yield)(?:\s+(from))?\b
- captures:
- 1: keyword.control.flow.yield.python
- 2: keyword.control.flow.yield-from.python
-
- assignments:
- - match: \+=|-=|\*=|/=|//=|%=|@=|&=|\|=|\^=|>>=|<<=|\*\*=
- scope: keyword.operator.assignment.augmented.python
- - match: '=(?!=)'
- scope: keyword.operator.assignment.python
-
- operators:
- - match: <>
- scope: invalid.deprecated.operator.python
- - match: <\=|>\=|\=\=|<|>|\!\=
- scope: keyword.operator.comparison.python
- - match: \+|\-|\*|\*\*|/|//|%|<<|>>|&|\||\^|~
- scope: keyword.operator.arithmetic.python
- - match: \b(and|in|is|not|or)\b
- comment: keyword operators that evaluate to True or False
- scope: keyword.operator.logical.python
- - match: '@'
- scope: keyword.operator.matrix.python
-
- allow-unpack-operators:
- # Match unpacking operators, if present
- - include: comments
- - match: \*{3,}
- scope: invalid.illegal.syntax.python
- pop: true
- - match: \*\*
- scope: keyword.operator.unpacking.mapping.python
- pop: true
- - match: \*
- scope: keyword.operator.unpacking.sequence.python
- pop: true
- - match: (?=\S)
- pop: true
-
- classes:
- - match: '^\s*(class)\b'
- captures:
- 1: storage.type.class.python
- push:
- - meta_scope: meta.class.python
- - include: line-continuation-or-pop
- - match: ':'
- scope: punctuation.section.class.begin.python
- pop: true
- - match: "(?={{identifier}})"
- push:
- - meta_content_scope: entity.name.class.python
- - include: entity-name-class
- - match: ''
- pop: true
- - match: \(
- scope: punctuation.section.inheritance.begin.python
- set:
- - meta_scope: meta.class.inheritance.python
- - match: \)
- scope: punctuation.section.inheritance.end.python
- set:
- - include: line-continuation-or-pop
- - match: ':'
- scope: meta.class.python punctuation.section.class.begin.python
- pop: true
- - match: (?=\S)
- pop: true
- - match: ':'
- scope: invalid.illegal.no-closing-parens.python
- pop: true
- - match: ','
- scope: punctuation.separator.inheritance.python
- - include: illegal-names-pop
- - match: ({{identifier}}) *(=)
- captures:
- 1: variable.parameter.class-inheritance.python
- 2: keyword.operator.assignment.python
- - match: (?={{path}})
- push:
- - meta_scope: entity.other.inherited-class.python
- - match: '{{identifier}}(?: *(\.) *)?'
- captures:
- 1: punctuation.accessor.dot.python
- - match: ''
- pop: true
- - include: expressions
-
- functions:
- - match: '^\s*(?:(async)\s+)?(def)\b'
- captures:
- 1: storage.modifier.async.python
- 2: storage.type.function.python
- push:
- - meta_scope: meta.function.python
- - include: line-continuation-or-pop
- - match: ':'
- scope: punctuation.section.function.begin.python
- pop: true
- - match: "(?={{identifier}})"
- push:
- - meta_content_scope: entity.name.function.python
- - include: entity-name-function
- - match: ''
- pop: true
- - match: '(?=\()'
- set:
- - match: \(
- scope: meta.function.parameters.python punctuation.section.parameters.begin.python
- set: [function-parameters, allow-unpack-operators]
-
- function-parameters:
- - meta_content_scope: meta.function.parameters.python
- - match: \)
- scope: punctuation.section.parameters.end.python
- set: function-after-parameters
- - include: comments
- - match: ','
- scope: punctuation.separator.parameters.python
- push: allow-unpack-operators
- - match: '(?==)'
- set:
- - match: '='
- scope: keyword.operator.assignment.python
- set:
- - meta_scope: meta.function.parameters.default-value.python
- - match: '(?=[,)])'
- set: [function-parameters, allow-unpack-operators]
- - include: expressions
- - match: '(?=:)'
- set:
- - match: ':'
- scope: punctuation.separator.annotation.parameter.python
- set:
- - meta_scope: meta.function.parameters.annotation.python
- - match: '(?=[,)=])'
- set: function-parameters
- - include: expressions
- - include: function-parameters-tuple
- - include: illegal-names
- - match: '{{identifier}}'
- scope: variable.parameter.python
- - include: line-continuation
-
- function-parameters-tuple:
- # python 2 style tuple arguments
- # removed from python 3 since PEP-3113
- - match: \(
- scope: punctuation.section.group.begin.python
- push:
- - meta_scope: meta.group.python
- - match: \)
- scope: punctuation.section.group.end.python
- set: after-expression
- - include: comments
- - match: ','
- scope: punctuation.separator.parameters.python
- push: allow-unpack-operators
- # default values should follow the argument
- - match: '='
- push:
- - meta_scope: invalid.illegal.default-value.python
- - match: '(?=[,)=])'
- pop: true
- # python 2 does not support type annotations
- - match: '(?=:)'
- push:
- - meta_scope: invalid.illegal.annotation.python
- - match: '(?=[,)=])'
- pop: true
- - include: illegal-names
- - match: '{{identifier}}'
- scope: variable.parameter.python
- - include: line-continuation
-
- function-after-parameters:
- - meta_content_scope: meta.function.python
- - match: '(?=->)'
- set:
- - meta_content_scope: meta.function.annotation.return.python
- - match: ->
- scope: punctuation.separator.annotation.return.python
- - match: '(?=:)'
- set: function-after-parameters
- - include: line-continuation-or-pop
- - include: expressions
- - match: ':'
- scope: meta.function.python punctuation.section.function.begin.python
- pop: true
- - include: comments
- - match: (?=\S)
- pop: true
-
- decorators:
- - match: ^\s*(?=@)
- push:
- # Due to line continuations, we don't know whether this is a "function call" yet
- - meta_content_scope: meta.annotation.python
- - match: '@'
- scope: punctuation.definition.annotation.python
- - match: $
- pop: true
- - include: line-continuation-or-pop
- - match: (?=\.?\s*{{path}}\s*\() # now we do
- set: [decorator-function-call-wrapper, qualified-name-until-leaf]
- - match: (?=\.?\s*{{path}})
- push: [decorator-wrapper, qualified-name-until-leaf]
- - match: \S
- scope: invalid.illegal.character.python
- pop: true
-
- decorator-wrapper:
- - match: (\.)\s*
- captures:
- 1: punctuation.accessor.dot.python
- set:
- - meta_scope: meta.qualified-name.python
- - meta_content_scope: variable.annotation.python
- - include: dotted-name-specials
- - include: generic-names
- - match: ''
- pop: true
- - match: ''
- set:
- - meta_scope: meta.qualified-name.python variable.annotation.python
- - include: name-specials
- - include: generic-names
- - match: ''
- pop: true
-
- decorator-function-call-wrapper:
- - meta_scope: meta.annotation.function.python
- - match: \)
- scope: punctuation.section.arguments.end.python
- set: after-expression
- - match: \(
- scope: meta.annotation.function.python punctuation.section.arguments.begin.python
- push:
- - clear_scopes: 1
- - meta_content_scope: meta.annotation.arguments.python
- - match: (?=\))
- pop: true
- - include: arguments
- - match: (\.)\s*
- captures:
- 1: punctuation.accessor.dot.python
- push:
- - meta_scope: meta.qualified-name.python
- - meta_content_scope: variable.annotation.function.python
- - include: dotted-name-specials
- - include: generic-names
- - match: ''
- pop: true
- - match: ''
- push:
- - meta_scope: meta.qualified-name.python variable.annotation.function.python
- - include: name-specials
- - include: generic-names
- - match: ''
- pop: true
-
- item-access:
- - match: '(?={{path}}\s*\[)'
- push:
- - match: \]
- scope: meta.item-access.python punctuation.section.brackets.end.python
- set: after-expression
- - match: '(?={{path}}\s*\[)'
- push:
- - meta_content_scope: meta.item-access.python
- - match: '(?=\s*\[)'
- pop: true
- - include: qualified-name
- - match: \[
- scope: meta.item-access.python punctuation.section.brackets.begin.python
- push:
- - meta_content_scope: meta.item-access.arguments.python
- - match: '(?=\])'
- pop: true
- - match: ':'
- scope: punctuation.separator.slice.python
- - include: expressions
-
- function-calls:
- - match: '(?=(\.\s*)?{{path}}\s*\()'
- push: [function-call-wrapper, qualified-name-until-leaf]
-
- function-call-wrapper:
- - meta_scope: meta.function-call.python
- - match: (?=\() # need to remove meta.function-call.python from opening parens
- set:
- - match: \(
- scope: punctuation.section.arguments.begin.python
- set:
- - meta_scope: meta.function-call.arguments.python
- - match: \)
- scope: punctuation.section.arguments.end.python
- set: after-expression
- - include: arguments
- - match: (\.)\s*(?={{identifier}})
- captures:
- 1: punctuation.accessor.dot.python
- push:
- - meta_scope: meta.qualified-name.python
- - meta_content_scope: variable.function.python
- - include: dotted-name-specials
- - include: generic-names
- - match: ''
- pop: true
- - match: (?={{identifier}})
- push:
- - meta_scope: meta.qualified-name.python variable.function.python
- - include: name-specials
- - include: generic-names
- - match: ''
- pop: true
-
- arguments:
- - include: keyword-arguments
- - match: ','
- scope: punctuation.separator.arguments.python
- push: allow-unpack-operators
- - include: inline-for
- - include: expressions
-
- keyword-arguments:
- - match: '(?={{identifier}}\s*=(?!=))'
- push:
- - include: line-continuation-or-pop
- - match: '='
- scope: keyword.operator.assignment.python
- set:
- - match: (?=\s*[,):])
- pop: true
- - include: expressions
- - include: illegal-names
- - match: '{{identifier}}'
- scope: variable.parameter.python
-
- lambda:
- - match: \b(lambda)(?=\s|:|$)
- scope: storage.type.function.inline.python
- push: [lambda-parameters, allow-unpack-operators]
-
- lambda-parameters:
- - meta_scope: meta.function.inline.python
- - meta_content_scope: meta.function.inline.parameters.python
- - include: line-continuation-or-pop
- - match: '\:'
- scope: punctuation.section.function.begin.python
- pop: true
- - match: ','
- scope: punctuation.separator.parameters.python
- push: allow-unpack-operators
- - include: keyword-arguments
- - include: function-parameters-tuple
- - include: illegal-names
- - match: '{{identifier}}'
- scope: variable.parameter.python
- - match: '\S'
- scope: invalid.illegal.expected-parameter.python
-
- groups:
- - match: \(
- scope: punctuation.section.group.begin.python
- push:
- - meta_scope: meta.group.python
- - match: \)
- scope: punctuation.section.group.end.python
- set: after-expression
- - match: ','
- scope: punctuation.separator.tuple.python
- - include: inline-for
- - include: expressions
-
- tuples:
- # We don't know for certain, whether a parenthesized expression is a tuple,
- # so try looking ahead.
- - match: (\()\s*(\))
- scope: meta.sequence.tuple.empty.python
- captures:
- 1: punctuation.section.sequence.begin.python
- 2: punctuation.section.sequence.end.python
- push: after-expression
- - match: \((?={{simple_expression}},|\s*\*{{path}})
- scope: punctuation.section.sequence.begin.python
- push: inside-tuple
- # TODO generator
- # - match: \((?:{{simple_expression}}for)
-
- inside-tuple:
- - meta_scope: meta.sequence.tuple.python
- - match: \)
- scope: punctuation.section.sequence.end.python
- set: after-expression
- - match: ','
- scope: punctuation.separator.sequence.python
- push: allow-unpack-operators
- - include: inline-for
- - include: expressions
-
- lists:
- - match: (\[)\s*(\])
- scope: meta.sequence.list.empty.python
- captures:
- 1: punctuation.section.sequence.begin.python
- 2: punctuation.section.sequence.end.python
- push: after-expression
- - match: \[
- scope: punctuation.section.sequence.begin.python
- push: [inside-list, allow-unpack-operators]
-
- inside-list:
- - meta_scope: meta.sequence.list.python
- - match: \]
- scope: punctuation.section.sequence.end.python
- set: after-expression
- - match: ','
- scope: punctuation.separator.sequence.python
- push: allow-unpack-operators
- - include: inline-for
- - include: expressions
-
- dictionaries-and-sets:
- # Dictionaries and set literals use the same punctuation,
- # so we try looking ahead to determine whether we have a dict or a set.
- - match: '(\{)\s*(\})'
- scope: meta.mapping.empty.python
- captures:
- 1: punctuation.section.mapping.begin.python
- 2: punctuation.section.mapping.end.python
- push: after-expression
- - match: \{(?={{simple_expression}}:|\s*\*\*{{path}})
- scope: punctuation.section.mapping.begin.python
- push: inside-dictionary
- - match: \{(?={{simple_expression}}[,}]|\s*\*{{path}})
- scope: punctuation.section.set.begin.python
- push: inside-set
- # If the expression is "more complex" or on the next line,
- # fall back to default and determine later.
- - match: \{
- scope: punctuation.section.mapping-or-set.begin.python
- push:
- - meta_scope: meta.mapping-or-set.python
- - match: \}
- scope: punctuation.section.mapping-or-set.end.python
- set: after-expression
- - match: (?={{simple_expression}}:|\s*\*\*{{path}})
- set: inside-dictionary
- - match: (?={{simple_expression}}[,}]|\s*\*{{path}})
- set: inside-set
- - match: ','
- scope: punctuation.separator.set.python
- set: inside-set
- - match: ':'
- scope: punctuation.separator.mapping.key-value.python
- set: inside-directory-value
- - include: inline-for
- - include: expressions
-
- inside-dictionary:
- - meta_scope: meta.mapping.python
- - match: \}
- scope: punctuation.section.mapping.end.python
- set: after-expression
- - match: ':'
- scope: punctuation.separator.mapping.key-value.python
- set: inside-directory-value
- - match: ','
- scope: invalid.illegal.expected-colon.python
- - match: \*\*
- scope: keyword.operator.unpacking.mapping.python
- push:
- - match: (?=\})
- pop: true
- - match: ','
- scope: punctuation.separator.mapping.python
- pop: true
- - include: expressions
- - include: comments
- - match: (?=\S)
- push:
- - clear_scopes: 1
- - meta_scope: meta.mapping.key.python
- - match: \s*(?=\}|,|:)
- pop: true
- - include: expressions
-
- inside-directory-value:
- - meta_content_scope: meta.mapping.python
- - match: \}
- scope: punctuation.section.mapping.end.python
- set: after-expression
- - match: (?=,)
- set:
- # clear meta scope from this match, because 'inside-directory' has it in meta_scope
- - match: ','
- scope: punctuation.separator.mapping.python
- set: inside-dictionary
- - match: (?=for)
- push:
- - match: (?=\})
- pop: true
- - match: ','
- scope: invalid.illegal.unexpected-comma.python
- - include: inline-for
- - include: expressions
- - include: comments
- - match: (?=\S)
- push:
- - clear_scopes: 1
- - meta_content_scope: meta.mapping.value.python
- - match: (?=\s*(\}|,|for))
- pop: true
- - include: expressions
-
- inside-set:
- - meta_scope: meta.set.python
- - match: \}
- scope: punctuation.section.set.end.python
- set: after-expression
- - match: ':'
- scope: invalid.illegal.colon-inside-set.python
- - match: ','
- scope: punctuation.separator.set.python
- - match: \*
- scope: keyword.operator.unpacking.sequence.python
- push:
- - match: (?=\})
- pop: true
- - match: ','
- scope: punctuation.separator.set.python
- pop: true
- - include: expressions
- - include: inline-for
- - include: expressions
-
- builtin-exceptions:
- - match: |-
- (?x)\b(
- (
- Arithmetic|Assertion|Attribute|BlockingIO|BrokenPipe|Buffer|ChildProcess|
- Connection(Aborted|Refused|Reset)?|EOF|Environment|FileExists|
- FileNotFound|FloatingPoint|Interrupted|IO|IsADirectoryError|
- Import|Indentation|Index|Key|Lookup|Memory|Name|NotADirectory|
- NotImplemented|OS|Overflow|Permission|ProcessLookup|Reference|
- Runtime|Standard|Syntax|System|Tab|Timeout|Type|UnboundLocal|
- Unicode(Encode|Decode|Translate)?|Value|VMS|Windows|ZeroDivision
- )Error|
- ((Pending)?Deprecation|Runtime|Syntax|User|Future|Import|Unicode|Bytes)?Warning|
- (Base)?Exception|
- SystemExit|StopIteration|NotImplemented|KeyboardInterrupt|GeneratorExit
- )\b
- scope: support.type.exception.python
-
- builtin-functions:
- - match: |-
- (?x)\b(
- __import__|all|abs|any|apply|ascii|bin|breakpoint|callable|chr|classmethod|cmp|coerce|
- compile|delattr|dir|divmod|enumerate|eval|exec|execfile|filter|format|getattr|
- globals|hasattr|hash|help|hex|id|input|intern|isinstance|issubclass|iter|
- len|locals|map|max|min|next|oct|open|ord|pow|print|property|range|
- raw_input|reduce|reload|repr|reversed|round|setattr|sorted|staticmethod|
- sum|super|type|unichr|vars|zip
- )\b
- scope: support.function.builtin.python
-
- builtin-types:
- - match: |-
- (?x)\b(
- basestring|bool|buffer|bytearray|bytes|complex|dict|float|frozenset|int|
- list|long|memoryview|object|range|set|slice|str|tuple|unicode|xrange
- )\b
- scope: support.type.python
-
- name:
- - match: '(?={{identifier}})'
- push:
- - include: name-specials
- - match: '{{identifier_constant}}'
- scope: variable.other.constant.python
- - include: generic-names
- - match: ''
- pop: true
-
- dotted-name:
- - match: '\s*(\.)\s*(?={{identifier}})'
- captures:
- 1: punctuation.accessor.dot.python
- push:
- - include: dotted-name-specials
- - match: '{{identifier_constant}}'
- scope: variable.other.constant.python
- - include: generic-names
- - match: ''
- pop: true
-
- qualified-name:
- - match: '(?={{path}})'
- push:
- - meta_scope: meta.qualified-name.python
- - include: name
- - include: dotted-name
- - match: ''
- pop: true
-
- qualified-name-until-leaf:
- # Push this together with another context to match a qualified name
- # until the last non-special identifier (if any).
- # This allows the leaf to be scoped individually.
- - meta_scope: meta.qualified-name.python
- # If a line continuation follows, this may or may not be the last leaf (most likley not though)
- - match: (?={{identifier}}\s*(\.|\\))
- push:
- - include: name-specials
- - include: generic-names
- - match: ''
- pop: true
- - match: (\.)\s*(?={{identifier}}\s*(\.|\\))
- captures:
- 1: punctuation.accessor.dot.python
- push:
- - include: dotted-name-specials
- - include: generic-names
- - match: ''
- pop: true
- - match: \.(?!\s*{{identifier}}) # don't match last dot
- scope: punctuation.accessor.dot.python
- - match: (?=\S|$)
- pop: true
-
- name-specials:
- - include: builtin-functions
- - include: builtin-types
- - include: builtin-exceptions
- - include: illegal-names
- - include: magic-function-names
- - include: magic-variable-names
- - include: language-variables
-
- dotted-name-specials:
- - include: magic-function-names
- - include: magic-variable-names
- - include: illegal-names
-
- entity-name-class:
- - include: illegal-names
- - include: generic-names
-
- entity-name-function:
- - include: magic-function-names
- - include: illegal-names
- - include: generic-names
-
- generic-names:
- - match: '{{identifier}}'
- scope: meta.generic-name.python
-
- illegal-names:
- - match: \b{{illegal_names}}\b
- scope: invalid.illegal.name.python
-
- illegal-names-pop:
- - match: \b{{illegal_names}}\b
- scope: invalid.illegal.name.python
- pop: true
-
- language-variables:
- - match: \b(self|cls)\b
- scope: variable.language.python
- - match: _(?!{{identifier_continue}})
- scope: variable.language.python
-
- line-continuation:
- - match: (\\)(.*)$\n?
- captures:
- 1: punctuation.separator.continuation.line.python
- 2: invalid.illegal.unexpected-text.python
- # make sure to resume parsing at next line
- push:
- # This prevents strings after a continuation from being a docstring
- - include: strings
- - match: (?=\S|^\s*$|\n) # '\n' for when we matched a string earlier
- pop: true
-
- line-continuation-or-pop:
- - include: line-continuation
- - match: (?=\s*($|;|#))
- pop: true
-
- magic-function-names:
- # https://docs.python.org/2/reference/datamodel.html
- # https://docs.python.org/3/reference/datamodel.html
- - match: |-
- (?x)\b__(?:
- # unary operators
- invert|neg|pos|abs|
- # binary operators
- add|and|div|divmod|floordiv|lshift|mod|mul|or|pow|rshift|sub|truediv|xor|
- contains|
- # right-hand binary operators
- radd|rand|rdiv|rdivmod|rfloordiv|rlshift|rmod|rmul|ror|rpow|rrshift|rsub|rtruediv|rxor|
- # in-place operator assignments
- iadd|iand|idiv|ifloordiv|ilshift|imod|imul|ior|ipow|irshift|isub|itruediv|ixor|
- # comparisons
- eq|ge|gt|le|lt|ne|
- cmp|rcmp| # py2
- # primary coercion
- bool|str|
- nonzero|unicode| # py2
- # number coercion (converts something to a number)
- bytes|complex|float|index|int|round|
- long| # py2
- # other "coercion"
- format|len|length_hint|hash|repr|reversed|
- coerce|hex|oct| # py2
- fspath|
- # iterator (and 'await')
- iter|next|
- aiter|anext|
- await|
- # attribute and item access
- delattr|delitem|delslice|
- getattr|getattribute|getitem|getslice|
- setattr|setitem|setslice|
- dir|missing|
- # context manager
- enter|exit|
- aenter|aexit|
- # other class magic
- call|del|init|new|init_subclass|
- instancecheck|subclasscheck|
- # pickling
- getnewargs|getnewargs_ex|getstate|setstate|reduce|reduce_ex|
- # descriptors
- delete|get|set|set_name|
- # class-specific
- subclasses|
- # dataclasses (PEP 557)
- post_init|
- # for typing core support (PEP 560)
- class_getitem|mro_entries
- )__\b
- comment: these methods have magic interpretation by python and are generally called indirectly through syntactic constructs
- scope: support.function.magic.python
-
- magic-variable-names:
- # magic variables which a class/module/object may have.
- # https://docs.python.org/3/library/inspect.html#types-and-members
- # https://docs.python.org/3/reference/datamodel.html#object.__slots__
- # https://docs.python.org/3/reference/datamodel.html#preparing-the-class-namespace
- - match: |-
- (?x)\b__(?:
- # generic object
- class|dict|doc|module|name|
- # module-specific / global
- all|file|package|
- # functions & methods
- annotations|closure|code|defaults|func|globals|kwdefaults|self|qualname|
- # classes (attributes)
- bases|prepare|slots|metaclass|mro|
- # Python 2
- members|methods
- )__\b
- scope: support.variable.magic.python
-
- docstrings:
- - match: ^\s*(?=(?i)(ur|ru|u|r)?("""|'''))
- push:
- - match: (?i)(u)?("""|''')
- captures:
- 1: storage.type.string.python
- 2: punctuation.definition.comment.begin.python
- set:
- - meta_scope: comment.block.documentation.python
- - include: escaped-unicode-char
- - include: escaped-char
- - match: '\2'
- scope: punctuation.definition.comment.end.python
- pop: true
- - match: (?i)(u?ru?)("""|''')
- captures:
- 1: storage.type.string.python
- 2: punctuation.definition.comment.begin.python
- set:
- - meta_scope: comment.block.documentation.python
- - match: '\2'
- scope: punctuation.definition.comment.end.python
- pop: true
-
- escaped-char:
- - match: '(\\x\h{2})|(\\[0-7]{3})|(\\[\\"''abfnrtv])'
- captures:
- 1: constant.character.escape.hex.python
- 2: constant.character.escape.octal.python
- 3: constant.character.escape.python
- - match: \\. # deprecated in 3.6 and will eventually be a syntax error
- scope: invalid.deprecated.character.escape.python
-
- escaped-unicode-char:
- - match: '(\\U\h{8})|(\\u\h{4})|(\\N\{[a-zA-Z ]+\})'
- captures:
- 1: constant.character.escape.unicode.16-bit-hex.python
- 2: constant.character.escape.unicode.32-bit-hex.python
- 3: constant.character.escape.unicode.name.python
-
- line-continuation-inside-string:
- - match: (\\)$\n?
- captures:
- 1: punctuation.separator.continuation.line.python
- - match: \n
- scope: invalid.illegal.unclosed-string.python
- set: after-expression
-
- constant-placeholder:
- - match: |- # printf style
- (?x)
- %
- ( \( ({{identifier}}) \) )? # mapping key
- \#? # alternate form
- 0? # pad with zeros
- \-? # left-adjust
- \ ? # implicit sign
- [+-]? # sign
- (\d*|\*) # width
- (\. (\d*|\*))? # precision
- [hlL]? # length modifier (but ignored)
- [acdeEfFgGiorsuxX%]
- scope: constant.other.placeholder.python
- captures:
- 2: variable.other.placeholder.python
- - match: '{{strftime_spec}}'
- scope: constant.other.placeholder.python
- - match: '\{\{|\}\}'
- scope: constant.character.escape.python
- - include: formatting-syntax
-
- formatting-syntax:
- # https://docs.python.org/3.6/library/string.html#formatstrings
- - match: |- # simple form
- (?x)
- (\{)
- (?: [\w.\[\]]+)? # field_name
- ( ! [ars])? # conversion
- ( : (?:{{format_spec}}| # format_spec OR
- [^}%]*%.[^}]*) # any format-like string
- )?
- (\})
- scope: constant.other.placeholder.python
- captures:
- 1: punctuation.definition.placeholder.begin.python
- 2: storage.modifier.conversion.python
- 3: constant.other.format-spec.python
- 4: punctuation.definition.placeholder.end.python
- - match: \{(?=[^\}"']+\{[^"']*\}) # complex (nested) form
- scope: punctuation.definition.placeholder.begin.python
- push:
- - meta_scope: constant.other.placeholder.python
- - match: \}
- scope: punctuation.definition.placeholder.end.python
- pop: true
- - match: '[\w.\[\]]+'
- - match: '![ars]'
- scope: storage.modifier.conversion.python
- - match: ':'
- push:
- - meta_scope: meta.format-spec.python constant.other.format-spec.python
- - match: (?=\})
- pop: true
- - include: formatting-syntax
-
- f-string-content:
- # https://www.python.org/dev/peps/pep-0498/
- # https://docs.python.org/3.6/reference/lexical_analysis.html#f-strings
- - match: \{\{|\}\}
- scope: constant.character.escape.python
- - match: \{\s*\}
- scope: invalid.illegal.empty-expression.python
- - match: (?=\{)
- push: f-string-replacement
- - match: \}
- scope: invalid.illegal.stray-brace.python
-
- f-string-content-reset:
- # Same as f-string-content, but will reset the entire scope stack
- - match: \{\{|\}\}
- scope: constant.character.escape.python
- - match: \{\s*\}
- scope: invalid.illegal.empty-expression.python
- - match: (?=\{)
- push: f-string-replacement-reset
- - match: \}
- scope: invalid.illegal.stray-brace.python
-
- f-string-replacement:
- - clear_scopes: 1
- - match: \}
- scope: meta.interpolation.python punctuation.section.interpolation.end.python
- pop: true
- - match: \{
- scope: punctuation.section.interpolation.begin.python
- push:
- - meta_scope: meta.interpolation.python
- - match: (?=\})
- pop: true
- - match: '![ars]'
- scope: storage.modifier.conversion.python
- - match: ':'
- push:
- - meta_scope: meta.format-spec.python constant.other.format-spec.python
- # Because replacements can also be used *within* the format-spec,
- # basically any character is valid and matching {{format_spec}} is useless.
- # - match: '{{format_spec}}'
- - match: (?=\})
- pop: true
- - include: f-string-content
- - match: ''
- push:
- - meta_content_scope: source.python.embedded
- - match: (?=![^=]|:|\})
- pop: true
- - match: \\
- scope: invalid.illegal.backslash-in-fstring.python
- - include: inline-for
- - include: expressions
-
- f-string-replacement-reset:
- # Same as f-string-replacement, but with clear_scopes: true
- - clear_scopes: true
- - meta_scope: source.python meta.string.interpolated.python
- - match: \}
- scope: meta.interpolation.python punctuation.section.interpolation.end.python
- pop: true
- - match: \{
- scope: punctuation.section.interpolation.begin.python
- push:
- - meta_scope: meta.interpolation.python
- - match: (?=\})
- pop: true
- - match: '![ars]'
- scope: storage.modifier.conversion.python
- - match: ':'
- push:
- - meta_scope: meta.format-spec.python constant.other.format-spec.python
- - match: (?=\})
- pop: true
- - include: f-string-content
- - match: ''
- push:
- - meta_content_scope: source.python.embedded
- - match: (?=![^=]|:|\})
- pop: true
- - match: \\
- scope: invalid.illegal.backslash-in-fstring.python
- - include: inline-for
- - include: expressions
-
- string-quoted-double-block:
- # Triple-quoted capital R raw string, unicode or not, no syntax embedding
- - match: '([uU]?R)(""")'
- captures:
- 1: storage.type.string.python
- 2: meta.string.python string.quoted.double.block.python punctuation.definition.string.begin.python
- push:
- - meta_content_scope: meta.string.python string.quoted.double.block.python
- - match: '"""'
- scope: punctuation.definition.string.end.python
- set: after-expression
- - include: escaped-unicode-char
- # Triple-quoted capital R raw string, bytes, no syntax embedding
- - match: '([bB]R|R[bB])(""")'
- captures:
- 1: storage.type.string.python
- 2: meta.string.python string.quoted.double.block.python punctuation.definition.string.begin.python
- push:
- - meta_content_scope: meta.string.python string.quoted.double.block.python
- - match: '"""'
- scope: punctuation.definition.string.end.python
- set: after-expression
- # Triple-quoted raw string, unicode or not, will detect SQL, otherwise regex
- - match: '([uU]?r)(""")'
- captures:
- 1: storage.type.string.python
- 2: meta.string.python string.quoted.double.block.python punctuation.definition.string.begin.python
- push:
- - meta_content_scope: meta.string.python string.quoted.double.block.python
- - match: '(?={{sql_indicator}})'
- set:
- - meta_scope: meta.string.python string.quoted.double.block.python
- - match: '"""'
- scope: punctuation.definition.string.end.python
- set: after-expression
- - match: ''
- push: scope:source.sql
- with_prototype:
- - match: '(?=""")'
- pop: true
- - include: escaped-unicode-char
- - include: constant-placeholder
- - match: '(?=\S)'
- set:
- - meta_scope: meta.string.python string.quoted.double.block.python
- - match: '"""'
- scope: punctuation.definition.string.end.python
- set: after-expression
- - match: ''
- push: scope:source.regexp.python
- with_prototype:
- - match: '(?=""")'
- pop: true
- - include: escaped-unicode-char
- # Triple-quoted raw string, bytes, will use regex
- - match: '([bB]r|r[bB])(""")'
- captures:
- 1: storage.type.string.python
- 2: meta.string.python string.quoted.double.block.python punctuation.definition.string.begin.python
- push:
- - meta_content_scope: meta.string.python string.quoted.double.block.python
- - match: '"""'
- scope: punctuation.definition.string.end.python
- set: after-expression
- - match: ''
- embed: scope:source.regexp.python
- escape: (?=""")
- # Triple-quoted raw f-string
- - match: ([fF]R|R[fF])(""")
- captures:
- 1: storage.type.string.python
- 2: meta.string.interpolated.python string.quoted.double.block.python punctuation.definition.string.begin.python
- push:
- - meta_content_scope: meta.string.interpolated.python string.quoted.double.block.python
- - match: '"""'
- scope: punctuation.definition.string.begin.python
- set: after-expression
- - include: f-string-content
- # Triple-quoted raw f-string, treated as regex
- - match: ([fF]r|r[fF])(""")
- captures:
- 1: storage.type.string.python
- 2: meta.string.interpolated.python string.quoted.double.block.python punctuation.definition.string.begin.python
- push:
- - meta_content_scope: meta.string.interpolated.python string.quoted.double.block.python
- - match: '"""'
- scope: punctuation.definition.string.begin.python
- set: after-expression
- - match: ''
- push: scope:source.regexp.python
- with_prototype:
- - match: '(?=""")'
- pop: true
- - include: line-continuation-inside-string
- - include: f-string-content-reset
- # Triple-quoted f-string
- - match: ((?i)f|f)(""")
- captures:
- 1: storage.type.string.python
- 2: meta.string.interpolated.python string.quoted.double.block.python punctuation.definition.string.begin.python
- push:
- - meta_content_scope: meta.string.interpolated.python string.quoted.double.block.python
- - match: '"""'
- scope: punctuation.definition.string.begin.python
- set: after-expression
- - include: escaped-unicode-char
- - include: escaped-char
- - include: f-string-content
- # Triple-quoted string, unicode or not, will detect SQL
- - match: '([uU]?)(""")'
- captures:
- 1: storage.type.string.python
- 2: meta.string.python string.quoted.double.block.python punctuation.definition.string.begin.python
- push:
- - meta_content_scope: meta.string.python string.quoted.double.block.python
- - match: '(?={{sql_indicator}})'
- set:
- - meta_scope: meta.string.python string.quoted.double.block.python
- - match: '"""'
- scope: punctuation.definition.string.end.python
- set: after-expression
- - match: ''
- push: scope:source.sql
- with_prototype:
- - match: '(?=""")'
- pop: true
- - include: escaped-unicode-char
- - include: escaped-char
- - include: constant-placeholder
- - match: '(?=\S)'
- set:
- - meta_scope: meta.string.python string.quoted.double.block.python
- - match: '"""'
- scope: punctuation.definition.string.end.python
- set: after-expression
- - include: escaped-unicode-char
- - include: escaped-char
- - include: constant-placeholder
- # Triple-quoted string, bytes, no syntax embedding
- - match: '([bB])(""")'
- captures:
- 1: storage.type.string.python
- 2: meta.string.python string.quoted.double.block.python punctuation.definition.string.begin.python
- push:
- - meta_content_scope: meta.string.python string.quoted.double.block.python
- - match: '"""'
- scope: punctuation.definition.string.end.python
- set: after-expression
- - include: escaped-char
- - include: constant-placeholder
-
- string-quoted-double:
- # Single-line capital R raw string, unicode or not, no syntax embedding
- - match: '([uU]?R)(")'
- captures:
- 1: storage.type.string.python
- 2: meta.string.python string.quoted.double.python punctuation.definition.string.begin.python
- push:
- - meta_content_scope: meta.string.python string.quoted.double.python
- - match: '"'
- scope: punctuation.definition.string.end.python
- set: after-expression
- - include: line-continuation-inside-string
- # Single-line capital R raw string, bytes, no syntax embedding
- - match: '([bB]R|R[bB])(")'
- captures:
- 1: storage.type.string.python
- 2: meta.string.python string.quoted.double.python punctuation.definition.string.begin.python
- push:
- - meta_content_scope: meta.string.python string.quoted.double.python
- - match: '"'
- scope: punctuation.definition.string.end.python
- set: after-expression
- - include: line-continuation-inside-string
- # Single-line raw string, unicode or not, starting with a SQL keyword
- - match: '([uU]?r)(")(?={{sql_indicator}})'
- captures:
- 1: storage.type.string.python
- 2: meta.string.python string.quoted.double.python punctuation.definition.string.begin.python
- push:
- - meta_content_scope: meta.string.python string.quoted.double.python
- - match: '"'
- scope: punctuation.definition.string.end.python
- set: after-expression
- - include: line-continuation-inside-string
- - match: ''
- push: scope:source.sql
- with_prototype:
- - match: '(?="|\n)'
- pop: true
- - include: constant-placeholder
- - include: line-continuation-inside-string
- # Single-line raw string, unicode or not, treated as regex
- - match: '([uU]?r)(")'
- captures:
- 1: storage.type.string.python
- 2: meta.string.python string.quoted.double.python punctuation.definition.string.begin.python
- push:
- - meta_content_scope: meta.string.python string.quoted.double.python
- - match: '"'
- scope: punctuation.definition.string.end.python
- set: after-expression
- - include: line-continuation-inside-string
- - match: ''
- push: scope:source.regexp.python
- with_prototype:
- - match: '(?="|\n)'
- pop: true
- - include: line-continuation-inside-string
- # Single-line raw string, bytes, treated as regex
- - match: '([bB]r|r[bB])(")'
- captures:
- 1: storage.type.string.python
- 2: meta.string.python string.quoted.double.python punctuation.definition.string.begin.python
- push:
- - meta_content_scope: meta.string.python string.quoted.double.python
- - match: '"'
- scope: punctuation.definition.string.end.python
- set: after-expression
- - include: line-continuation-inside-string
- - match: ''
- embed: scope:source.regexp.python
- escape: (?="|\n)
- # Single-line raw f-string
- - match: (R[fF]|[fF]R)(")
- captures:
- 1: storage.type.string.python
- 2: meta.string.interpolated.python string.quoted.double.python punctuation.definition.string.begin.python
- push:
- - meta_content_scope: meta.string.interpolated.python string.quoted.double.python
- - match: '"'
- scope: punctuation.definition.string.end.python
- set: after-expression
- - include: line-continuation-inside-string
- - include: f-string-content
- # Single-line raw f-string, treated as regex
- - match: (r[fF]|[fF]r)(")
- captures:
- 1: storage.type.string.python
- 2: meta.string.interpolated.python string.quoted.double.python punctuation.definition.string.begin.python
- push:
- - meta_content_scope: meta.string.interpolated.python string.quoted.double.python
- - match: '"'
- scope: punctuation.definition.string.end.python
- set: after-expression
- - include: line-continuation-inside-string
- - match: ''
- push: scope:source.regexp.python
- with_prototype:
- - match: '(?="|\n)'
- pop: true
- - include: line-continuation-inside-string
- - include: f-string-content-reset
- # Single-line f-string
- - match: ((?i)f|f)(")
- captures:
- 1: storage.type.string.python
- 2: meta.string.interpolated.python string.quoted.double.python punctuation.definition.string.begin.python
- push:
- - meta_content_scope: meta.string.interpolated.python string.quoted.double.python
- - match: '"'
- scope: punctuation.definition.string.end.python
- set: after-expression
- - include: escaped-unicode-char
- - include: escaped-char
- - include: line-continuation-inside-string
- - include: f-string-content
- # Single-line string, unicode or not, starting with a SQL keyword
- - match: '([uU]?)(")(?={{sql_indicator}})'
- captures:
- 1: storage.type.string.python
- 2: meta.string.python string.quoted.double.python punctuation.definition.string.begin.python
- push:
- - meta_content_scope: meta.string.python string.quoted.double.python
- - match: '"'
- scope: punctuation.definition.string.end.python
- set: after-expression
- - include: line-continuation-inside-string
- - match: ''
- push: scope:source.sql
- with_prototype:
- - match: '(?="|\n)'
- pop: true
- - include: escaped-unicode-char
- - include: escaped-char
- - include: line-continuation-inside-string
- - include: constant-placeholder
- # Single-line string, unicode or not
- - match: '([uU]?)(")'
- captures:
- 1: storage.type.string.python
- 2: meta.string.python string.quoted.double.python punctuation.definition.string.begin.python
- push:
- - meta_content_scope: meta.string.python string.quoted.double.python
- - match: '"'
- scope: punctuation.definition.string.end.python
- set: after-expression
- - include: escaped-unicode-char
- - include: escaped-char
- - include: line-continuation-inside-string
- - include: constant-placeholder
- # Single-line string, bytes
- - match: '([bB])(")'
- captures:
- 1: storage.type.string.python
- 2: meta.string.python string.quoted.double.python punctuation.definition.string.begin.python
- push:
- - meta_content_scope: meta.string.python string.quoted.double.python
- - match: '"'
- scope: punctuation.definition.string.end.python
- set: after-expression
- - include: escaped-char
- - include: line-continuation-inside-string
- - include: constant-placeholder
-
- string-quoted-single-block:
- # Triple-quoted capital R raw string, unicode or not, no syntax embedding
- - match: ([uU]?R)(''')
- captures:
- 1: storage.type.string.python
- 2: meta.string.python string.quoted.single.block.python punctuation.definition.string.begin.python
- push:
- - meta_content_scope: meta.string.python string.quoted.single.block.python
- - match: "'''"
- scope: punctuation.definition.string.end.python
- set: after-expression
- # Triple-quoted capital R raw string, bytes, no syntax embedding
- - match: ([bB]R|R[bB])(''')
- captures:
- 1: storage.type.string.python
- 2: meta.string.python string.quoted.single.block.python punctuation.definition.string.begin.python
- push:
- - meta_content_scope: meta.string.python string.quoted.single.block.python
- - match: "'''"
- scope: punctuation.definition.string.end.python
- set: after-expression
- # Triple-quoted raw string, unicode or not, will detect SQL, otherwise regex
- - match: ([uU]?r)(''')
- captures:
- 1: storage.type.string.python
- 2: meta.string.python string.quoted.single.block.python punctuation.definition.string.begin.python
- push:
- - meta_content_scope: meta.string.python string.quoted.single.block.python
- - match: '(?={{sql_indicator}})'
- set:
- - meta_scope: meta.string.python string.quoted.single.block.python
- - match: "'''"
- scope: punctuation.definition.string.end.python
- set: after-expression
- - match: ''
- push: scope:source.sql
- with_prototype:
- - match: (?=''')
- pop: true
- - include: escaped-unicode-char
- - include: escaped-char
- - include: constant-placeholder
- - match: '(?=\S)'
- set:
- - meta_scope: meta.string.python string.quoted.single.block.python
- - match: "'''"
- scope: punctuation.definition.string.end.python
- set: after-expression
- - match: ''
- push: scope:source.regexp.python
- with_prototype:
- - match: (?=''')
- pop: true
- - include: escaped-unicode-char
- # Triple-quoted raw string, bytes, will use regex
- - match: ([bB]r|r[bB])(''')
- captures:
- 1: storage.type.string.python
- 2: meta.string.python string.quoted.single.block.python punctuation.definition.string.begin.python
- push:
- - meta_content_scope: meta.string.python string.quoted.single.block.python
- - match: "'''"
- scope: punctuation.definition.string.end.python
- set: after-expression
- - match: ''
- embed: scope:source.regexp.python
- escape: (?=''')
- # Triple-quoted raw f-string
- - match: ([fF]R|R[fF])(''')
- captures:
- 1: storage.type.string.python
- 2: meta.string.interpolated.python string.quoted.single.block.python punctuation.definition.string.begin.python
- push:
- - meta_content_scope: meta.string.interpolated.python string.quoted.single.block.python
- - match: "'''"
- scope: punctuation.definition.string.begin.python
- set: after-expression
- - include: f-string-content
- # Triple-quoted raw f-string, treated as regex
- - match: ([fF]r|r[fF])(''')
- captures:
- 1: storage.type.string.python
- 2: meta.string.interpolated.python string.quoted.single.block.python punctuation.definition.string.begin.python
- push:
- - meta_content_scope: meta.string.interpolated.python string.quoted.single.block.python
- - match: "'''"
- scope: punctuation.definition.string.begin.python
- set: after-expression
- - match: ''
- push: scope:source.regexp.python
- with_prototype:
- - match: (?=''')
- pop: true
- - include: line-continuation-inside-string
- - include: f-string-content-reset
- # Triple-quoted f-string
- - match: ([fF])(''')
- captures:
- 1: storage.type.string.python
- 2: meta.string.interpolated.python string.quoted.single.block.python punctuation.definition.string.begin.python
- push:
- - meta_content_scope: meta.string.interpolated.python string.quoted.single.block.python
- - match: "'''"
- scope: punctuation.definition.string.begin.python
- set: after-expression
- - include: escaped-unicode-char
- - include: escaped-char
- - include: f-string-content
- # Triple-quoted string, unicode or not, will detect SQL
- - match: ([uU]?)(''')
- captures:
- 1: storage.type.string.python
- 2: meta.string.python string.quoted.single.block.python punctuation.definition.string.begin.python
- push:
- - meta_content_scope: meta.string.python string.quoted.single.block.python
- - match: '(?={{sql_indicator}})'
- set:
- - meta_scope: meta.string.python string.quoted.single.block.python
- - match: "'''"
- scope: punctuation.definition.string.end.python
- set: after-expression
- - match: ''
- push: scope:source.sql
- with_prototype:
- - match: (?=''')
- pop: true
- - include: escaped-unicode-char
- - include: escaped-char
- - include: constant-placeholder
- - match: '(?=\S)'
- set:
- - meta_scope: meta.string.python string.quoted.single.block.python
- - match: "'''"
- scope: punctuation.definition.string.end.python
- set: after-expression
- - include: escaped-unicode-char
- - include: escaped-char
- - include: constant-placeholder
- # Triple-quoted string, bytes, no syntax embedding
- - match: ([bB])(''')
- captures:
- 1: storage.type.string.python
- 2: meta.string.python string.quoted.single.block.python punctuation.definition.string.begin.python
- push:
- - meta_content_scope: meta.string.python string.quoted.single.block.python
- - match: "'''"
- scope: punctuation.definition.string.end.python
- set: after-expression
- - include: escaped-char
- - include: constant-placeholder
-
- string-quoted-single:
- # Single-line capital R raw string, unicode or not, no syntax embedding
- - match: '([uU]?R)('')'
- captures:
- 1: storage.type.string.python
- 2: meta.string.python string.quoted.single.python punctuation.definition.string.begin.python
- push:
- - meta_content_scope: meta.string.python string.quoted.single.python
- - match: "'"
- scope: punctuation.definition.string.end.python
- set: after-expression
- - include: line-continuation-inside-string
- # Single-line capital R raw string, bytes, no syntax embedding
- - match: '([bB]R|R[bB])('')'
- captures:
- 1: storage.type.string.python
- 2: meta.string.python string.quoted.single.python punctuation.definition.string.begin.python
- push:
- - meta_content_scope: meta.string.python string.quoted.single.python
- - match: "'"
- scope: punctuation.definition.string.end.python
- set: after-expression
- - include: line-continuation-inside-string
- # Single-line raw string, unicode or not, starting with a SQL keyword
- - match: '([uU]?r)('')(?={{sql_indicator}})'
- captures:
- 1: storage.type.string.python
- 2: meta.string.python string.quoted.single.python punctuation.definition.string.begin.python
- push:
- - meta_content_scope: meta.string.python string.quoted.single.python
- - match: "'"
- scope: punctuation.definition.string.end.python
- set: after-expression
- - include: line-continuation-inside-string
- - match: ''
- push: scope:source.sql
- with_prototype:
- - match: '(?=''|\n)'
- pop: true
- - include: line-continuation-inside-string
- - include: constant-placeholder
- # Single-line raw string, unicode or not, treated as regex
- - match: '([uU]?r)('')'
- captures:
- 1: storage.type.string.python
- 2: meta.string.python string.quoted.single.python punctuation.definition.string.begin.python
- push:
- - meta_content_scope: meta.string.python string.quoted.single.python
- - match: "'"
- scope: punctuation.definition.string.end.python
- set: after-expression
- - include: line-continuation-inside-string
- - match: ''
- push: scope:source.regexp.python
- with_prototype:
- - match: '(?=''|\n)'
- pop: true
- - include: line-continuation-inside-string
- # Single-line raw string, bytes, treated as regex
- - match: '([bB]r|r[bB])('')'
- captures:
- 1: storage.type.string.python
- 2: meta.string.python string.quoted.single.python punctuation.definition.string.begin.python
- push:
- - meta_content_scope: meta.string.python string.quoted.single.python
- - match: "'"
- scope: punctuation.definition.string.end.python
- set: after-expression
- - include: line-continuation-inside-string
- - match: ''
- push: scope:source.regexp.python
- with_prototype:
- - match: '(?=''|\n)'
- pop: true
- - include: line-continuation-inside-string
- # Single-line raw f-string
- - match: ([fF]R|R[fF])(')
- captures:
- 1: storage.type.string.python
- 2: meta.string.interpolated.python string.quoted.single.python punctuation.definition.string.begin.python
- push:
- - meta_content_scope: meta.string.interpolated.python string.quoted.single.python
- - match: "'"
- scope: punctuation.definition.string.end.python
- set: after-expression
- - include: line-continuation-inside-string
- - include: f-string-content
- # Single-line raw f-string, treated as regex
- - match: ([fF]r|r[fF])(')
- captures:
- 1: storage.type.string.python
- 2: meta.string.interpolated.python string.quoted.single.python punctuation.definition.string.begin.python
- push:
- - meta_content_scope: meta.string.interpolated.python string.quoted.single.python
- - match: "'"
- scope: punctuation.definition.string.end.python
- set: after-expression
- - include: line-continuation-inside-string
- - match: ''
- push: scope:source.regexp.python
- with_prototype:
- - match: (?='|\n)
- pop: true
- - include: line-continuation-inside-string
- - include: f-string-content-reset
- # Single-line f-string
- - match: ((?i)f|f)(')
- captures:
- 1: storage.type.string.python
- 2: meta.string.interpolated.python string.quoted.single.python punctuation.definition.string.begin.python
- push:
- - meta_content_scope: meta.string.interpolated.python string.quoted.single.python
- - match: "'"
- scope: punctuation.definition.string.end.python
- set: after-expression
- - include: escaped-unicode-char
- - include: escaped-char
- - include: line-continuation-inside-string
- - include: f-string-content
- # Single-line string, unicode or not, starting with a SQL keyword
- - match: '([uU]?)('')(?={{sql_indicator}})'
- captures:
- 1: storage.type.string.python
- 2: meta.string.python string.quoted.single.python punctuation.definition.string.begin.python
- push:
- - meta_content_scope: meta.string.python string.quoted.single.python
- - match: "'"
- scope: punctuation.definition.string.end.python
- set: after-expression
- - include: line-continuation-inside-string
- - match: ''
- push: scope:source.sql
- with_prototype:
- - match: '(?=''|\n)'
- pop: true
- - include: escaped-unicode-char
- - include: escaped-char
- - include: line-continuation-inside-string
- - include: constant-placeholder
- # Single-line string, unicode or not
- - match: '([uU]?)('')'
- captures:
- 1: storage.type.string.python
- 2: meta.string.python string.quoted.single.python punctuation.definition.string.begin.python
- push:
- - meta_content_scope: meta.string.python string.quoted.single.python
- - match: "'"
- scope: punctuation.definition.string.end.python
- set: after-expression
- - include: escaped-unicode-char
- - include: escaped-char
- - include: line-continuation-inside-string
- - include: constant-placeholder
- # Single-line string, bytes
- - match: '([bB])('')'
- captures:
- 1: storage.type.string.python
- 2: meta.string.python string.quoted.single.python punctuation.definition.string.begin.python
- push:
- - meta_content_scope: meta.string.python string.quoted.single.python
- - match: "'"
- scope: punctuation.definition.string.end.python
- set: after-expression
- - include: escaped-char
- - include: line-continuation-inside-string
- - include: constant-placeholder
-
- strings:
- # block versions must be matched first
- - include: string-quoted-double-block
- - include: string-quoted-double
- - include: string-quoted-single-block
- - include: string-quoted-single
-
- inline-for:
- - match: \b(?:(async)\s+)?(for)\b
- captures:
- 1: storage.modifier.async.python
- 2: keyword.control.flow.for.generator.python
- push:
- - include: comments
- - meta_scope: meta.expression.generator.python
- - match: \b(in)\b
- scope: keyword.control.flow.for.in.python
- pop: true
- - match: '(?=[)\]}])'
- scope: invalid.illegal.missing-in.python
- pop: true
- - include: illegal-names-pop
- - include: target-list
-
- inline-if:
- - match: \b(if)\b
- scope: keyword.control.flow.if.inline.python
- - match: \b(else)\b
- scope: keyword.control.flow.else.inline.python
-
- target-list:
- - match: ','
- scope: punctuation.separator.target-list.python
- - match: \(
- scope: punctuation.section.target-list.begin.python
- push:
- - include: comments
- - match: ','
- scope: punctuation.separator.target-list.python
- - match: \)
- scope: punctuation.section.target-list.end.python
- pop: true
- - include: target-list
- - include: name
- - include: name
From d5870f2e6811e488191f1606e807b01ad00ec3a8 Mon Sep 17 00:00:00 2001
From: koroshiya <3969837+koroshiya@users.noreply.github.com>
Date: Sat, 28 Sep 2019 12:53:39 +1000
Subject: [PATCH 3/3] v1.2.14
---
messages.json | 3 ++-
messages/1.2.14.txt | 11 +++++++++++
2 files changed, 13 insertions(+), 1 deletion(-)
create mode 100644 messages/1.2.14.txt
diff --git a/messages.json b/messages.json
index afd3c99..c7ab8da 100644
--- a/messages.json
+++ b/messages.json
@@ -36,5 +36,6 @@
"1.2.10": "messages/1.2.10.txt",
"1.2.11": "messages/1.2.11.txt",
"1.2.12": "messages/1.2.12.txt",
- "1.2.13": "messages/1.2.13.txt"
+ "1.2.13": "messages/1.2.13.txt",
+ "1.2.14": "messages/1.2.14.txt"
}
diff --git a/messages/1.2.14.txt b/messages/1.2.14.txt
new file mode 100644
index 0000000..51e6163
--- /dev/null
+++ b/messages/1.2.14.txt
@@ -0,0 +1,11 @@
+Sublime Renpy v1.2.14
+======================
+
+Bugfixes:
+
+Improvements:
+
+Changes:
+-Removed local copy of and dependency on Python.sublime-syntax. This no longer appears to be needed, as long as Sublime Text's bundled version of Python syntax is up to date.
+
+New: