summaryrefslogtreecommitdiffstatshomepage
path: root/runtime/syntax/python.vim
diff options
context:
space:
mode:
authorzeertzjq <zeertzjq@outlook.com>2025-09-05 17:58:57 +0800
committerzeertzjq <zeertzjq@outlook.com>2025-09-06 07:07:34 +0800
commit665d5d80ac0be2c26c12dedd305329370110deaf (patch)
tree11e023cb82a928eefdf9773b7a2ba3e614741522 /runtime/syntax/python.vim
parent069be911064d0e64f1efc13348dbb878afaf347f (diff)
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 <github@0x7e.net>
Diffstat (limited to 'runtime/syntax/python.vim')
-rw-r--r--runtime/syntax/python.vim23
1 files 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 <zpetkovic@acm.org>
-" Last Change: 2025 Aug 23
+" Last Change: 2025 Sep 05
" Credits: Neil Schemenauer <nas@python.ca>
" 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