%YAML 1.2
---
# http://www.sublimetext.com/docs/3/syntax.html
name: DotENV
file_extensions:
  - .env
  - .env.dist
  - .env.local
  - .env.sample
  - .env.example
  - .env.template
  - .env.test
  - .env.test.local
  - .env.testing
  - .env.dev
  - .env.development
  - .env.development.local
  - .env.prod
  - .env.production
  - .env.production.local
  - .env.dusk.local
  - .env.staging
  - .env.default
  - .env.defaults
  - .envrc
  - .flaskenv
  - env
  - env.example
  - env.sample
  - env.template
scope: source.env
contexts:
  main:
    - match: (#).*$\n?
      comment: "Comments - starts with #"
      scope: comment.line.number-sign.env
      captures:
        1: punctuation.definition.comment.env
    - match: (\")
      comment: Strings (double)
      captures:
        1: punctuation.definition.string.begin.env
      push:
        - meta_scope: string.quoted.double.env
        - match: (\")
          captures:
            1: punctuation.definition.string.end
          pop: true
        - include: interpolation
        - include: variable
        - include: escape-characters
    - match: (\')
      comment: Strings (single)
      captures:
        1: punctuation.definition.string.begin.env
      push:
        - meta_scope: string.quoted.single.env
        - match: (\')
          captures:
            1: punctuation.definition.string.end
          pop: true
    - match: '(?<=[\w])\s?='
      comment: Assignment Operator
      scope: keyword.operator.assignment.env
    - match: '([\w]+)(?=\s?\=)'
      comment: Variable
      scope: variable.other.env
    - match: (?i)\s?(export)
      comment: Keywords
      scope: keyword.other.env
    - match: (?i)(?<=\=)\s?(true|false|null)
      comment: Constants
      scope: constant.language.env
    - match: '\b((0(x|X)[0-9a-fA-F]*)|(([0-9]+\.?[0-9]*)|(\.[0-9]+))((e|E)(\+|-)?[0-9]+)?)\b'
      comment: Numeric
      scope: constant.numeric.env
  escape-characters:
    - match: '\\[nrt\\\$\"\'']'
      scope: constant.character.escape.env
  interpolation:
    - match: '(\$\{|\{)'
      comment: 'Template Syntax: "foo ${bar} {$baz}"'
      captures:
        1: string.interpolated.env keyword.other.template.begin.env
      push:
        - match: '(\})'
          captures:
            1: string.interpolated.env keyword.other.template.end.env
          pop: true
        - match: '(?x)(\$+)?([a-zA-Z_\x{7f}-\x{ff}][a-zA-Z0-9_\x{7f}-\x{ff}]*?\b)'
          captures:
            1: punctuation.definition.variable.env variable.other.env
            2: variable.other.env
  variable:
    - match: '(?x)(\$+)([a-zA-Z_\x{7f}-\x{ff}][a-zA-Z0-9_\x{7f}-\x{ff}]*?\b)'
      captures:
        1: punctuation.definition.variable.env variable.other.env
        2: variable.other.env
