|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609 |
- %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
|