Mercurial > vim
view runtime/syntax/nix.vim @ 33988:7c30841c60a0 v9.0.2180
patch 9.0.2180: POSIX function name in exarg causes issues
Commit: https://github.com/vim/vim/commit/6fdb6280821a822768df5689a5d727e37d38306c
Author: Zoltan Arpadffy <zoltan.arpadffy@gmail.com>
Date: Tue Dec 19 20:53:07 2023 +0100
patch 9.0.2180: POSIX function name in exarg causes issues
Problem: POSIX function name in exarg struct causes issues
on OpenVMS
Solution: Rename getline member in exarg struct to ea_getline,
remove isinf() workaround for VMS
There are compilers that do not treat well POSIX functions - like
getline - usage in the structs.
Older VMS compilers could digest this... but the newer OpenVMS compilers
( like VSI C x86-64 X7.4-843 (GEM 50XB9) ) cannot deal with these
structs. This could be limited to getline() that is defined via
getdelim() and might not affect all POSIX functions in general - but
avoiding POSIX function names usage in the structs is a "safe side"
practice without compromising the functionality or the code readability.
The previous OpenVMS X86 port used a workaround limiting the compiler
capabilities using __CRTL_VER_OVERRIDE=80400000
In order to make the OpenVMS port future proof, this pull request
proposes a possible solution.
closes: #13704
Signed-off-by: Zoltan Arpadffy <zoltan.arpadffy@gmail.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
author | Christian Brabandt <cb@256bit.org> |
---|---|
date | Tue, 19 Dec 2023 21:00:04 +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