neovim

Neovim text editor
git clone https://git.dasho.dev/neovim.git
Log | Files | Refs | README

commit 138922497fc76d9d0a561981a25c0648fdfce7ae
parent e0b724de09c287cd47f2669cdc47e4c3835ae083
Author: zeertzjq <zeertzjq@outlook.com>
Date:   Sat, 24 Jan 2026 09:15:41 +0800

Merge pull request #37529 from zeertzjq/vim-95bb4ef

vim-patch: runtime file updates
Diffstat:
Mruntime/ftplugin/csh.vim | 68+++++++++++++++++++++++++++++++++++++++++++++-----------------------
Mruntime/syntax/csh.vim | 12+++++-------
Mruntime/syntax/tcsh.vim | 37+++++++++++++++++++------------------
3 files changed, 69 insertions(+), 48 deletions(-)

diff --git a/runtime/ftplugin/csh.vim b/runtime/ftplugin/csh.vim @@ -3,9 +3,8 @@ " Maintainer: Doug Kearns <dougkearns@gmail.com> " Previous Maintainer: Dan Sharp " Contributor: Johannes Zellner <johannes@zellner.org> -" Last Change: 2024 Jan 14 -" 2024 May 23 by Riley Bruins ('commentstring') -" 2026 Jan 15 improved matchit support +" Riley Bruins <ribru17@gmail.com> +" Last Change: 2026 Jan 16 if exists("b:did_ftplugin") finish @@ -22,29 +21,52 @@ setlocal formatoptions+=crql let b:undo_ftplugin = "setlocal com< cms< fo<" -" Csh: thanks to Johannes Zellner -" - Both foreach and end must appear alone on separate lines. -" - The words else and endif must appear at the beginning of input lines; -" the if must appear alone on its input line or after an else. -" - Each case label and the default label must appear at the start of a -" line. -" - while and end must appear alone on their input lines. if exists("loaded_matchit") && !exists("b:match_words") - let s:line_start = '\%(^\s*\)\@<=' - let b:match_words = - \ s:line_start .. 'if\s*!\?\s*(.*)\s*then\>:' .. - \ s:line_start .. 'else\s\+if\s*(.*)\s*then\>:' .. s:line_start .. 'else\>:' .. - \ s:line_start .. 'endif\>,' .. - \ s:line_start .. '\%(\<foreach\s\+\h\w*\|while\)\s*(:' .. - \ '\<break\>:\<continue\>:' .. - \ s:line_start .. 'end\>,' .. - \ s:line_start .. 'switch\s*(:' .. - \ s:line_start .. 'case\s\+:' .. s:line_start .. 'default\>:\<breaksw\>:' .. - \ s:line_start .. 'endsw\>' - unlet s:line_start - let b:undo_ftplugin ..= " | unlet! b:match_words" + let b:match_ignorecase = 0 + let b:match_words = "CshMatchWords()" + let b:match_skip = "CshMatchSkip()" + let b:undo_ftplugin ..= " | unlet! b:match_ignorecase b:match_skip b:match_words" endif +" skip single line 'if' commands +function CshMatchSkip() + return getline(".") =~# '^\s*if\>' && !s:CshIsIfThenCommand() +endfunction + +function CshMatchWords() + let line_start = '\%(^\s*\)\@<=' + let match_words = + \ line_start .. '\%(foreach\s\+\h\w*\s*(\|while\>\):' .. + \ '\<break\>:\<continue\>:' .. + \ line_start .. 'end\>,' .. + \ line_start .. 'switch\s*(:' .. + \ line_start .. 'case\s\+:' .. line_start .. 'default\>:\<breaksw\>:' .. + \ line_start .. 'endsw\>' + + if expand("<cword>") =~# '\<if\>' && !s:CshIsIfThenCommand() + return match_words + else + return match_words .. "," .. + \ line_start .. 'if\>:' .. + \ line_start .. 'else\s\+if\>:' .. line_start .. 'else\>:' .. + \ line_start .. 'endif\>' + endif +endfunction + +function s:CshIsIfThenCommand() + let lnum = line(".") + let line = getline(lnum) + + " join continued lines + while lnum < line("$") && line =~ '^\%([^\\]\|\\\\\)*\\$' + let lnum += 1 + let line = substitute(line, '\\$', '', '') .. getline(lnum) + endwhile + + " TODO: confirm with syntax checks when the highlighting is more accurate + return line =~# '^\s*if\>.*\<then\s*\%(#.*\)\=$' +endfunction + if (has("gui_win32") || has("gui_gtk")) && !exists("b:browsefilter") let b:browsefilter = "csh Scripts (*.csh)\t*.csh\n" if has("win32") diff --git a/runtime/syntax/csh.vim b/runtime/syntax/csh.vim @@ -1,10 +1,8 @@ " Vim syntax file -" Language: C-shell (csh) -" Maintainer: This runtime file is looking for a new maintainer. -" Former Maintainer: Charles E. Campbell -" Last Change: Aug 31, 2016 -" Version: 14 -" Former URL: http://www.drchip.org/astronaut/vim/index.html#SYNTAX_CSH +" Language: C-shell (csh) +" Maintainer: Doug Kearns <dougkearns@gmail.com> +" Former Maintainer: Charles E. Campbell +" Last Change: 2026 Jan 16 " quit when a syntax file was already loaded if exists("b:current_syntax") @@ -40,7 +38,7 @@ syn region cshDblQuote start=+^"+ skip=+\\\\\|\\"+ end=+"+ contains=cshSpecial syn region cshSnglQuote start=+^'+ skip=+\\\\\|\\'+ end=+'+ contains=cshNoEndlineSQ,@Spell syn region cshBckQuote start=+^`+ skip=+\\\\\|\\`+ end=+`+ contains=cshNoEndlineBQ,@Spell syn cluster cshCommentGroup contains=cshTodo,@Spell -syn match cshComment "#.*$" contains=@cshCommentGroup +syn match cshComment "#.*" contains=@cshCommentGroup " A bunch of useful csh keywords syn keyword cshStatement alias end history onintr setenv unalias diff --git a/runtime/syntax/tcsh.vim b/runtime/syntax/tcsh.vim @@ -2,7 +2,7 @@ " Language: tcsh scripts " Maintainer: Doug Kearns <dougkearns@gmail.com> " Previous Maintainer: Gautam Iyer <gi1242+vim@NoSpam.com> where NoSpam=gmail (Original Author) -" Last Change: 2021 Oct 15 +" Last Change: 2026 Jan 16 " Description: We break up each statement into a "command" and an "end" part. " All groups are either a "command" or part of the "end" of a statement (ie @@ -129,11 +129,12 @@ syn match tcshExprEnd contained '\v.*$'hs=e+1 contains=@tcshConditions syn match tcshExprEnd contained '\v.{-};'hs=e contains=@tcshConditions " ----- Comments: ----- {{{1 -syn match tcshComment '#\s.*' contains=tcshTodo,tcshCommentTi,@Spell -syn match tcshComment '\v#($|\S.*)' contains=tcshTodo,tcshCommentTi -syn match tcshSharpBang '^#! .*$' -syn match tcshCommentTi contained '\v#\s*\u\w*(\s+\u\w*)*:'hs=s+1 contains=tcshTodo -syn match tcshTodo contained '\v\c<todo>' +syn match tcshSharpBang '\%^#!.*$' +syn match tcshComment '#.*' contains=tcshTodo,@Spell +syn match tcshTodo contained '\v%(^\s*#\s*)@<=\c<%(TODO|FIXME|XXX)>' + +" TODO: leading whitespace match is needed to prevent keyword matching +syn match tcshLabel '^\s*\w\+:\ze\s*$' " ----- Strings ----- {{{1 " Tcsh does not allow \" in strings unless the "backslash_quote" shell @@ -141,14 +142,14 @@ syn match tcshTodo contained '\v\c<todo>' " want VIM to assume that no backslash quote constructs exist. " Backquotes are treated as commands, and are not contained in anything -if exists('tcsh_backslash_quote') && tcsh_backslash_quote == 0 - syn region tcshSQuote keepend contained start="\v\\@<!'" end="'" - syn region tcshDQuote keepend contained start='\v\\@<!"' end='"' contains=@tcshVarList,tcshSpecial,@Spell - syn region tcshBQuote keepend start='\v\\@<!`' end='`' contains=@tcshStatements +if get(g:, 'tcsh_backslash_quote', 1) + syn region tcshSQuote contained start="'" skip="\v\\\\|\\'" end="'" + syn region tcshDQuote contained start='"' end='"' contains=@tcshVarList,tcshSpecial,@Spell + syn region tcshBQuote keepend matchgroup=tcshBQuoteGrp start='`' skip='\v\\\\|\\`' end='`' contains=@tcshStatements else - syn region tcshSQuote contained start="\v\\@<!'" skip="\v\\\\|\\'" end="'" - syn region tcshDQuote contained start='\v\\@<!"' end='"' contains=@tcshVarList,tcshSpecial,@Spell - syn region tcshBQuote keepend matchgroup=tcshBQuoteGrp start='\v\\@<!`' skip='\v\\\\|\\`' end='`' contains=@tcshStatements + syn region tcshSQuote keepend contained start="'" end="'" + syn region tcshDQuote keepend contained start='"' end='"' contains=@tcshVarList,tcshSpecial,@Spell + syn region tcshBQuote keepend start='`' end='`' contains=@tcshStatements endif " ----- Variables ----- {{{1 @@ -181,8 +182,8 @@ syn match tcshRedir contained '\v\<|\>\>?\&?!?' syn match tcshMeta contained '\v[]{}*?[]' " Here documents (<<) -syn region tcshHereDoc contained matchgroup=tcshShellVar start='\v\<\<\s*\z(\h\w*)' end='^\z1$' contains=@tcshVarList,tcshSpecial -syn region tcshHereDoc contained matchgroup=tcshShellVar start="\v\<\<\s*'\z(\h\w*)'" start='\v\<\<\s*"\z(\h\w*)"$' start='\v\<\<\s*\\\z(\h\w*)$' end='^\z1$' +syn region tcshHereDoc contained matchgroup=tcshShellVar start='\v\<\<\s*\z(\h\w*)' end='^\z1$' contains=@tcshVarList,tcshSpecial fold +syn region tcshHereDoc contained matchgroup=tcshShellVar start="\v\<\<\s*'\z(\h\w*)'" start='\v\<\<\s*"\z(\h\w*)"$' start='\v\<\<\s*\\\z(\h\w*)$' end='^\z1$' fold " Operators syn match tcshOperator contained '&&\|!\~\|!=\|<<\|<=\|==\|=\~\|>=\|>>\|\*\|\^\|\~\|||\|!\|%\|&\|+\|-\|/\|<\|>\||' @@ -226,10 +227,9 @@ hi def link tcshExprVar tcshUsrVar hi def link tcshExprOp tcshOperator hi def link tcshExprEnd tcshOperator hi def link tcshComment Comment -hi def link tcshCommentTi Preproc -hi def link tcshSharpBang tcshCommentTi +hi def link tcshSharpBang PreProc hi def link tcshTodo Todo -hi def link tcshSQuote Constant +hi def link tcshSQuote String hi def link tcshDQuote tcshSQuote hi def link tcshBQuoteGrp Include hi def link tcshVarError Error @@ -245,6 +245,7 @@ hi def link tcshOperator Operator hi def link tcshNumber Number hi def link tcshArgument Special hi def link tcshSpecial SpecialChar +hi def link tcshLabel Label " }}} let &cpo = s:oldcpo