Sublimetext2 当不在具有指定文件类型的括号中时,如何在等号的两端添加空格?

Sublimetext2 当不在具有指定文件类型的括号中时,如何在等号的两端添加空格?,sublimetext2,sublimetext3,sublimetext,Sublimetext2,Sublimetext3,Sublimetext,可能吗?例如,当在.py和.lua文件中,而不是在()和I键入=时,st3将自动在两端添加一个空格。例如转让声明: a = 1 但如果处于()状态,则会禁用它: func(a=1) func(a=1,func(b=1)) 您可以通过在=键上创建一个键绑定来执行此操作,以插入一个空格,后跟=和另一个空格,该空格将检查: 插入符号处的语法对应于Python或Lua 行首和文本插入符号之间的文本不包含不平衡的括号 如果不满足这些条件,则不使用键绑定,并且将插入=,正常情况下不包含周围的空格。

可能吗?例如,当在
.py
.lua
文件中,而不是在
()
和I键入
=
时,st3将自动在两端添加一个空格。例如转让声明:

a = 1
但如果处于
()
状态,则会禁用它:

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

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

  • 插入符号处的语法对应于Python或Lua
  • 行首和文本插入符号之间的文本不包含不平衡的括号
如果不满足这些条件,则不使用键绑定,并且将插入
=
,正常情况下不包含周围的空格。(假设对
=
键上的其他键绑定(如果有)进行了评估,发现不适用。)


台阶
  • 在升华文本中,打开
    首选项
    菜单并选择
    键绑定-用户

  • 如果文档不是空的,请将文本插入符号移动到文档开头的第一个
    [
    字符之后

  • 粘贴以下内容:

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

  • 保存文件

  • 在Python或Lua文档中按=键,当不在不平衡的paren中时,它会自动在其周围插入空格


  • 正则表达式的解释: 崇高文本的这一方面使用了支持递归的,因此我们不必重复自己来确定括号是否平衡

    • ^
      行的开头
    • 开始捕获组1
      • ([^()]*+)
        -占有式地将每个连续的非括号字符捕获到捕获组2中
      • 开始捕获组3
        • \(
          匹配文字
          字符
        • (?:(?2)|(?3))*
          递归匹配与捕获组2或3(即递归)对应的相同正则表达式模式,零次或无限次
        • \)
          匹配文字
          字符
      • 结束捕获组3
      • ?+
        将上一组设置为可选但具有所有格
    • 结束捕获组1
    • (?1)*+
      占有式递归匹配与捕获组1对应的相同正则表达式模式,零次或无限次
    • $
      要匹配的文本的结尾-在这种情况下,文本插入符号为,因为使用了前面的文本上下文
    总的效果是,在插入符号位置之前的文本插入符号所在行上,如果以下任一项为真,则is将匹配:

    • 不使用paren
    • 打开和关闭非嵌套参数
    • 嵌套的paren都是封闭的
    • 没有没有没有相应打开参数的关闭参数
    因为正则表达式是以JSON格式存储的,
    \
    字符需要用一个额外的
    \
    进行转义,这就是为什么
    操作数
    字符串包含
    \\(
    但我在正则表达式解释中只提到
    \(

    范围选择器 为了确保keybinding仅在Python和lua上处于活动状态,使用了作用域
    选择器
    上下文,参数为
    source.Python,source.lua
    。此选择器匹配
    source.Python
    source.lua
    ,或者如果可以将一种语言嵌入另一种语言,则两者都匹配。

    找到Sublime文本中语言的基本作用域的一种方法是,转到文档的最开始部分,设置相关的语法,然后转到
    工具
    菜单->
    开发者
    ->
    显示作用域名称
    。它甚至可以处理空文件

    范围选择器是从TextMate借来的,有关它们的更多文档可在此处找到:

    键绑定文档 有关键绑定的更多信息,请参见此处:

    我个人认为,查看默认的键绑定很有帮助