Mercurial > vim
view runtime/syntax/nix.vim @ 34684:faf891660963 v9.1.0223
patch 9.1.0223: code duplication in loop to add active text properties
Commit: https://github.com/vim/vim/commit/1134fdd1b369119d0d6992e3120bb5f7c788b697
Author: Dylan Thacker-Smith <dylan.ah.smith@gmail.com>
Date: Thu Mar 28 11:49:46 2024 +0100
patch 9.1.0223: code duplication in loop to add active text properties
Problem: There are two dense conditions with duplication that needs to
be kept in sync between the while loop break condition and the
condition to skip certain text properties.
Solution: Refactor the loop by moving while loop conditions into the
body of the while loop so they can be shared with skip
conditions. `break` and an `active` variable are used to
handle the outcome of these merged conditions.
(Dylan Thacker-Smith)
closes: #14307
Signed-off-by: Dylan Thacker-Smith <dylan.ah.smith@gmail.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
author | Christian Brabandt <cb@256bit.org> |
---|---|
date | Thu, 28 Mar 2024 12:00:05 +0100 |
parents | d6dde6229b36 |
children |
line wrap: on
line source
" Vim syntax file " Language: Nix " Maintainer: James Fleming <james@electronic-quill.net> " (Github username: equill) " 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 " Last Change: 2023 Aug 19 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 syn region nixInheritAttributeSubExpr start="("ms=e+1 end="\ze)" contained contains=nixAttributeDot,@nixExpr syn region nixInheritAttributeScope start="\ze(" end=")" contained contains=nixInheritAttributeSubExpr 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\|/\*\_.\{-\}\*/\)*" " " It is also used throughout the whole file and is marked with 'v's as well. " " 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