diff --git a/grammars/MagicPython.cson b/grammars/MagicPython.cson
index 33f23dad..6fefab04 100644
--- a/grammars/MagicPython.cson
+++ b/grammars/MagicPython.cson
@@ -18,6 +18,7 @@ fileTypes: [
   "kv"
   "Snakefile"
   "tac"
+  "seq"
 ]
 first_line_match: "^#![ \\t]*/.*\\bpython[\\d\\.]*\\b"
 firstLineMatch: "^#![ \\t]*/.*\\bpython[\\d\\.]*\\b"
@@ -286,7 +287,7 @@ repository:
             \\b(?<!\\.)(
               async | continue | del | assert | break | finally | for
               | from | elif | else | if | except | pass | raise
-              | return | try | while | with
+              | return | try | while | with | match | case | prefetch
             )\\b
           
         '''
@@ -575,7 +576,7 @@ repository:
       
           | (\\*\\* | \\* | \\+ | - | % | // | / | @)                (?# 4)
       
-          | (!= | == | >= | <= | < | >)                          (?# 5)
+          | (!= | == | >= | <= | < | > | (\\|>) | (\\|\\|>))                          (?# 5)
       
     '''
     captures:
@@ -798,6 +799,12 @@ repository:
       {
         include: "#fstring-raw-quoted-single-line"
       }
