From 9809ce8b4774c782acb850fde2d99325f8173bcb Mon Sep 17 00:00:00 2001 From: zeertzjq Date: Fri, 11 Jul 2025 07:20:25 +0800 Subject: [PATCH] vim-patch:6ac2e4a: runtime(vim): Update base syntax, improve function call highlighting (#34874) - Match more function calls. - Contain function call syntax groups. - Improve differentiation between Ex commands and builtin functions with the same name. Remove special cases. Command modifiers are not currently well differentiated from functions. closes: vim/vim#17712 https://github.com/vim/vim/commit/6ac2e4aa0a565dc8cac73b33c9c099cea77212a8 Co-authored-by: Doug Kearns --- runtime/syntax/vim.vim | 58 ++++++++++--------- .../vimscript/api_functions_spec.lua | 2 +- 2 files changed, 33 insertions(+), 27 deletions(-) diff --git a/runtime/syntax/vim.vim b/runtime/syntax/vim.vim index 317df819fd..ee69457af4 100644 --- a/runtime/syntax/vim.vim +++ b/runtime/syntax/vim.vim @@ -222,7 +222,7 @@ syn case match " All vimCommands are contained by vimIsCommand. {{{2 syn cluster vimCmdList contains=vimAbb,vimAddress,vimAutocmd,vimAugroup,vimBehave,vimCall,vimCatch,vimCommandModifier,vimConst,vimDoautocmd,vimDebuggreedy,vimDef,vimDefFold,vimDelcommand,vimDelFunction,@vimEcho,vimElse,vimEnddef,vimEndfunction,vimEndif,vimExecute,vimIsCommand,vimExtCmd,vimExFilter,vimExMark,vimFiletype,vimFor,vimFunction,vimFunctionFold,vimGrep,vimGrepAdd,vimGlobal,vimHelpgrep,vimHighlight,vimImport,vimLet,vimLoadkeymap,vimLockvar,vimMake,vimMap,vimMark,vimMatch,vimNotFunc,vimNormal,vimProfdel,vimProfile,vimRedir,vimSet,vimSleep,vimSort,vimSyntax,vimSynColor,vimSynLink,vimThrow,vimUniq,vimUnlet,vimUnlockvar,vimUnmap,vimUserCmd,vimVimgrep,vimVimgrepadd,vimMenu,vimMenutranslate,@vim9CmdList,@vimExUserCmdList,vimLua,vimMzScheme,vimPerl,vimPython,vimPython3,vimPythonX,vimRuby,vimTcl syn cluster vim9CmdList contains=vim9Abstract,vim9Class,vim9Const,vim9Enum,vim9Export,vim9Final,vim9For,vim9Interface,vim9Type,vim9Var -syn match vimCmdSep "\\\@1" nextgroup=vimBang contains=vimCommand @@ -258,7 +258,7 @@ Vim9 syn match vim9LhsVariableList "\[\_[^]]\+]\ze\s\+\.\.=" contains=vimVar,@ Vim9 syn match vim9LhsRegister "@["0-9\-a-zA-Z#=*+_/]\ze\s\+\%(\.\.\)\==" -syn cluster vimExprList contains=@vimSpecialVar,vimFunc,vimNumber,vimOper,vimOperParen,vimLambda,vimString,vimVar,@vim9ExprList +syn cluster vimExprList contains=@vimSpecialVar,@vimFunc,vimNumber,vimOper,vimOperParen,vimLambda,vimString,vimVar,@vim9ExprList syn cluster vim9ExprList contains=vim9Boolean,vim9LambdaParams,vim9Null " Insertions And Appends: insert append {{{2 @@ -281,7 +281,7 @@ syn keyword vimBehaveModel contained mswin xterm " Call {{{2 " ==== -syn match vimCall "\" skipwhite nextgroup=vimFunc +syn match vimCall "\" skipwhite nextgroup=@vimFunc " Debuggreedy {{{2 " =========== @@ -351,7 +351,7 @@ syn match vimImport "\" skipwhite nextgroup=vimImportAutoload,vim " Augroup : vimAugroupError removed because long augroups caused sync'ing problems. {{{2 " ======= : Trade-off: Increasing synclines with slower editing vs augroup END error checking. -syn cluster vimAugroupList contains=@vimCmdList,vimFilter,vimFunc,vimLineComment,vimSpecFile,vimOper,vimNumber,vimOperParen,@vimComment,vimString,vimSubst,vimRegister,vimCmplxRepeat,vimNotation,vimCtrlChar,vimContinue +syn cluster vimAugroupList contains=@vimCmdList,vimFilter,@vimFunc,vimLineComment,vimSpecFile,vimOper,vimNumber,vimOperParen,@vimComment,vimString,vimSubst,vimRegister,vimCmplxRepeat,vimNotation,vimCtrlChar,vimContinue " define VimFolda syn region vimAugroup @@ -426,9 +426,9 @@ syn match vim9LambdaOperatorComment contained "#.*" skipwhite skipempty nextgrou " Functions: Tag is provided for those who wish to highlight tagged functions {{{2 " ========= -syn cluster vimFunctionBodyCommon contains=@vimCmdList,vimCmplxRepeat,vimContinue,vimCtrlChar,vimDef,vimFBVar,vimFunc,vimFunction,vimNotFunc,vimNumber,vimOper,vimOperParen,vimRegister,vimSpecFile,vimString,vimSubst,vimFunctionFold,vimDefFold,vimCmdSep +syn cluster vimFunctionBodyCommon contains=@vimCmdList,vimCmplxRepeat,vimContinue,vimCtrlChar,vimDef,vimFBVar,vimFunction,vimNotFunc,vimNumber,vimOper,vimOperParen,vimRegister,vimSpecFile,vimString,vimSubst,vimFunctionFold,vimDefFold,vimCmdSep syn cluster vimFunctionBodyList contains=@vimFunctionBodyCommon,vimComment,vimLineComment,vimInsert,vimConst,vimLet,vimSearch -syn cluster vimDefBodyList contains=@vimFunctionBodyCommon,vim9Comment,vim9LineComment,vim9Block,vim9Const,vim9Final,vim9Var,vim9Null,vim9Boolean,vim9For,vim9LhsVariable,vim9LhsVariableList,vim9LhsRegister,vim9Search,@vimSpecialVar +syn cluster vimDefBodyList contains=@vimFunctionBodyCommon,vim9Comment,vim9LineComment,vim9Block,vim9Const,vim9Final,vim9Var,vim9Null,vim9Boolean,vim9For,vim9LhsVariable,vim9LhsVariableList,vim9LhsRegister,vim9Search,@vimSpecialVar,@vim9Func syn region vimFunctionPattern contained \ matchgroup=vimOper @@ -741,7 +741,7 @@ syn match vimSpecFileMod "\(:[phtre]\)\+" contained " User-Specified Commands: {{{2 " ======================= -syn cluster vimUserCmdList contains=@vimCmdList,vimCmplxRepeat,@vimComment,vimCtrlChar,vimEscapeBrace,vimFunc,vimNotation,vimNumber,vimOper,vimRegister,vimSpecFile,vimString,vimSubst,vimSubstRep,vimSubstRange +syn cluster vimUserCmdList contains=@vimCmdList,vimCmplxRepeat,@vimComment,vimCtrlChar,vimEscapeBrace,@vimFunc,vimNotation,vimNumber,vimOper,vimRegister,vimSpecFile,vimString,vimSubst,vimSubstRep,vimSubstRange syn match vimUserCmd "\!\=" skipwhite nextgroup=vimUserCmdAttrs,vimUserCmdName contains=vimBang syn match vimUserCmd +\!\=\ze\s*\n\s*\%(\\\|["#]\\ \)+ skipwhite skipnl nextgroup=vimUserCmdAttrs,vimUserCmdName contains=vimBang @@ -967,7 +967,7 @@ syn match vimCmplxRepeat '@[0-9a-z".=@:]\ze\($\|[^a-zA-Z]\>\)' " Set command and associated set-options (vimOptions) with comment {{{2 syn match vimSet "\<\%(setl\%[ocal]\|setg\%[lobal]\|se\%[t]\)\>" skipwhite nextgroup=vimSetBang,vimCmdSep,vimComment,vimSetArgs syn region vimSetComment contained start=+"+ skip=+\n\s*\%(\\\||"\\ \)+ end="$" contains=@vimCommentGroup,vimCommentString extend -syn match vimSetCmdSep contained "|" skipwhite nextgroup=@vimCmdList,vimSubst1,vimFunc +syn match vimSetCmdSep contained "|" skipwhite nextgroup=@vimCmdList,vimSubst1,@vimFunc syn match vimSetEscape contained "\\\%(\\[|"]\|.\)" syn match vimSetBarEscape contained "\\|" syn match vimSetQuoteEscape contained +\\"+ @@ -1177,9 +1177,9 @@ syn region vimAutocmdPattern contained \ skip="\\\\\|\\[,[:space:]]" \ end="\ze[,[:space:]]" \ end="$" - \ skipwhite nextgroup=vimAutocmdPatternSep,vimAutocmdMod,vimAutocmdBlock + \ skipwhite nextgroup=vimAutocmdPatternSep,vimAutocmdMod,vimAutocmdBlock,@vimFunc \ contains=vimEnvvar,@vimWildcard,vimAutocmdPatternEscape -syn match vimAutocmdBufferPattern contained "" skipwhite nextgroup=vimAutocmdPatternSep,vimAutocmdMod,vimAutocmdBlock +syn match vimAutocmdBufferPattern contained "" skipwhite nextgroup=vimAutocmdPatternSep,vimAutocmdMod,vimAutocmdBlock,@vimFunc " trailing pattern separator comma allowed syn match vimAutocmdPatternSep contained "," skipwhite nextgroup=@vimAutocmdPattern,vimAutocmdMod,vimAutocmdBlock syn match vimAutocmdPatternEscape contained "\\." @@ -1375,6 +1375,12 @@ syn region vimMenutranslate syn match vimMenutranslateName "\%(\\\s\|\S\)\+" contained contains=vimMenuNotation,vimNotation syn match vimMenutranslateComment +".*+ contained containedin=vimMenutranslate +" If, While and Return: {{{2 +" ==================== +syn match vimNotFunc "\%#=1\<\%(if\|el\%[seif]\|retu\%[rn]\|while\)\>" skipwhite nextgroup=@vimExprList,vimNotation +syn match vimElse "\" skipwhite nextgroup=vimComment,vim9Comment +syn match vimEndif "\" skipwhite nextgroup=vimComment,vim9Comment + " Angle-Bracket Notation: (tnx to Michael Geddes) {{{2 " ====================== syn case ignore @@ -1398,17 +1404,8 @@ syn match vimNotation contained "\%#=1\%(\\\|\)\=<\%([scamd]-\)\{0,4}char-\% syn match vimBracket contained "[\\<>]" syn case match -" User Function Highlighting: {{{2 -" (following Gautam Iyer's suggestion) -" ========================== -syn match vimFunc "\%(\%([sSgGbBwWtTlL]:\|<[sS][iI][dD]>\)\=\%(\w\+\.\)*\I[a-zA-Z0-9_.]*\)\ze\s*(" skipwhite nextgroup=vimOperParen contains=vimFuncEcho,vimFuncName,vimUserFunc,vimExecute -syn match vimUserFunc contained "\%(\%([sSgGbBwWtTlL]:\|<[sS][iI][dD]>\)\=\%(\w\+\.\)*\I[a-zA-Z0-9_.]*\)\|\<\u[a-zA-Z0-9.]*\>\|\" contains=vimNotation,vim9MethodName,vim9Super,vim9This -syn keyword vimFuncEcho contained ec ech echo - -syn match vimMap "\\%([(#[]\|\s\+\%([-+*/%]\=\|\.\.\)=\)\@!' +syn match vimUsrCmd '^\s*\zs\u\%(\w*\)\@>\%([.(#[]\|\s\+\%([-+*/%]\=\|\.\.\)=\)\@!' " Vim user commands @@ -1438,12 +1435,6 @@ if !exists("g:vimsyn_noerror") && !exists("g:vimsyn_novimfunctionerror") syn match vimBufnrWarn /\" skipwhite nextgroup=@vimExprList,vimNotation -syn match vimElse "\" skipwhite nextgroup=vimComment,vim9Comment -syn match vimEndif "\" skipwhite nextgroup=vimComment,vim9Comment - " Match: {{{2 " ===== syn match vimMatch "\<[23]\=mat\%[ch]\>" skipwhite nextgroup=vimMatchGroup,vimMatchNone @@ -2065,6 +2056,20 @@ VimFoldt syn region vimTclHeredoc contained \ contains=@vimTclScript unlet s:interfaces +" Function Call Highlighting: {{{2 +" (following Gautam Iyer's suggestion) +" ========================== +syn match vimFunc contained "\<\l\w*\ze\s*(" skipwhite nextgroup=vimOperParen contains=vimFuncName +syn match vimUserFunc contained "\<\%([[:upper:]_]\|\%(\h\w*\.\)\+\h\)\w*\ze\s*(" skipwhite nextgroup=vimOperParen contains=vim9MethodName,vim9Super,vim9This +syn match vimUserFunc contained "\<\%(g:\)\=\%(\h\w*#\)\+\h\w*\ze\s*(" skipwhite nextgroup=vimOperParen contains=vimVarScope +syn match vimUserFunc contained "\%(\<[sgbwtlav]:\|<[sS][iI][dD]>\)\%(\h\w*\.\)*\h\w*\ze\s*(" skipwhite nextgroup=vimOperParen contains=vimVarScope,vimNotation + +Vim9 syn match vim9UserFunc "^\s*\zs\%([sgbwtv]:\|<[sS][iI][dD]>\)\=\%(\h\w*[.#]\)*\h\w*\ze(" skipwhite nextgroup=vimOperParen contains=vimVarScope,vimNotation,vim9MethodName,vim9Super,vim9This +Vim9 syn match vim9Func "^\s*\zs\l\w*\ze(" skipwhite nextgroup=vimOperParen contains=vimFuncName + +syn cluster vimFunc contains=vimFunc,vimUserFunc +syn cluster vim9Func contains=vim9Func,vim9UserFunc + " Beginners - Patterns that involve ^ {{{2 " ========= Vim9 syn region vim9LineComment start=+^[ \t:]*\zs#.*$+ skip=+\n\s*\\\|\n\s*#\\ + end="$" contains=@vimCommentGroup,vimCommentString,vim9CommentTitle extend @@ -2133,6 +2138,7 @@ if !exists("skip_vim_syntax_inits") hi def link vimFTError vimError hi def link vimFunctionError vimError hi def link vimFunc vimError + hi def link vim9Func vimError hi def link vimHiAttribList vimError hi def link vimHiCtermError vimError hi def link vimHiKeyError vimError diff --git a/test/functional/vimscript/api_functions_spec.lua b/test/functional/vimscript/api_functions_spec.lua index 4532f9e8ff..efb72de8ca 100644 --- a/test/functional/vimscript/api_functions_spec.lua +++ b/test/functional/vimscript/api_functions_spec.lua @@ -202,7 +202,7 @@ describe('eval-API', function() screen:expect([[ {15:call} {25:bufnr}{16:(}{26:'%'}{16:)} | {15:call} {25:nvim_input}{16:(}{26:'typing...'}{16:)} | - {15:call} not_a_function{16:(}{26:42}{16:^)} | + {15:call} {9:not_a_function}{16:(}{26:42}{16:^)} | {1:~ }|*4 | ]])