【问题标题】:How to add space to both ends of a equal-sign when not in parentheses with specified file types?当不在括号中指定文件类型时,如何在等号的两端添加空格?
【发布时间】:2025-12-29 16:45:11
【问题描述】:

有可能吗?比如在.py.lua文件中,不在()中,我输入=,st3会自动在两端加一个空格。比如赋值语句:

a = 1

但如果处于() 状态,它会被禁用:

func(a=1) 
func(a=1,func(b=1))

【问题讨论】:

    标签: sublimetext2 sublimetext3 sublimetext


    【解决方案1】:

    您可以通过在 = 键上创建一个键绑定来执行此操作,以插入一个空格,然后是 = 和另一个空格,这将检查:

    • 插入符号处的语法对应于 Python 或 Lua
    • 行首和文本插入符号之间的文本不包含不平衡的括号

    如果不满足条件,则不使用键绑定,并且= 将正常插入而周围没有空格。 (假设 = 键上的其他键绑定(如果有)已评估并发现不适用。)


    步骤

    1. 在 Sublime Text 中,打开 Preferences 菜单并选择 Keybindings - User

    2. 如果文档不为空,请将文本插入符号移到文档开头的第一个 [ 字符之后。

    3. 粘贴以下内容:

      { "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 }
          ]
      },
      
    4. 如果文档之前为空,请在文档开头键入 [,在文档末尾键入 ]。这是为了确保它是一个有效的 JSON 数组。

    5. 保存文件。

    6. 在 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.pythonsource.lua,或者如果可以将一种语言嵌入到另一种语言中,则实际上两者都匹配。

    在 Sublime Text 中查找语言的基本范围的一种方法是转到设置为相关语法的文档的最开头,然后转到 Tools 菜单 -> Developer - >Show Scope Name。它甚至可以处理一个空文件。

    范围选择器是从 TextMate 借来的,更多关于它们的文档可以在这里找到:

    键绑定文档

    关于键绑定的更多信息可以在这里找到:http://docs.sublimetext.info/en/latest/reference/key_bindings.html#structure-of-a-key-binding

    我个人觉得查看默认键绑定很有用。

    【讨论】: