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

tcp*_*per 3 sublimetext sublimetext2 sublimetext3

可能吗?例如,当输入.py.lua文件,而不是()和我输入时=,st3将自动为两端添加空格.如转让声明:

a = 1
Run Code Online (Sandbox Code Playgroud)

但如果处于以下()状态,它将被禁用:

func(a=1) 
func(a=1,func(b=1))
Run Code Online (Sandbox Code Playgroud)

Kei*_*all 6

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

  • 插入符号的语法对应于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 }
        ]
    },
    
    Run Code Online (Sandbox Code Playgroud)
  4. 如果文档以前为空,请[在文档的开头键入a ,在文档]的末尾键入a .这是为了确保它是一个有效的JSON数组.

  5. 保存文件.

  6. 按下=Python或Lua文档中的键,看到它不会在不平衡的parens内部时自动插入空格.


正则表达式的解释:

Sublime Text的这个方面使用Boost库提供PCRE正则表达式,它支持递归,因此我们不必重复自己来确定括号是否平衡.

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

在插入符号位置之前,整个效果是匹配文本插入符所在的行中的以下任何一个:

  • 没有使用parens
  • 非嵌套的parens打开和关闭
  • 嵌套的parens都关闭了
  • 没有关闭的parens没有相应的开放式paren

因为正则表达式存储在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

我个人认为查看默认的键绑定灵感很有用.