2022-12-08 08:33:38 -07:00
|
|
|
" Vim syntax file
|
|
|
|
" Language: Nix
|
2023-08-20 17:51:38 -07:00
|
|
|
" Maintainer: James Fleming <james@electronic-quill.net>
|
|
|
|
" (Github username: equill)
|
2022-12-08 08:33:38 -07:00
|
|
|
" Original Author: Daiderd Jordan <daiderd@gmail.com>
|
|
|
|
" Acknowledgement: Based on vim-nix maintained by Daiderd Jordan <daiderd@gmail.com>
|
|
|
|
" https://github.com/LnL7/vim-nix
|
|
|
|
" License: MIT
|
2023-08-20 17:51:38 -07:00
|
|
|
" Last Change: 2023 Aug 19
|
2022-12-08 08:33:38 -07:00
|
|
|
|
|
|
|
if exists("b:current_syntax")
|
|
|
|
finish
|
|
|
|
endif
|
|
|
|
|
|
|
|
let s:cpo_save = &cpo
|
|
|
|
set cpo&vim
|
|
|
|
|
|
|
|
syn keyword nixBoolean true false
|
|
|
|
syn keyword nixNull null
|
|
|
|
syn keyword nixRecKeyword rec
|
|
|
|
|
|
|
|
syn keyword nixOperator or
|
|
|
|
syn match nixOperator '!=\|!'
|
|
|
|
syn match nixOperator '<=\?'
|
|
|
|
syn match nixOperator '>=\?'
|
|
|
|
syn match nixOperator '&&'
|
|
|
|
syn match nixOperator '//\='
|
|
|
|
syn match nixOperator '=='
|
|
|
|
syn match nixOperator '?'
|
|
|
|
syn match nixOperator '||'
|
|
|
|
syn match nixOperator '++\='
|
|
|
|
syn match nixOperator '-'
|
|
|
|
syn match nixOperator '\*'
|
|
|
|
syn match nixOperator '->'
|
|
|
|
|
|
|
|
syn match nixParen '[()]'
|
|
|
|
syn match nixInteger '\d\+'
|
|
|
|
|
|
|
|
syn keyword nixTodo FIXME NOTE TODO OPTIMIZE XXX HACK contained
|
|
|
|
syn match nixComment '#.*' contains=nixTodo,@Spell
|
|
|
|
syn region nixComment start=+/\*+ end=+\*/+ contains=nixTodo,@Spell
|
|
|
|
|
|
|
|
syn region nixInterpolation matchgroup=nixInterpolationDelimiter start="\${" end="}" contained contains=@nixExpr,nixInterpolationParam
|
|
|
|
|
|
|
|
syn match nixSimpleStringSpecial /\\\%([nrt"\\$]\|$\)/ contained
|
|
|
|
syn match nixStringSpecial /''['$]/ contained
|
|
|
|
syn match nixStringSpecial /\$\$/ contained
|
|
|
|
syn match nixStringSpecial /''\\[nrt]/ contained
|
|
|
|
|
|
|
|
syn match nixSimpleStringSpecial /\$\$/ contained
|
|
|
|
|
|
|
|
syn match nixInvalidSimpleStringEscape /\\[^nrt"\\$]/ contained
|
|
|
|
syn match nixInvalidStringEscape /''\\[^nrt]/ contained
|
|
|
|
|
|
|
|
syn region nixSimpleString matchgroup=nixStringDelimiter start=+"+ skip=+\\"+ end=+"+ contains=nixInterpolation,nixSimpleStringSpecial,nixInvalidSimpleStringEscape
|
|
|
|
syn region nixString matchgroup=nixStringDelimiter start=+''+ skip=+''['$\\]+ end=+''+ contains=nixInterpolation,nixStringSpecial,nixInvalidStringEscape
|
|
|
|
|
|
|
|
syn match nixFunctionCall "[a-zA-Z_][a-zA-Z0-9_'-]*"
|
|
|
|
|
|
|
|
syn match nixPath "[a-zA-Z0-9._+-]*\%(/[a-zA-Z0-9._+-]\+\)\+"
|
|
|
|
syn match nixHomePath "\~\%(/[a-zA-Z0-9._+-]\+\)\+"
|
|
|
|
syn match nixSearchPath "[a-zA-Z0-9._+-]\+\%(\/[a-zA-Z0-9._+-]\+\)*" contained
|
|
|
|
syn match nixPathDelimiter "[<>]" contained
|
|
|
|
syn match nixSearchPathRef "<[a-zA-Z0-9._+-]\+\%(\/[a-zA-Z0-9._+-]\+\)*>" contains=nixSearchPath,nixPathDelimiter
|
|
|
|
syn match nixURI "[a-zA-Z][a-zA-Z0-9.+-]*:[a-zA-Z0-9%/?:@&=$,_.!~*'+-]\+"
|
|
|
|
|
|
|
|
syn match nixAttributeDot "\." contained
|
|
|
|
syn match nixAttribute "[a-zA-Z_][a-zA-Z0-9_'-]*\ze\%([^a-zA-Z0-9_'.-]\|$\)" contained
|
|
|
|
syn region nixAttributeAssignment start="=" end="\ze;" contained contains=@nixExpr
|
|
|
|
syn region nixAttributeDefinition start=/\ze[a-zA-Z_"$]/ end=";" contained contains=nixComment,nixAttribute,nixInterpolation,nixSimpleString,nixAttributeDot,nixAttributeAssignment
|
|
|
|
|
2023-08-20 17:51:38 -07:00
|
|
|
syn region nixInheritAttributeSubExpr start="("ms=e+1 end="\ze)" contained contains=nixAttributeDot,@nixExpr
|
|
|
|
syn region nixInheritAttributeScope start="\ze(" end=")" contained contains=nixInheritAttributeSubExpr
|
2022-12-08 08:33:38 -07:00
|
|
|
syn region nixAttributeDefinition matchgroup=nixInherit start="\<inherit\>" end=";" contained contains=nixComment,nixInheritAttributeScope,nixAttribute
|
|
|
|
|
|
|
|
syn region nixAttributeSet start="{" end="}" contains=nixComment,nixAttributeDefinition
|
|
|
|
|
|
|
|
" vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
|
|
|
|
syn region nixArgumentDefinitionWithDefault matchgroup=nixArgumentDefinition start="[a-zA-Z_][a-zA-Z0-9_'-]*\ze\%(\s\|#.\{-\}\n\|\n\|/\*\_.\{-\}\*/\)*?\@=" matchgroup=NONE end="[,}]\@=" transparent contained contains=@nixExpr
|
|
|
|
" vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
|
|
|
|
syn match nixArgumentDefinition "[a-zA-Z_][a-zA-Z0-9_'-]*\ze\%(\s\|#.\{-\}\n\|\n\|/\*\_.\{-\}\*/\)*[,}]\@=" contained
|
|
|
|
syn match nixArgumentEllipsis "\.\.\." contained
|
|
|
|
syn match nixArgumentSeparator "," contained
|
|
|
|
|
|
|
|
" vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
|
|
|
|
syn match nixArgOperator '@\%(\s\|#.\{-\}\n\|\n\|/\*\_.\{-\}\*/\)*[a-zA-Z_][a-zA-Z0-9_'-]*\%(\s\|#.\{-\}\n\|\n\|/\*\_.\{-\}\*/\)*:'he=s+1 contained contains=nixAttribute
|
|
|
|
|
|
|
|
" vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
|
|
|
|
syn match nixArgOperator '[a-zA-Z_][a-zA-Z0-9_'-]*\%(\s\|#.\{-\}\n\|\n\|/\*\_.\{-\}\*/\)*@'hs=e-1 contains=nixAttribute nextgroup=nixFunctionArgument
|
|
|
|
|
|
|
|
" This is a bit more complicated, because function arguments can be passed in a
|
|
|
|
" very similar form on how attribute sets are defined and two regions with the
|
|
|
|
" same start patterns will shadow each other. Instead of a region we could use a
|
|
|
|
" match on {\_.\{-\}}, which unfortunately doesn't take nesting into account.
|
|
|
|
"
|
|
|
|
" So what we do instead is that we look forward until we are sure that it's a
|
|
|
|
" function argument. Unfortunately, we need to catch comments and both vertical
|
|
|
|
" and horizontal white space, which the following regex should hopefully do:
|
|
|
|
"
|
|
|
|
" "\%(\s\|#.\{-\}\n\|\n\|/\*\_.\{-\}\*/\)*"
|
|
|
|
"
|
2023-10-16 01:36:25 -07:00
|
|
|
" It is also used throughout the whole file and is marked with 'v's as well.
|
2022-12-08 08:33:38 -07:00
|
|
|
"
|
|
|
|
" Fortunately the matching rules for function arguments are much simpler than
|
|
|
|
" for real attribute sets, because we can stop when we hit the first ellipsis or
|
|
|
|
" default value operator, but we also need to paste the "whitespace & comments
|
|
|
|
" eating" regex all over the place (marked with 'v's):
|
|
|
|
"
|
|
|
|
" Region match 1: { foo ? ... } or { foo, ... } or { ... } (ellipsis)
|
|
|
|
" vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv {----- identifier -----}vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
|
|
|
|
syn region nixFunctionArgument start="{\ze\%(\s\|#.\{-\}\n\|\n\|/\*\_.\{-\}\*/\)*\%([a-zA-Z_][a-zA-Z0-9_'-]*\%(\s\|#.\{-\}\n\|\n\|/\*\_.\{-\}\*/\)*[,?}]\|\.\.\.\)" end="}" contains=nixComment,nixArgumentDefinitionWithDefault,nixArgumentDefinition,nixArgumentEllipsis,nixArgumentSeparator nextgroup=nixArgOperator
|
|
|
|
|
|
|
|
" Now it gets more tricky, because we need to look forward for the colon, but
|
|
|
|
" there could be something like "{}@foo:", even though it's highly unlikely.
|
|
|
|
"
|
|
|
|
" Region match 2: {}
|
|
|
|
" vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv@vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv{----- identifier -----} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
|
|
|
|
syn region nixFunctionArgument start="{\ze\%(\s\|#.\{-\}\n\|\n\|/\*\_.\{-\}\*/\)*}\%(\%(\s\|#.\{-\}\n\|\n\|/\*\_.\{-\}\*/\)*@\%(\s\|#.\{-\}\n\|\n\|/\*\_.\{-\}\*/\)*[a-zA-Z_][a-zA-Z0-9_'-]*\)\%(\s\|#.\{-\}\n\|\n\|/\*\_.\{-\}\*/\)*:" end="}" contains=nixComment nextgroup=nixArgOperator
|
|
|
|
|
|
|
|
" vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
|
|
|
|
syn match nixSimpleFunctionArgument "[a-zA-Z_][a-zA-Z0-9_'-]*\ze\%(\s\|#.\{-\}\n\|\n\|/\*\_.\{-\}\*/\)*:\([\n ]\)\@="
|
|
|
|
|
|
|
|
syn region nixList matchgroup=nixListBracket start="\[" end="\]" contains=@nixExpr
|
|
|
|
|
|
|
|
syn region nixLetExpr matchgroup=nixLetExprKeyword start="\<let\>" end="\<in\>" contains=nixComment,nixAttributeDefinition
|
|
|
|
|
|
|
|
syn keyword nixIfExprKeyword then contained
|
|
|
|
syn region nixIfExpr matchgroup=nixIfExprKeyword start="\<if\>" end="\<else\>" contains=@nixExpr,nixIfExprKeyword
|
|
|
|
|
|
|
|
syn region nixWithExpr matchgroup=nixWithExprKeyword start="\<with\>" matchgroup=NONE end=";" contains=@nixExpr
|
|
|
|
|
|
|
|
syn region nixAssertExpr matchgroup=nixAssertKeyword start="\<assert\>" matchgroup=NONE end=";" contains=@nixExpr
|
|
|
|
|
|
|
|
syn cluster nixExpr contains=nixBoolean,nixNull,nixOperator,nixParen,nixInteger,nixRecKeyword,nixConditional,nixBuiltin,nixSimpleBuiltin,nixComment,nixFunctionCall,nixFunctionArgument,nixArgOperator,nixSimpleFunctionArgument,nixPath,nixHomePath,nixSearchPathRef,nixURI,nixAttributeSet,nixList,nixSimpleString,nixString,nixLetExpr,nixIfExpr,nixWithExpr,nixAssertExpr,nixInterpolation
|
|
|
|
|
|
|
|
" These definitions override @nixExpr and have to come afterwards:
|
|
|
|
|
|
|
|
syn match nixInterpolationParam "[a-zA-Z_][a-zA-Z0-9_'-]*\%(\.[a-zA-Z_][a-zA-Z0-9_'-]*\)*" contained
|
|
|
|
|
|
|
|
" Non-namespaced Nix builtins as of version 2.0:
|
|
|
|
syn keyword nixSimpleBuiltin
|
|
|
|
\ abort baseNameOf derivation derivationStrict dirOf fetchGit
|
|
|
|
\ fetchMercurial fetchTarball import isNull map mapAttrs placeholder removeAttrs
|
|
|
|
\ scopedImport throw toString
|
|
|
|
|
|
|
|
|
|
|
|
" Namespaced and non-namespaced Nix builtins as of version 2.0:
|
|
|
|
syn keyword nixNamespacedBuiltin contained
|
|
|
|
\ abort add addErrorContext all any attrNames attrValues baseNameOf
|
|
|
|
\ catAttrs compareVersions concatLists concatStringsSep currentSystem
|
|
|
|
\ currentTime deepSeq derivation derivationStrict dirOf div elem elemAt
|
|
|
|
\ fetchGit fetchMercurial fetchTarball fetchurl filter \ filterSource
|
|
|
|
\ findFile foldl' fromJSON functionArgs genList \ genericClosure getAttr
|
|
|
|
\ getEnv hasAttr hasContext hashString head import intersectAttrs isAttrs
|
|
|
|
\ isBool isFloat isFunction isInt isList isNull isString langVersion
|
|
|
|
\ length lessThan listToAttrs map mapAttrs match mul nixPath nixVersion
|
|
|
|
\ parseDrvName partition path pathExists placeholder readDir readFile
|
|
|
|
\ removeAttrs replaceStrings scopedImport seq sort split splitVersion
|
|
|
|
\ storeDir storePath stringLength sub substring tail throw toFile toJSON
|
|
|
|
\ toPath toString toXML trace tryEval typeOf unsafeDiscardOutputDependency
|
|
|
|
\ unsafeDiscardStringContext unsafeGetAttrPos valueSize fromTOML bitAnd
|
|
|
|
\ bitOr bitXor floor ceil
|
|
|
|
|
|
|
|
syn match nixBuiltin "builtins\.[a-zA-Z']\+"he=s+9 contains=nixComment,nixNamespacedBuiltin
|
|
|
|
|
|
|
|
hi def link nixArgOperator Operator
|
|
|
|
hi def link nixArgumentDefinition Identifier
|
|
|
|
hi def link nixArgumentEllipsis Operator
|
|
|
|
hi def link nixAssertKeyword Keyword
|
|
|
|
hi def link nixAttribute Identifier
|
|
|
|
hi def link nixAttributeDot Operator
|
|
|
|
hi def link nixBoolean Boolean
|
|
|
|
hi def link nixBuiltin Special
|
|
|
|
hi def link nixComment Comment
|
|
|
|
hi def link nixConditional Conditional
|
|
|
|
hi def link nixHomePath Include
|
|
|
|
hi def link nixIfExprKeyword Keyword
|
|
|
|
hi def link nixInherit Keyword
|
|
|
|
hi def link nixInteger Integer
|
|
|
|
hi def link nixInterpolation Macro
|
|
|
|
hi def link nixInterpolationDelimiter Delimiter
|
|
|
|
hi def link nixInterpolationParam Macro
|
|
|
|
hi def link nixInvalidSimpleStringEscape Error
|
|
|
|
hi def link nixInvalidStringEscape Error
|
|
|
|
hi def link nixLetExprKeyword Keyword
|
|
|
|
hi def link nixNamespacedBuiltin Special
|
|
|
|
hi def link nixNull Constant
|
|
|
|
hi def link nixOperator Operator
|
|
|
|
hi def link nixPath Include
|
|
|
|
hi def link nixPathDelimiter Delimiter
|
|
|
|
hi def link nixRecKeyword Keyword
|
|
|
|
hi def link nixSearchPath Include
|
|
|
|
hi def link nixSimpleBuiltin Keyword
|
|
|
|
hi def link nixSimpleFunctionArgument Identifier
|
|
|
|
hi def link nixSimpleString String
|
|
|
|
hi def link nixSimpleStringSpecial SpecialChar
|
|
|
|
hi def link nixString String
|
|
|
|
hi def link nixStringDelimiter Delimiter
|
|
|
|
hi def link nixStringSpecial Special
|
|
|
|
hi def link nixTodo Todo
|
|
|
|
hi def link nixURI Include
|
|
|
|
hi def link nixWithExprKeyword Keyword
|
|
|
|
|
|
|
|
" This could lead up to slow syntax highlighting for large files, but usually
|
|
|
|
" large files such as all-packages.nix are one large attribute set, so if we'd
|
|
|
|
" use sync patterns we'd have to go back to the start of the file anyway
|
|
|
|
syn sync fromstart
|
|
|
|
|
|
|
|
let b:current_syntax = "nix"
|
|
|
|
|
|
|
|
let &cpo = s:cpo_save
|
|
|
|
unlet s:cpo_save
|