+      {
+        include: "#seqstring-seqnorm-quoted-single-line"
+      }
+      {
+        include: "#seqstring-raw-quoted-single-line"
+      }
     ]
   "string-unicode-guts":
     patterns: [
@@ -1796,7 +1803,7 @@ repository:
         (?<!\\.) \\b(
           bool | bytearray | bytes | classmethod | complex | dict
           | float | frozenset | int | list | object | property
-          | set | slice | staticmethod | str | tuple | type
+          | set | slice | staticmethod | str | tuple | type | seq
       
           (?# Although 'super' is not a type, it's related to types,
               and is special enough to be highlighted differently from
@@ -1918,7 +1925,7 @@ repository:
     patterns: [
       {
         name: "invalid.illegal.operator.python"
-        match: "&&|\\|\\||--|\\+\\+"
+        match: "&&|((\\|\\|)(?!>))|--|\\+\\+"
       }
       {
         name: "invalid.illegal.operator.python"
@@ -4951,3 +4958,109 @@ repository:
         match: "(\\w)"
       }
     ]
+  "seqstring-seqnorm-quoted-single-line":
+    name: "meta.seqstring.python"
+    begin: "(\\b[sS])([bBuU])?((['\"]))"
+    end: "(\\3)|((?<!\\\\)\\n)"
+    beginCaptures:
+      "1":
+        name: "storage.type.string.python string.quoted.single.python string.interpolated.python"
+      "2":
+        name: "invalid.illegal.prefix.python"
+      "3":
+        name: "string.quoted.single.python string.interpolated.python punctuation.definition.string.begin.python"
+    endCaptures:
+      "1":
+        name: "string.quoted.single.python string.interpolated.python punctuation.definition.string.end.python"
+      "2":
+        name: "invalid.illegal.newline.python"
+    patterns: [
+      {
+        include: "#seqstring-single-core"
+      }
+    ]
+  "seqstring-normseq-quoted-single-line":
+    name: "meta.seqstring.python"
+    begin: "(\\b[bBuU])([sS])((['\"]))"
+    end: "(\\3)|((?<!\\\\)\\n)"
+    beginCaptures:
+      "1":
+        name: "invalid.illegal.prefix.python"
+      "2":
+        name: "storage.type.string.python string.quoted.single.python string.interpolated.python"
+      "3":
+        name: "string.quoted.single.python punctuation.definition.string.begin.python"
+    endCaptures:
+      "1":
+        name: "string.quoted.single.python string.interpolated.python punctuation.definition.string.end.python"
+      "2":
+        name: "invalid.illegal.newline.python"
+    patterns: [
+      {
+        include: "#seqstring-single-core"
+      }
+    ]
+  "seqstring-raw-quoted-single-line":
+    name: "meta.seqstring.python"
+    begin: "(\\b(?:[R][sS]|[sS][R]))((['\"]))"
+    end: "(\\2)|((?<!\\\\)\\n)"
+    beginCaptures:
+      "1":
+        name: "storage.type.string.python string.quoted.raw.single.python string.interpolated.python"
+      "2":
+        name: "string.quoted.raw.single.python punctuation.definition.string.begin.python"
+    endCaptures:
+      "1":
+        name: "string.quoted.raw.single.python string.interpolated.python punctuation.definition.string.end.python"
+      "2":
+        name: "invalid.illegal.newline.python"
+    patterns: [
+      {
+        include: "seqstring-raw-single-core"
+      }
+    ]
+  "seqstring-single-core":
+    name: "string.quoted.single.python string.interpolated.python"
+    match: '''
+      (?x)
+        (.+?)
+          (
+            (?# .* and .*? in multi-line match need special handling of
+              newlines otherwise SublimeText and Atom will match slightly
+              differently.
+      
+              The guard for newlines has to be separate from the
+              lookahead because of special $ matching rule.)
+            ($\\n?)
+            |
+            (?=[\\\\\\}\\{]|(['"])|((?<!\\\\)\\n))
+          )
+        (?# due to how multiline regexps are matched we need a special case
+          for matching a newline character)
+        | \\n
+      
+    '''
+  "seqstring-raw-single-core":
+    name: "string.quoted.raw.single.python string.interpolated.python"
+    match: '''
+      (?x)
+        (.+?)
+          (
+            (?# .* and .*? in multi-line match need special handling of
+              newlines otherwise SublimeText and Atom will match slightly
+              differently.
+      
+              The guard for newlines has to be separate from the
+              lookahead because of special $ matching rule.)
+            ($\\n?)
+            |
+            (?=[\\\\\\}\\{]|(['"])|((?<!\\\\)\\n))
+          )
+        (?# due to how multiline regexps are matched we need a special case
+          for matching a newline character)
+        | \\n
+      
+    '''
+  "seqstring-single-wildcards":
+    name: "constant.character.format.placeholder.other.python"
+    match: "(\\.\\.\\.)|(_+)"
diff --git a/grammars/MagicPython.tmLanguage b/grammars/MagicPython.tmLanguage
index ba24d9d1..50864164 100644
--- a/grammars/MagicPython.tmLanguage
+++ b/grammars/MagicPython.tmLanguage
@@ -1,7 +1,7 @@
-<!-- AUTOGENERATED FROM grammars/src/MagicPython.syntax.yaml -->
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
 <plist version="1.0">
+  <!-- AUTOGENERATED FROM grammars/src/MagicPython.syntax.yaml -->
   <dict>
     <key>name</key>
     <string>MagicPython</string>
@@ -25,6 +25,7 @@
       <string>kv</string>
       <string>Snakefile</string>
       <string>tac</string>
+      <string>seq</string>
     </array>
     <key>first_line_match</key>
     <string>^#![ \t]*/.*\bpython[\d\.]*\b</string>
@@ -448,7 +449,7 @@ it's probably control flow like:
   \b(?&lt;!\.)(
     async | continue | del | assert | break | finally | for
     | from | elif | else | if | except | pass | raise
-    | return | try | while | with
+    | return | try | while | with | match | case | prefetch
   )\b
 </string>
           </dict>
@@ -876,7 +877,7 @@ it's probably control flow like:
 
     | (\*\* | \* | \+ | - | % | // | / | @)                (?# 4)
 
-    | (!= | == | &gt;= | &lt;= | &lt; | &gt;)                          (?# 5)
+    | (!= | == | &gt;= | &lt;= | &lt; | &gt; | (\|&gt;) | (\|\|&gt;))                          (?# 5)
 </string>
         <key>captures</key>
         <dict>
@@ -1217,6 +1218,14 @@ it's probably control flow like:
             <key>include</key>
             <string>#fstring-raw-quoted-single-line</string>
           </dict>
+          <dict>
+            <key>include</key>
+            <string>#seqstring-seqnorm-quoted-single-line</string>
+          </dict>
+          <dict>
+            <key>include</key>
+            <string>#seqstring-raw-quoted-single-line</string>
+          </dict>
         </array>
       </dict>
       <key>string-unicode-guts</key>
@@ -2793,7 +2802,7 @@ it's probably control flow like:
   (?&lt;!\.) \b(
     bool | bytearray | bytes | classmethod | complex | dict
     | float | frozenset | int | list | object | property
-    | set | slice | staticmethod | str | tuple | type
+    | set | slice | staticmethod | str | tuple | type | seq
 
     (?# Although 'super' is not a type, it's related to types,
         and is special enough to be highlighted differently from
@@ -2965,7 +2974,7 @@ indirectly through syntactic constructs
             <key>name</key>
             <string>invalid.illegal.operator.python</string>
             <key>match</key>
-            <string>&amp;&amp;|\|\||--|\+\+</string>
+            <string>&amp;&amp;|((\|\|)(?!&gt;))|--|\+\+</string>
           </dict>
           <dict>
             <key>name</key>
@@ -8650,6 +8659,195 @@ indirectly through syntactic constructs
           </dict>
         </array>
       </dict>
+      <key>seqstring-seqnorm-quoted-single-line</key>
+      <dict>
+        <key>name</key>
+        <string>meta.seqstring.python</string>
+        <key>begin</key>
+        <string>(\b[sS])([bBuU])?((['"]))</string>
+        <key>end</key>
+        <string>(\3)|((?&lt;!\\)\n)</string>
+        <key>beginCaptures</key>
+        <dict>
+          <key>1</key>
+          <dict>
+            <key>name</key>
+            <string>string.interpolated.python string.quoted.single.python storage.type.string.python</string>
+          </dict>
+          <key>2</key>
+          <dict>
+            <key>name</key>
+            <string>invalid.illegal.prefix.python</string>
+          </dict>
+          <key>3</key>
+          <dict>
+            <key>name</key>
+            <string>punctuation.definition.string.begin.python string.interpolated.python string.quoted.single.python</string>
+          </dict>
+        </dict>
+        <key>endCaptures</key>
+        <dict>
+          <key>1</key>
+          <dict>
+            <key>name</key>
+            <string>punctuation.definition.string.end.python string.interpolated.python string.quoted.single.python</string>
+          </dict>
+          <key>2</key>
+          <dict>
+            <key>name</key>
+            <string>invalid.illegal.newline.python</string>
+          </dict>
+        </dict>
+        <key>patterns</key>
+        <array>
+          <dict>
+            <key>include</key>
+            <string>#seqstring-single-core</string>
+          </dict>
+        </array>
+      </dict>
+      <key>seqstring-normseq-quoted-single-line</key>
+      <dict>
+        <key>name</key>
+        <string>meta.seqstring.python</string>
+        <key>begin</key>
+        <string>(\b[bBuU])([sS])((['"]))</string>
+        <key>end</key>
+        <string>(\3)|((?&lt;!\\)\n)</string>
+        <key>beginCaptures</key>
+        <dict>
+          <key>1</key>
+          <dict>
+            <key>name</key>
+            <string>invalid.illegal.prefix.python</string>
+          </dict>
+          <key>2</key>
+          <dict>
+            <key>name</key>
+            <string>string.interpolated.python string.quoted.single.python storage.type.string.python</string>
+          </dict>
+          <key>3</key>
+          <dict>
+            <key>name</key>
+            <string>punctuation.definition.string.begin.python string.quoted.single.python</string>
+          </dict>
+        </dict>
+        <key>endCaptures</key>
+        <dict>
+          <key>1</key>
+          <dict>
+            <key>name</key>
+            <string>punctuation.definition.string.end.python string.interpolated.python string.quoted.single.python</string>
+          </dict>
+          <key>2</key>
+          <dict>
+            <key>name</key>
+            <string>invalid.illegal.newline.python</string>
+          </dict>
+        </dict>
+        <key>patterns</key>
+        <array>
+          <dict>
+            <key>include</key>
+            <string>#seqstring-single-core</string>
+          </dict>
+        </array>
+      </dict>
+      <key>seqstring-raw-quoted-single-line</key>
+      <dict>
+        <key>name</key>
+        <string>meta.seqstring.python</string>
+        <key>begin</key>
+        <string>(\b(?:[R][sS]|[sS][R]))((['"]))</string>
+        <key>end</key>
+        <string>(\2)|((?&lt;!\\)\n)</string>
+        <key>beginCaptures</key>
+        <dict>
+          <key>1</key>
+          <dict>
+            <key>name</key>
+            <string>string.interpolated.python string.quoted.raw.single.python storage.type.string.python</string>
+          </dict>
+          <key>2</key>
+          <dict>
+            <key>name</key>
+            <string>punctuation.definition.string.begin.python string.quoted.raw.single.python</string>
+          </dict>
+        </dict>
+        <key>endCaptures</key>
+        <dict>
+          <key>1</key>
+          <dict>
+            <key>name</key>
+            <string>punctuation.definition.string.end.python string.interpolated.python string.quoted.raw.single.python</string>
+          </dict>
+          <key>2</key>
+          <dict>
+            <key>name</key>
+            <string>invalid.illegal.newline.python</string>
+          </dict>
+        </dict>
+        <key>patterns</key>
+        <array>
+          <dict>
+            <key>include</key>
+            <string>seqstring-raw-single-core</string>
+          </dict>
+        </array>
+      </dict>
+      <key>seqstring-single-core</key>
+      <dict>
+        <key>name</key>
+        <string>string.interpolated.python string.quoted.single.python</string>
+        <key>match</key>
+        <string>(?x)
+  (.+?)
+    (
+      (?# .* and .*? in multi-line match need special handling of
+        newlines otherwise SublimeText and Atom will match slightly
+        differently.
+
+        The guard for newlines has to be separate from the
+        lookahead because of special $ matching rule.)
+      ($\n?)
+      |
+      (?=[\\\}\{]|(['"])|((?&lt;!\\)\n))
+    )
+  (?# due to how multiline regexps are matched we need a special case
+    for matching a newline character)
+  | \n
+</string>
+      </dict>
+      <key>seqstring-raw-single-core</key>
+      <dict>
+        <key>name</key>
+        <string>string.interpolated.python string.quoted.raw.single.python</string>
+        <key>match</key>
+        <string>(?x)
+  (.+?)
+    (
+      (?# .* and .*? in multi-line match need special handling of
+        newlines otherwise SublimeText and Atom will match slightly
+        differently.
+
+        The guard for newlines has to be separate from the
+        lookahead because of special $ matching rule.)
+      ($\n?)
+      |
+      (?=[\\\}\{]|(['"])|((?&lt;!\\)\n))
+    )
+  (?# due to how multiline regexps are matched we need a special case
+    for matching a newline character)
+  | \n
+</string>
+      </dict>
+      <key>seqstring-single-wildcards</key>
+      <dict>
+        <key>name</key>
+        <string>constant.character.format.placeholder.other.python</string>
+        <key>match</key>
+        <string>(\.\.\.)|(_+)</string>
+      </dict>
     </dict>
   </dict>
 </plist>
diff --git a/grammars/MagicRegExp.tmLanguage b/grammars/MagicRegExp.tmLanguage
index 3d19e058..3ddacc70 100644
--- a/grammars/MagicRegExp.tmLanguage
+++ b/grammars/MagicRegExp.tmLanguage
@@ -1,7 +1,7 @@
-<!-- AUTOGENERATED FROM grammars/src/MagicRegExp.syntax.yaml -->
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
 <plist version="1.0">
+  <!-- AUTOGENERATED FROM grammars/src/MagicRegExp.syntax.yaml -->
   <dict>
     <key>name</key>
     <string>MagicRegExp</string>
diff --git a/grammars/src/MagicPython.syntax.yaml b/grammars/src/MagicPython.syntax.yaml
index 7dbec777..73305d44 100644
--- a/grammars/src/MagicPython.syntax.yaml
+++ b/grammars/src/MagicPython.syntax.yaml
@@ -4,7 +4,7 @@ scopeName: source.python
 # NOTE: remember to update package.json with VSCode file types.
 fileTypes: [py, py3, rpy, pyw, cpy, pyi,
             SConstruct, Sconstruct, sconstruct, SConscript,
-            gyp, gypi, wsgi, kv, Snakefile, tac]
+            gyp, gypi, wsgi, kv, Snakefile, tac, seq]
 first_line_match: ^#![ \t]*/.*\bpython[\d\.]*\b
 firstLineMatch: ^#![ \t]*/.*\bpython[\d\.]*\b
 uuid: 742deb57-6e38-4192-bed6-410746efd85d
@@ -206,6 +206,13 @@ repository:
         fguard: ""
         guard: ""
 
+    - file: 'pyseqstring.inc.syntax.yaml'
+      vars:
+        line: single
+        marker: (['"])
+        fguard: "|(?=\\n)"
+        guard: "|((?<!\\\\)\\n)"
+
 
   impossible:
     comment: This is a special rule that should be used where no match
@@ -379,7 +386,7 @@ repository:
             \b(?<!\.)(
               async | continue | del | assert | break | finally | for
               | from | elif | else | if | except | pass | raise
-              | return | try | while | with
+              | return | try | while | with | match | case | prefetch
             )\b
       - name: storage.modifier.declaration.python
         match: |
@@ -555,7 +562,7 @@ repository:
 
           | (\*\* | \* | \+ | - | % | // | / | @)                (?# 4)
 
-          | (!= | == | >= | <= | < | >)                          (?# 5)
+          | (!= | == | >= | <= | < | > | (\|>) | (\|\|>))                          (?# 5)
 
     captures:
       '1': {name: keyword.operator.logical.python}
@@ -694,6 +701,8 @@ repository:
       - include: '#fstring-normf-quoted-single-line'
       - include: '#fstring-raw-quoted-multi-line'
       - include: '#fstring-raw-quoted-single-line'
+      - include: '#seqstring-seqnorm-quoted-single-line'
+      - include: '#seqstring-raw-quoted-single-line'
 
   string-unicode-guts:
     patterns:
@@ -1343,7 +1352,7 @@ repository:
         (?<!\.) \b(
           bool | bytearray | bytes | classmethod | complex | dict
           | float | frozenset | int | list | object | property
-          | set | slice | staticmethod | str | tuple | type
+          | set | slice | staticmethod | str | tuple | type | seq
 
           (?# Although 'super' is not a type, it's related to types,
               and is special enough to be highlighted differently from
@@ -1447,7 +1456,7 @@ repository:
   illegal-operator:
     patterns:
       - name: invalid.illegal.operator.python
-        match: '&&|\|\||--|\+\+'
+        match: '&&|((\|\|)(?!>))|--|\+\+'
       - name: invalid.illegal.operator.python
         match: '[?$]'
       - name: invalid.illegal.operator.python
diff --git a/grammars/src/pyseqstring.inc.syntax.yaml b/grammars/src/pyseqstring.inc.syntax.yaml
new file mode 100644
index 00000000..677bdd87
--- /dev/null
+++ b/grammars/src/pyseqstring.inc.syntax.yaml
@@ -0,0 +1,174 @@
+---
+seqstring-seqnorm-quoted-${line}-line:
+  name: meta.seqstring.python
+  begin: (\b[sS])([bBuU])?(${marker})
+  end: (\3)${guard}
+  beginCaptures:
+    # "storage.type.string.python" class should be the first one,
+    # because Atom, VSCode and GitHub don't understand scopes
+    # separated by whitespace, and simply use the first one
+    # of them.  Highlighting 'f' as 'storage.type' is more
+    # important for us than having other scopes.
+    '1': {name: storage.type.string.python
+                string.quoted.${line}.python
+                string.interpolated.python}
+    '2': {name: invalid.illegal.prefix.python}
+    '3': {name: string.quoted.${line}.python
+                string.interpolated.python
+                punctuation.definition.string.begin.python}
+  endCaptures:
+    '1': {name: string.quoted.${line}.python
+                string.interpolated.python
+                punctuation.definition.string.end.python}
+    '2': {name: invalid.illegal.newline.python}
+  patterns:
+    # - include: '#seqstring-${line}-wildcards'
+    - include: '#seqstring-${line}-core'
+
+seqstring-normseq-quoted-${line}-line:
+  name: meta.seqstring.python
+  begin: (\b[bBuU])([sS])(${marker})
+  end: (\3)${guard}
+  beginCaptures:
+    '1': {name: invalid.illegal.prefix.python}
+    '2': {name: storage.type.string.python
+                string.quoted.${line}.python
+                string.interpolated.python}
+    '3': {name: string.quoted.${line}.python
+                punctuation.definition.string.begin.python}
+  endCaptures:
+    '1': {name: string.quoted.${line}.python
+                string.interpolated.python
+                punctuation.definition.string.end.python}
+    '2': {name: invalid.illegal.newline.python}
+  patterns:
+    # - include: '#seqstring-${line}-wildcards'
+    - include: '#seqstring-${line}-core'
+
+seqstring-raw-quoted-${line}-line:
+  name: meta.seqstring.python
+  begin: (\b(?:[R][sS]|[sS][R]))(${marker})
+  end: (\2)${guard}
+  beginCaptures:
+    '1': {name: storage.type.string.python
+                string.quoted.raw.${line}.python
+                string.interpolated.python}
+    '2': {name: string.quoted.raw.${line}.python
+                punctuation.definition.string.begin.python}
+  endCaptures:
+    '1': {name: string.quoted.raw.${line}.python
+                string.interpolated.python
+                punctuation.definition.string.end.python}
+    '2': {name: invalid.illegal.newline.python}
+  patterns:
+    # - include: '#seqstring-${line}-wildcards'
+    - include: 'seqstring-raw-${line}-core'
+
+seqstring-${line}-core:
+  name: string.quoted.${line}.python string.interpolated.python
+  match: |
+    (?x)
+      (.+?)
+        (
+          (?# .* and .*? in multi-line match need special handling of
+            newlines otherwise SublimeText and Atom will match slightly
+            differently.
+
+            The guard for newlines has to be separate from the
+            lookahead because of special $ matching rule.)
+          ($\n?)
+          |
+          (?=[\\\}\{]|${marker}${guard})
+        )
+      (?# due to how multiline regexps are matched we need a special case
+        for matching a newline character)
+      | \n
+
+seqstring-raw-${line}-core:
+  name: string.quoted.raw.${line}.python string.interpolated.python
+  match: |
+    (?x)
+      (.+?)
+        (
+          (?# .* and .*? in multi-line match need special handling of
+            newlines otherwise SublimeText and Atom will match slightly
+            differently.
+
+            The guard for newlines has to be separate from the
+            lookahead because of special $ matching rule.)
+          ($\n?)
+          |
+          (?=[\\\}\{]|${marker}${guard})
+        )
+      (?# due to how multiline regexps are matched we need a special case
+        for matching a newline character)
+      | \n
+
+seqstring-${line}-wildcards:
+  name: constant.character.format.placeholder.other.python
+  match: (\.\.\.)|(_+)
+
+# fstring-${line}-brace:
+#   comment: value interpolation using { ... }
+#   begin: (\{)
+#   end: |
+#     (?x)
+#       (\})${fguard}
+#   beginCaptures:
+#     '1': {name: constant.character.format.placeholder.other.python}
+#   endCaptures:
+#     '1': {name: constant.character.format.placeholder.other.python}
+#   patterns:
+#     - include: '#fstring-terminator-${line}'
+#     - include: '#f-expression'
+
+# fstring-terminator-${line}:
+#   patterns:
+#     - name: storage.type.format.python
+#       match: (![rsa])(?=})
+#     - match: |
+#         (?x)
+#           (![rsa])?
+#             ( : \w? [<>=^]? [-+ ]? \#?
+#               \d* ,? (\.\d+)? [bcdeEfFgGnosxX%]? )(?=})
+#       captures:
+#         # We use this awkward scope name instead of perhaps more
+#         # elegant "support.other.format.python" because it appears
+#         # that by default it gives a better visual result in various
+#         # systems (e.g. GitHub). This is due to the fact that
+#         # "storage.type..." is more likely to have special
+#         # highlighting in any given color scheme than
+#         # "support.other..."
+#         #
+#         '1': {name: storage.type.format.python}
+#         '2': {name: storage.type.format.python}
+
+#     - include: '#fstring-terminator-${line}-tail'
+
+# fstring-terminator-${line}-tail:
+#   begin: (![rsa])?(:)(?=.*?{)
+#   end: (?=})${fguard}
+#   beginCaptures:
+#     '1': {name: storage.type.format.python}
+#     '2': {name: storage.type.format.python}
+
+#   patterns:
+#     - include: '#fstring-illegal-${line}-brace'
+#     - include: '#fstring-${line}-brace'
+#     - name: storage.type.format.python
+#       match: ([bcdeEfFgGnosxX%])(?=})
+#     - name: storage.type.format.python
+#       match: (\.\d+)
+#     - name: storage.type.format.python
+#       match: (,)
+#     - name: storage.type.format.python
+#       match: (\d+)
+#     - name: storage.type.format.python
+#       match: (\#)
+#     - name: storage.type.format.python
+#       match: ([-+ ])
+#     - name: storage.type.format.python
+#       match: ([<>=^])
+#     - name: storage.type.format.python
+#       match: (\w)
+...
diff --git a/misc/scopes b/misc/scopes
index 17a74a4a..e6f255e7 100644
--- a/misc/scopes
+++ b/misc/scopes
@@ -77,6 +77,7 @@ meta.item-access.python
 meta.lambda-function.python
 meta.member.access.python
 meta.named.regexp
+meta.seqstring.python
 meta.typehint.comment.python
 punctuation.character.set.begin.regexp
 punctuation.character.set.end.regexp
diff --git a/package.json b/package.json
index e859e0b7..a73205e6 100644
--- a/package.json
+++ b/package.json
@@ -1,75 +1,80 @@
 {
-  "name": "MagicPython",
-  "version": "1.1.1",
-  "engines": {
-    "atom": "*",
-    "node": "*",
-    "vscode": "*"
-  },
-  "repository": {
-    "type": "git",
-    "url": "https://github.com/MagicStack/MagicPython.git"
-  },
-  "bugs": {
-    "url": "https://github.com/MagicStack/MagicPython/issues"
-  },
-  "description": "Syntax highlighter for cutting edge Python.",
-  "license": "MIT",
-  "publisher": "magicstack",
-  "categories": [
-    "Languages"
-  ],
-  "keywords": [
-    "python",
-    "highlighter",
-    "syntax",
-    "python3"
-  ],
-  "icon": "icon.png",
-  "galleryBanner": {
-    "color": "#2c2c2c",
-    "theme": "dark"
-  },
-  "contributes": {
-    "//": [
-      "This section is for VSCode.",
-      "NOTE: remember to update grammar/src/MagicPython.syntax.yaml, too."
-    ],
-    "languages": [
-      {
-        "id": "python",
-        "aliases": [
-          "MagicPython",
-          "python"
-        ],
-        "extensions": [
-          ".py",
-          ".py3",
-          ".rpy",
-          ".pyw",
-          ".cpy",
-          ".pyi",
-          ".SConstruct",
-          ".Sconstruct",
-          ".sconstruct",
-          ".SConscript",
-          ".gyp",
-          ".gypi",
-          ".wsgi"
-        ]
-      }
-    ],
-    "grammars": [
-      {
-        "language": "python",
-        "scopeName": "source.python",
-        "path": "./grammars/MagicPython.tmLanguage"
-      }
-    ]
-  },
-  "devDependencies": {
-    "oniguruma": "^7.0.0",
-    "syntaxdev": "^0.1.3"
-  },
-  "dependencies": {}
-}
+	"name": "MagicPython",
+	"version": "1.1.1",
+	"engines": {
+		"atom": "*",
+		"node": "*",
+		"vscode": "*"
+	},
+	"repository": {
+		"type": "git",
+		"url": "https://github.com/MagicStack/MagicPython.git"
+	},
+	"bugs": {
+		"url": "https://github.com/MagicStack/MagicPython/issues"
+	},
+	"description": "Syntax highlighter for cutting edge Python.",
+	"license": "MIT",
+	"publisher": "magicstack",
+	"categories": [
+		"Languages"
+	],
+	"keywords": [
+		"python",
+		"highlighter",
+		"syntax",
+		"python3"
+	],
+	"icon": "icon.png",
+	"galleryBanner": {
+		"color": "#2c2c2c",
+		"theme": "dark"
+	},
+	"contributes": {
+		"//": [
+			"This section is for VSCode.",
+			"NOTE: remember to update grammar/src/MagicPython.syntax.yaml, too."
+		],
+		"languages": [
+			{
+				"id": "python",
+				"aliases": [
+					"MagicPython",
+					"python"
+				],
+				"extensions": [
+					".py",
+					".py3",
+					".rpy",
+					".pyw",
+					".cpy",
+					".pyi",
+					".SConstruct",
+					".Sconstruct",
+					".sconstruct",
+					".SConscript",
+					".gyp",
+					".gypi",
+					".wsgi"
+				]
+			}
+		],
+		"grammars": [
+			{
+				"language": "python",
+				"scopeName": "source.python",
+				"path": "./grammars/MagicPython.tmLanguage"
+			}
+		]
+	},
+	"devDependencies": {
+		"oniguruma": "^7.0.0",
+		"syntaxdev": "^0.1.3"
+	},
+	"dependencies": {},
+	"__metadata": {
+		"id": "1f5eb737-5496-44a3-a8a1-36a85eee4979",
+		"publisherDisplayName": "MagicStack Inc.",
+		"publisherId": "0f082869-2c63-4c83-b0e2-780d8e645f86"
+	}
+}
\ No newline at end of file
