【发布时间】:2025-12-29 16:45:11
【问题描述】:
有可能吗?比如在.py和.lua文件中,不在()中,我输入=,st3会自动在两端加一个空格。比如赋值语句:
a = 1
但如果处于() 状态,它会被禁用:
func(a=1)
func(a=1,func(b=1))
【问题讨论】:
标签: sublimetext2 sublimetext3 sublimetext
有可能吗?比如在.py和.lua文件中,不在()中,我输入=,st3会自动在两端加一个空格。比如赋值语句:
a = 1
但如果处于() 状态,它会被禁用:
func(a=1)
func(a=1,func(b=1))
【问题讨论】:
标签: sublimetext2 sublimetext3 sublimetext
您可以通过在 = 键上创建一个键绑定来执行此操作,以插入一个空格,然后是 = 和另一个空格,这将检查:
如果不满足条件,则不使用键绑定,并且= 将正常插入而周围没有空格。 (假设 = 键上的其他键绑定(如果有)已评估并发现不适用。)
在 Sublime Text 中,打开 Preferences 菜单并选择 Keybindings - User。
如果文档不为空,请将文本插入符号移到文档开头的第一个 [ 字符之后。
粘贴以下内容:
{ "keys": ["="], "command": "insert", "args": { "characters": " = " }, "context":
[
{ "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true },
{ "key": "selector", "operator": "equal", "operand": "source.python, source.lua", "match_all": true },
{ "key": "preceding_text", "operator": "regex_match", "operand": "^(([^()]*+)(\\((?:(?2)|(?3))*\\))?+)(?1)*+$", "match_all": true }
]
},
如果文档之前为空,请在文档开头键入 [,在文档末尾键入 ]。这是为了确保它是一个有效的 JSON 数组。
保存文件。
在 Python 或 Lua 文档中按 = 键,当不在不平衡括号内时,它会自动在其周围插入空格。
Sublime Text 的这一方面使用了PCRE regex flavor provided by the Boost library,它支持递归,因此我们不必重复自己来判断括号是否平衡。
^行首( 开始捕获组 1
([^()]*+) - 占有性地将每个连续的非括号字符捕获到捕获组 2 中( 开始捕获组 3
\( 匹配文字 ( 字符(?:(?2)|(?3))* 递归匹配对应于捕获组 2 或 3(即递归)的相同正则表达式模式,零次或无限次\) 匹配文字 ) 字符)结束捕获组 3?+ 使上一组可选但具有所有格)结束捕获组1(?1)*+ 以所有格递归方式匹配对应于捕获组 1 的相同正则表达式模式,零次或无限次$ 要匹配的文本的结尾 - 在这种情况下,文本插入符号所在的位置,因为使用了 preceding_text 上下文。总体效果是,在插入符号位置之前的文本插入符号所在的行上,将匹配以下任何一项为真:
因为正则表达式存储在 JSON 中,\ 字符需要用额外的\ 进行转义,这就是为什么operand 字符串包含\\( 但我只在正则表达式解释。
为确保键绑定仅在 Python 和 lua 上有效,使用范围 selector 上下文,参数为 source.python, source.lua。此选择器匹配 source.python 或 source.lua,或者如果可以将一种语言嵌入到另一种语言中,则实际上两者都匹配。
在 Sublime Text 中查找语言的基本范围的一种方法是转到设置为相关语法的文档的最开头,然后转到 Tools 菜单 -> Developer - >Show Scope Name。它甚至可以处理一个空文件。
范围选择器是从 TextMate 借来的,更多关于它们的文档可以在这里找到:
关于键绑定的更多信息可以在这里找到:http://docs.sublimetext.info/en/latest/reference/key_bindings.html#structure-of-a-key-binding
我个人觉得查看默认键绑定很有用。
【讨论】: