退出Sublime中用大括号括起来的块

时间:2013-05-18 02:45:46

标签: sublimetext2

如果我在Sublime中有以下代码:

if (condition) {
    // code
}

当我的光标位于// code的末尾时,我想设置一个键绑定(例如Tab),它将退出if语句块并将其移动到}的末尾。感谢。

2 个答案:

答案 0 :(得分:1)

BracketHighlighter插件可以原生提供此功能......有点儿。在其示例快捷方式文件Example.sublime-keymap中,有一个“Go to Right Bracket”示例键绑定:

// Go to right bracket
{
    "keys": ["ctrl+alt+super+down"],
    "command": "bh_key",
    "args":
    {
        "lines" : true,
        "plugin":
        {
            "type": ["__all__"],
            "command": "bh_modules.bracketselect",
            "args": {"select": "right"}
        }
    }
},

唯一的问题是被调用的bracketselect命令将光标移动到右括号的左侧,需要另一个按键才能完全从块中逃脱。我认为这不是你想要的。

不要担心!值得庆幸的是,BracketHighlighter提供了一个非常直观的插件API,我发现我可以修改bracketselect插件来创建一个从括号内的块中逃脱的命令 - 与bracketselect基本相同,但它将光标移动到右括号的右侧而不是左侧,并且不需要任何额外的参数。

如果您尚未安装,请先安装BracketHighlighter

接下来,保存blockescape.py(如果链接死亡,请参见下文)

Preferences -> Browse Packages... -> BracketHighlighter/bh_modules/blockescape.py

然后,将此条目添加到用户密钥绑定(Preferences -> Key Bindings — User)的顶部:

{
    "keys": ["tab"],
    "command": "bh_key",
    "args":
    {
        "lines" : true,
        "plugin":
        {
            "type": ["__all__"],
            "command": "bh_modules.blockescape"
        }
    }
},

我不建议使用tab作为触发键,因为tab在扩展中已经发挥了重要作用。当然,您可以定义一个特殊的context来使用tab,但这取决于您。

如果Github失败,这里是插件代码:

import bh_plugin
import sublime

DEFAULT_TAGS = ["cfml", "html", "angle"]


class BlockEscape(bh_plugin.BracketPluginCommand):
    def run(self, edit, name, tags=DEFAULT_TAGS):
        current_left, current_right = self.selection[0].begin(), self.selection[0].end()
        left, right = self.left, self.right
        first, last = left.end, right.begin
        if left.end != right.end:
            if name in tags and left.size() > 1:
                first, last = right.begin + 1, right.begin + 1
                if first == current_left and last == current_right:
                    first, last = right.end, right.end
            else:
                first, last = right.begin, right.begin
                if first == current_left and last == current_right:
                    first, last = right.end, right.end
        else:
            # There is no second bracket, so just select the first
            if name in tags and left.size() > 1:
                first, last = left.begin + 1, left.begin + 1
            else:
                first, last = right.end, right.end
                if first == current_left and last == current_right:
                    first, last = right.end, right.end

        self.selection = [sublime.Region(first+1, last+1)]


def plugin():
    return BlockEscape

由于我或多或少地将插件一起入侵,因此可能无法正常工作。在这种情况下,您可以自行编辑或在Gist page上发表评论。

答案 1 :(得分:0)

您可以将代码段中的$0添加到该位置:

<snippet>
    <description>If Condition</description>
    <content><![CDATA[if (${1:/* condition */}){
      ${2:/* code */}
    }${0}]]></content>
    <tabTrigger>if</tabTrigger>
    <scope>source.c</scope>
</snippet>