Sublime Text语法:Python 3.6 f-strings

18

我正试图修改默认的Python.sublime_syntax文件,以正确处理Python的f-string文字。我的目标是将插入字符串中的表达式识别为表达式:

f"hello {person.name if person else 'there'}"
         -----------source.python----------
------string.quoted.double.block.python------

在 f-strings 中,介于单个 { 和另一个 } 之间的文本范围(但在格式说明符之前终止,如 !r}:<5} 等等——请参见 PEP 498),应该被识别为表达式。据我所知,这可能看起来像这样:

...
string:
 - match: "(?<=[^\{]\{)[^\{].*)(?=(!(s|r|a))?(:.*)?\})" # I'll need a better regex
   push: expressions

然而,在检查内置Python.sublime_syntax文件时,特别是字符串上下文,它们太笨重了,甚至无法接近(约480行?)我不知道从哪里开始。感谢任何信息。


2
使用正则表达式调试器,例如 https://regex101.com/ 可能有助于解析非常复杂的正则表达式模式。 - maackle
7
此问题现已在 Build 3127 中修复。 - Rafael
1个回答

2
BUILD 3127进行了语法高亮更新(其中包括:对Python语法高亮的显着改进)。然而,有几位用户表示,在BUILD 3176中,语法高亮仍未正确设置为突出显示f字符串中的Python表达式。根据@Jollywatt的说法,它被设置为source.python `f"string.quoted.double.block {constant.other.placeholder}"`而不是 `f"string.quoted.double.block {source.python}"`。看起来Sublime使用这个工具PackageDev,"以便为Sublime Text创建片段、语法定义等。"

2
实际上,这似乎并没有被“修复”。在Build 3176中,Python仍然像source.python f"string.quoted.double.block {constant.other.placeholder}"一样被解释,而不是source.python f"string.quoted.double.block {source.python}"。我想后者毕竟不应该是期望的行为... - Jollywatt
@Jollywatt,你的回答可能比我的更好。如果你想添加那个信息,我把我的回答改成了社区维基。 - Zev
我也在使用Build 3176,但与Atom编辑器不同的是,在f-strings中我没有看到任何普通的Python语法高亮显示。 - Kurt Peek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接