%YAML 1.2
---
# http://www.sublimetext.com/docs/3/syntax.html
name: VimL
file_extensions:
  - vim
scope: source.viml
contexts:
  main:
    - include: comment
    - include: string_quoted_double
    - include: string_quoted_single
    - include: string_regex
    - include: inline_comment
    - include: number_int
    - include: number_hex
    - include: keyword
    - include: support_function
    - include: support_variable
    - include: support_type
    - include: function_params
    - include: function_definition
    - include: function_call
    - include: function
    - include: variable
    - include: expr
  comment:
    - match: ^\s*".*$
      scope: comment.line.quotes.viml
      captures:
        1: punctuation.definition.comment.vim
  expr:
    - match: (\|\||&&|==(\?|#)?|(!|>|<)=(#|\?)?|(=|!)~(#|\?)?|(>|<)(#|\?)is|isnot|\.|\*|\\|%)
      scope: storage.function.viml
  function:
    - match: \b(fu(n|nction)?|end(f|fu|fun|function)?)\b
      scope: storage.function.viml
  function_call:
    - match: '(([sgbwtl]|)?:?[0-9a-zA-Z_#]+)(?=\()'
      scope: support.function.any-method
  function_definition:
    - match: '^\s*(function)\s*!?\s+(?=(s:)?[0-9a-zA-Z_#]+\s*\()'
      captures:
        1: storage.function.viml
      push:
        - meta_scope: meta.function.viml
        - match: (\()
          captures:
            1: punctuation.definition.parameters.begin.viml
          pop: true
        - match: "(s:)?[0-9a-zA-Z_#]+"
          scope: entity.name.function.viml
  function_params:
    - match: '-\w+='
      scope: support.type.viml
  inline_comment:
    - match: '(?!\$)(")(?!\{).*$\n?'
      scope: comment.line.quotes.viml
      captures:
        1: punctuation.definition.comment.vim
  keyword:
    - match: \b(if|while|for|try|return|throw|end(if|for|while|try)?|au(g|group)|else(if|)?|do|in|catch|finally|:)\b
      scope: keyword.control.viml
  number_hex:
    - match: "#[0-9a-f]{6}"
      scope: constant.numeric.hex
  number_int:
    - match: '-?\d+'
      scope: constant.numeric.integer
  string_quoted_double:
    - match: '"(\\\\|\\"|\n[^\S\n]*\\|[^\n"])*"'
      scope: string.quoted.double.viml
  string_quoted_single:
    - match: '''(''''|\n[^\S\n]*\\|[^\n''])*'''
      scope: string.quoted.single.viml
  string_regex:
    - match: '/(\\\\|\\/|\n[^\S\n]*\\|[^\n/])*/'
      scope: string.regexp.viml
  support_function:
    - match: \b(set(local|global)?|let|command|filetype|colorscheme|\w*map|\w*a(b|brev)?|syn|exe(c|cute)?|ec(ho|)?|au(tocmd|)?)\b
      scope: support.function.viml
  support_type:
    - match: <.*?>
      scope: support.type.viml
  support_variable:
    - match: '\b(am(enu|)?|(hl|inc)?search|[Bb]uf([Nn]ew[Ff]ile|[Rr]ead)?|[Ff]ile[Tt]ype)\b'
      scope: support.variable.viml
  variable:
    - match: '([sSgGbBwWlLaAvV]:|@|$|&(?!&))\w*'
      scope: variable.other.viml
