From 08e29ec4a148aece61a857c41d2f244b18122743 Mon Sep 17 00:00:00 2001 From: zeertzjq Date: Tue, 14 Oct 2025 10:44:06 +0800 Subject: [PATCH] vim-patch:5485827: runtime(rst): Recognise numeric footnotes [1] correctly The markup for footonotes [1] and citations [2] are almost identical. The difference is that footnotes allow numeric values but citations allow every valid reference name except numeric values. The regex for matching citations currently only checks for valid reference names but does not exclude number-only labels, thus also matches numeric footnotes. To match such footnotes, e.g. ``[1]`` define the syntax rule for footnotes after the syntax rule for citations so it gets higher precedence and matches first. [1] https://docutils.sourceforge.io/docs/ref/rst/restructuredtext.html#footnotes [2] https://docutils.sourceforge.io/docs/ref/rst/restructuredtext.html#citations related: vim/vim#18566 https://github.com/vim/vim/commit/5485827c5f872884dab83607e89562c8db4899c4 Co-authored-by: Kirk Roemer <91125534+kirk-roemer@users.noreply.github.com> --- runtime/syntax/rst.vim | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/runtime/syntax/rst.vim b/runtime/syntax/rst.vim index 8094d8771b..308ae5d68f 100644 --- a/runtime/syntax/rst.vim +++ b/runtime/syntax/rst.vim @@ -66,17 +66,20 @@ syn region rstComment \ start='\v^\z(\s*)\.\.(\_s+[\[|_]|\_s+.*::)@!' skip=+^$+ end=/^\(\z1 \)\@!/ \ contains=@Spell,rstTodo +" Note: Order matters for rstCitation and rstFootnote as the regex for +" citations also matches numeric only patterns, e.g. [1], which are footnotes. +" Since we define rstFootnote after rstCitation, it takes precedence, see +" |:syn-define|. +execute 'syn region rstCitation contained matchgroup=rstDirective' . + \ ' start=+\[' . s:ReferenceName . '\]\_s+' . + \ ' skip=+^$+' . + \ ' end=+^\s\@!+ contains=@Spell,@rstCruft' execute 'syn region rstFootnote contained matchgroup=rstDirective' . \ ' start=+\[\%(\d\+\|#\%(' . s:ReferenceName . '\)\=\|\*\)\]\_s+' . \ ' skip=+^$+' . \ ' end=+^\s\@!+ contains=@rstCruft,@NoSpell' -execute 'syn region rstCitation contained matchgroup=rstDirective' . - \ ' start=+\[' . s:ReferenceName . '\]\_s+' . - \ ' skip=+^$+' . - \ ' end=+^\s\@!+ contains=@rstCruft,@NoSpell' - syn region rstHyperlinkTarget contained matchgroup=rstDirective \ start='_\%(_\|[^:\\]*\%(\\.[^:\\]*\)*\):\_s' skip=+^$+ end=+^\s\@!+