|
- %YAML 1.2
- ---
- # http://www.sublimetext.com/docs/3/syntax.html
- name: Nix
- file_extensions:
- - nix
- scope: source.nix
- contexts:
- main:
- - include: expression
- comment:
- - match: '/\*([^*]|\*[^\/])*'
- push:
- - meta_scope: comment.block.nix
- - match: \*\/
- pop: true
- - include: comment-remark
- - match: '\#'
- push:
- - meta_scope: comment.line.number-sign.nix
- - match: $
- pop: true
- - include: comment-remark
- attribute-bind:
- - include: attribute-name
- - include: attribute-bind-from-equals
- attribute-bind-from-equals:
- - match: \=
- captures:
- 0: keyword.operator.bind.nix
- push:
- - match: \;
- captures:
- 0: punctuation.terminator.bind.nix
- pop: true
- - include: expression
- attribute-inherit:
- - match: \binherit\b
- captures:
- 0: keyword.other.inherit.nix
- push:
- - match: \;
- captures:
- 0: punctuation.terminator.inherit.nix
- pop: true
- - match: \(
- captures:
- 0: punctuation.section.function.arguments.nix
- push:
- - match: (?=\;)
- pop: true
- - match: \)
- captures:
- 0: punctuation.section.function.arguments.nix
- push:
- - match: (?=\;)
- pop: true
- - include: bad-reserved
- - include: attribute-name-single
- - include: others
- - include: expression
- - match: '(?=[a-zA-Z\_])'
- push:
- - match: (?=\;)
- pop: true
- - include: bad-reserved
- - include: attribute-name-single
- - include: others
- - include: others
- attribute-name:
- - match: '\b[a-zA-Z\_][a-zA-Z0-9\_\''\-]*'
- scope: entity.other.attribute-name.multipart.nix
- - match: \.
- - include: string-quoted
- - include: interpolation
- attribute-name-single:
- - match: '\b[a-zA-Z\_][a-zA-Z0-9\_\''\-]*'
- scope: entity.other.attribute-name.single.nix
- attrset-contents:
- - include: attribute-inherit
- - include: bad-reserved
- - include: attribute-bind
- - include: others
- attrset-definition:
- - match: '(?=\{)'
- push:
- - match: '(?=([\])};,]|\b(else|then)\b))'
- pop: true
- - match: '(\{)'
- captures:
- 0: punctuation.definition.attrset.nix
- push:
- - match: '(\})'
- captures:
- 0: punctuation.definition.attrset.nix
- pop: true
- - include: attrset-contents
- - match: '(?<=\})'
- push:
- - match: '(?=([\])};,]|\b(else|then)\b))'
- pop: true
- - include: expression-cont
- attrset-definition-brace-opened:
- - match: '(?<=\})'
- push:
- - match: '(?=([\])};,]|\b(else|then)\b))'
- pop: true
- - include: expression-cont
- - match: (?=.?)
- push:
- - match: '\}'
- captures:
- 0: punctuation.definition.attrset.nix
- pop: true
- - include: attrset-contents
- attrset-for-sure:
- - match: (?=\brec\b)
- push:
- - match: '(?=([\])};,]|\b(else|then)\b))'
- pop: true
- - match: \brec\b
- captures:
- 0: keyword.other.nix
- push:
- - match: '(?=\{)'
- pop: true
- - include: others
- - include: attrset-definition
- - include: others
- - match: '(?=\{\s*(\}|[^,?]*(=|;)))'
- push:
- - match: '(?=([\])};,]|\b(else|then)\b))'
- pop: true
- - include: attrset-definition
- - include: others
- attrset-or-function:
- - match: '\{'
- captures:
- 0: punctuation.definition.attrset-or-function.nix
- push:
- - match: '(?=([\])};]|\b(else|then)\b))'
- pop: true
- - match: '(?=(\s*\}|\"|\binherit\b|\b[a-zA-Z\_][a-zA-Z0-9\_\''\-]*(\s*\.|\s*=[^=])|\$\{[a-zA-z0-9\_\''\-]+\}(\s*\.|\s*=[^=])))'
- push:
- - match: '(?=([\])};,]|\b(else|then)\b))'
- pop: true
- - include: attrset-definition-brace-opened
- - match: '(?=(\.\.\.|\b[a-zA-Z\_][a-zA-Z0-9\_\''\-]*\s*[,?]))'
- push:
- - match: '(?=([\])};,]|\b(else|then)\b))'
- pop: true
- - include: function-definition-brace-opened
- - include: bad-reserved
- - match: '\b[a-zA-Z\_][a-zA-Z0-9\_\''\-]*'
- captures:
- 0: variable.parameter.function.maybe.nix
- push:
- - match: '(?=([\])};]|\b(else|then)\b))'
- pop: true
- - match: (?=\.)
- push:
- - match: '(?=([\])};,]|\b(else|then)\b))'
- pop: true
- - include: attrset-definition-brace-opened
- - match: \s*(\,)
- captures:
- 1: keyword.operator.nix
- push:
- - match: '(?=([\])};,]|\b(else|then)\b))'
- pop: true
- - include: function-definition-brace-opened
- - match: (?=\=)
- push:
- - match: '(?=([\])};,]|\b(else|then)\b))'
- pop: true
- - include: attribute-bind-from-equals
- - include: attrset-definition-brace-opened
- - match: (?=\?)
- push:
- - match: '(?=([\])};,]|\b(else|then)\b))'
- pop: true
- - include: function-parameter-default
- - match: \,
- captures:
- 0: keyword.operator.nix
- push:
- - match: '(?=([\])};,]|\b(else|then)\b))'
- pop: true
- - include: function-definition-brace-opened
- - include: others
- - include: others
- bad-reserved:
- - match: '(?<![\w''-])(if|then|else|assert|with|let|in|rec|inherit)(?![\w''-])'
- scope: invalid.illegal.reserved.nix
- comment-remark:
- - match: (TODO|FIXME|BUG|\!\!\!):?
- captures:
- 1: markup.bold.comment.nix
- constants:
- - match: \b(builtins|true|false|null)\b
- captures:
- 0: constant.language.nix
- push:
- - match: '(?=([\])};,]|\b(else|then)\b))'
- pop: true
- - include: expression-cont
- - match: \b(scopedImport|import|isNull|abort|throw|baseNameOf|dirOf|removeAttrs|map|toString|derivationStrict|derivation)\b
- captures:
- 0: support.function.nix
- push:
- - match: '(?=([\])};,]|\b(else|then)\b))'
- pop: true
- - include: expression-cont
- - match: '\b[0-9]+\b'
- captures:
- 0: constant.numeric.nix
- push:
- - match: '(?=([\])};,]|\b(else|then)\b))'
- pop: true
- - include: expression-cont
- expression:
- - include: parens-and-cont
- - include: list-and-cont
- - include: string
- - include: interpolation
- - include: with-assert
- - include: function-for-sure
- - include: attrset-for-sure
- - include: attrset-or-function
- - include: let
- - include: if
- - include: operator-unary
- - include: constants
- - include: bad-reserved
- - include: parameter-name-and-cont
- - include: others
- expression-cont:
- - match: (?=.?)
- push:
- - match: '(?=([\])};,]|\b(else|then)\b))'
- pop: true
- - include: parens
- - include: list
- - include: string
- - include: interpolation
- - include: function-for-sure
- - include: attrset-for-sure
- - include: attrset-or-function
- - match: '(\bor\b|\.|==|!=|!|\<\=|\<|\>\=|\>|&&|\|\||-\>|//|\?|\+\+|-|\*|/(?=([^*]|$))|\+)'
- scope: keyword.operator.nix
- - include: constants
- - include: bad-reserved
- - include: parameter-name
- - include: others
- function-body:
- - match: '(@\s*([a-zA-Z\_][a-zA-Z0-9\_\''\-]*)\s*)?(\:)'
- push:
- - match: '(?=([\])};,]|\b(else|then)\b))'
- pop: true
- - include: expression
- function-body-from-colon:
- - match: (\:)
- captures:
- 0: punctuation.definition.function.nix
- push:
- - match: '(?=([\])};,]|\b(else|then)\b))'
- pop: true
- - include: expression
- function-contents:
- - include: bad-reserved
- - include: function-parameter
- - include: others
- function-definition:
- - match: (?=.?)
- push:
- - match: '(?=([\])};,]|\b(else|then)\b))'
- pop: true
- - include: function-body-from-colon
- - match: (?=.?)
- push:
- - match: (?=\:)
- pop: true
- - match: '(\b[a-zA-Z\_][a-zA-Z0-9\_\''\-]*)'
- captures:
- 0: variable.parameter.function.4.nix
- push:
- - match: (?=\:)
- pop: true
- - match: \@
- push:
- - match: (?=\:)
- pop: true
- - include: function-header-until-colon-no-arg
- - include: others
- - include: others
- - match: '(?=\{)'
- push:
- - match: (?=\:)
- pop: true
- - include: function-header-until-colon-with-arg
- - include: others
- function-definition-brace-opened:
- - match: (?=.?)
- push:
- - match: '(?=([\])};,]|\b(else|then)\b))'
- pop: true
- - include: function-body-from-colon
- - match: (?=.?)
- push:
- - match: (?=\:)
- pop: true
- - include: function-header-close-brace-with-arg
- - match: (?=.?)
- push:
- - match: '(?=\})'
- pop: true
- - include: function-contents
- - include: others
- function-for-sure:
- - match: '(?=(\b[a-zA-Z\_][a-zA-Z0-9\_\''\-]*\s*[:@]|\{[^}]*\}\s*:|\{[^#}"''/=]*[,\?]))'
- push:
- - match: '(?=([\])};,]|\b(else|then)\b))'
- pop: true
- - include: function-definition
- function-header-close-brace-no-arg:
- - match: '\}'
- captures:
- 0: punctuation.definition.entity.function.nix
- push:
- - match: (?=\:)
- pop: true
- - include: others
- function-header-close-brace-with-arg:
- - match: '\}'
- captures:
- 0: punctuation.definition.entity.function.nix
- push:
- - match: (?=\:)
- pop: true
- - include: function-header-terminal-arg
- - include: others
- function-header-open-brace:
- - match: '\{'
- captures:
- 0: punctuation.definition.entity.function.2.nix
- push:
- - match: '(?=\})'
- pop: true
- - include: function-contents
- function-header-terminal-arg:
- - match: (?=@)
- push:
- - match: (?=\:)
- pop: true
- - match: \@
- push:
- - match: (?=\:)
- pop: true
- - match: '(\b[a-zA-Z\_][a-zA-Z0-9\_\''\-]*)'
- push:
- - meta_scope: variable.parameter.function.3.nix
- - match: (?=\:)
- pop: true
- - include: others
- - include: others
- function-header-until-colon-no-arg:
- - match: '(?=\{)'
- push:
- - match: (?=\:)
- pop: true
- - include: function-header-open-brace
- - include: function-header-close-brace-no-arg
- function-header-until-colon-with-arg:
- - match: '(?=\{)'
- push:
- - match: (?=\:)
- pop: true
- - include: function-header-open-brace
- - include: function-header-close-brace-with-arg
- function-parameter:
- - match: (\.\.\.)
- push:
- - meta_scope: keyword.operator.nix
- - match: '(,|(?=\}))'
- pop: true
- - include: others
- - match: '\b[a-zA-Z\_][a-zA-Z0-9\_\''\-]*'
- captures:
- 0: variable.parameter.function.1.nix
- push:
- - match: '(,|(?=\}))'
- captures:
- 0: keyword.operator.nix
- pop: true
- - include: whitespace
- - include: comment
- - include: function-parameter-default
- - include: expression
- - include: others
- function-parameter-default:
- - match: \?
- captures:
- 0: keyword.operator.nix
- push:
- - match: "(?=[,}])"
- pop: true
- - include: expression
- if:
- - match: (?=\bif\b)
- push:
- - match: '(?=([\])};,]|\b(else|then)\b))'
- pop: true
- - match: \bif\b
- captures:
- 0: keyword.other.nix
- push:
- - match: \bth(?=en\b)
- captures:
- 0: keyword.other.nix
- pop: true
- - include: expression
- - match: (?<=th)en\b
- captures:
- 0: keyword.other.nix
- push:
- - match: \bel(?=se\b)
- captures:
- 0: keyword.other.nix
- pop: true
- - include: expression
- - match: (?<=el)se\b
- captures:
- 0: keyword.other.nix
- push:
- - match: '(?=([\])};,]|\b(else|then)\b))'
- captures:
- 0: keyword.other.nix
- pop: true
- - include: expression
- illegal:
- - match: .
- scope: invalid.illegal
- interpolation:
- - match: '\$\{'
- captures:
- 0: punctuation.section.embedded.begin.nix
- push:
- - meta_scope: markup.italic
- - match: '\}'
- captures:
- 0: punctuation.section.embedded.end.nix
- pop: true
- - include: expression
- let:
- - match: (?=\blet\b)
- push:
- - match: '(?=([\])};,]|\b(else|then)\b))'
- pop: true
- - match: \blet\b
- captures:
- 0: keyword.other.nix
- push:
- - match: '(?=([\])};,]|\b(in|else|then)\b))'
- pop: true
- - match: '(?=\{)'
- push:
- - match: '(?=([\])};,]|\b(else|then)\b))'
- pop: true
- - match: '\{'
- push:
- - match: '\}'
- pop: true
- - include: attrset-contents
- - match: '(^|(?<=\}))'
- push:
- - match: '(?=([\])};,]|\b(else|then)\b))'
- pop: true
- - include: expression-cont
- - include: others
- - include: attrset-contents
- - include: others
- - match: \bin\b
- captures:
- 0: keyword.other.nix
- push:
- - match: '(?=([\])};,]|\b(else|then)\b))'
- pop: true
- - include: expression
- list:
- - match: '\['
- captures:
- 0: punctuation.definition.list.nix
- push:
- - match: '\]'
- captures:
- 0: punctuation.definition.list.nix
- pop: true
- - include: expression
- list-and-cont:
- - match: '(?=\[)'
- push:
- - match: '(?=([\])};,]|\b(else|then)\b))'
- pop: true
- - include: list
- - include: expression-cont
- operator-unary:
- - match: (!|-)
- scope: keyword.operator.unary.nix
- others:
- - include: whitespace
- - include: comment
- - include: illegal
- parameter-name:
- - match: '\b[a-zA-Z\_][a-zA-Z0-9\_\''\-]*'
- captures:
- 0: variable.parameter.name.nix
- parameter-name-and-cont:
- - match: '\b[a-zA-Z\_][a-zA-Z0-9\_\''\-]*'
- captures:
- 0: variable.parameter.name.nix
- push:
- - match: '(?=([\])};,]|\b(else|then)\b))'
- pop: true
- - include: expression-cont
- parens:
- - match: \(
- captures:
- 0: punctuation.definition.expression.nix
- push:
- - match: \)
- captures:
- 0: punctuation.definition.expression.nix
- pop: true
- - include: expression
- parens-and-cont:
- - match: (?=\()
- push:
- - match: '(?=([\])};,]|\b(else|then)\b))'
- pop: true
- - include: parens
- - include: expression-cont
- string:
- - match: (?=\'\')
- push:
- - match: '(?=([\])};,]|\b(else|then)\b))'
- pop: true
- - match: \'\'
- captures:
- 0: punctuation.definition.string.other.start.nix
- push:
- - meta_scope: string.quoted.other.nix
- - match: \'\'(?!\$|\'|\\.)
- captures:
- 0: punctuation.definition.string.other.end.nix
- pop: true
- - match: \'\'(\$|\'|\\.)
- scope: constant.character.escape.nix
- - include: interpolation
- - include: expression-cont
- - match: (?=\")
- push:
- - match: '(?=([\])};,]|\b(else|then)\b))'
- pop: true
- - include: string-quoted
- - include: expression-cont
- - match: '(~?[a-zA-Z0-9\.\_\-\+]*(\/[a-zA-Z0-9\.\_\-\+]+)+)'
- captures:
- 0: string.unquoted.path.nix
- push:
- - match: '(?=([\])};,]|\b(else|then)\b))'
- pop: true
- - include: expression-cont
- - match: '(\<[a-zA-Z0-9\.\_\-\+]+(\/[a-zA-Z0-9\.\_\-\+]+)*\>)'
- captures:
- 0: string.unquoted.spath.nix
- push:
- - match: '(?=([\])};,]|\b(else|then)\b))'
- pop: true
- - include: expression-cont
- - match: '([a-zA-Z][a-zA-Z0-9\+\-\.]*\:[a-zA-Z0-9\%\/\?\:\@\&\=\+\$\,\-\_\.\!\~\*\'']+)'
- captures:
- 0: string.unquoted.url.nix
- push:
- - match: '(?=([\])};,]|\b(else|then)\b))'
- pop: true
- - include: expression-cont
- string-quoted:
- - match: \"
- captures:
- 0: punctuation.definition.string.double.start.nix
- push:
- - meta_scope: string.quoted.double.nix
- - match: \"
- captures:
- 0: punctuation.definition.string.double.end.nix
- pop: true
- - match: \\.
- scope: constant.character.escape.nix
- - include: interpolation
- whitespace:
- - match: \s+
- with-assert:
- - match: '(?<![\w''-])(with|assert)(?![\w''-])'
- captures:
- 0: keyword.other.nix
- push:
- - match: \;
- pop: true
- - include: expression
|