From 665d5d80ac0be2c26c12dedd305329370110deaf Mon Sep 17 00:00:00 2001 From: zeertzjq Date: Fri, 5 Sep 2025 17:58:57 +0800 Subject: [PATCH] vim-patch:d2b28dd: runtime(python): add syntax support inside f-strings fixes: vim/vim#14033 closes: vim/vim#17962 https://github.com/vim/vim/commit/d2b28ddfc2a7350c2f63b75d06cc53d17b3a66ff Co-authored-by: Rob B --- runtime/syntax/python.vim | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/runtime/syntax/python.vim b/runtime/syntax/python.vim index 61903802a6..ec3be3422b 100644 --- a/runtime/syntax/python.vim +++ b/runtime/syntax/python.vim @@ -1,7 +1,7 @@ " Vim syntax file " Language: Python " Maintainer: Zvezdan Petkovic -" Last Change: 2025 Aug 23 +" Last Change: 2025 Sep 05 " Credits: Neil Schemenauer " Dmitry Vasiliev " Rob B @@ -218,21 +218,24 @@ syn region pythonRawBytes " F-string replacement fields " -" - Matched parentheses, brackets and braces are ignored -" - A bare # is ignored to end of line -" - A bare = (surrounded by optional whitespace) enables debugging -" - A bare ! prefixes a conversion field +" - Matched parentheses, brackets and braces are skipped +" - A bare = (followed by optional whitespace) enables debugging +" - A bare ! prefixes a conversion field (followed by optional whitespace) " - A bare : begins a format specification -" - Matched braces inside a format specification are ignored +" - Matched braces inside a format specification are skipped " syn region pythonFStringField \ matchgroup=pythonFStringDelimiter \ start=/{/ - \ skip=/([^)]*)\|\[[^]]*]\|{[^}]*}\|#.*$/ - \ end=/\%(\s*=\s*\)\=\%(!\a\)\=\%(:\%({[^}]*}\|[^}]*\)\+\)\=}/ + \ end=/\%(=\s*\)\=\%(!\a\s*\)\=\%(:\%({\_[^}]*}\|[^{}]*\)\+\)\=}/ \ contained -" Doubled braces and Unicode escapes are not replacement fields -syn match pythonFStringSkip /{{\|\\N{/ transparent contained contains=NONE + \ contains=ALLBUT,pythonFStringField,pythonClass,pythonFunction,pythonDoctest,pythonDoctestValue,@Spell +syn match pythonFStringFieldSkip /(\_[^()]*)\|\[\_[^][]*]\|{\_[^{}]*}/ + \ contained + \ contains=ALLBUT,pythonFStringField,pythonClass,pythonFunction,pythonDoctest,pythonDoctestValue,@Spell + +" Doubled braces are not replacement fields +syn match pythonFStringSkip /{{/ transparent contained contains=NONE syn match pythonEscape +\\[abfnrtv'"\\]+ contained syn match pythonEscape "\\\o\{1,3}" contained