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