15

有没有办法获得语法类型来定义键盘快捷键,或者设置键盘快捷键以取决于语法类型(可能在"context")设置?

我的引用列表'(1 2 3)是这样输入的:'(1 2 3)'因为 Sublime 应用了这种有用的(但在这种情况下不是)行为。

这是Default (OSX).sublime-keymap文件的相关位

// Auto-pair single quotes
{ "keys": ["'"], "command": "insert_snippet", "args": {"contents": "'$0'"}, "context":
    [
        { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true },
        { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true },
        { "key": "following_text", "operator": "regex_contains", "operand": "^(?:\t| |\\)|]|\\}|>|$)", "match_all": true },
        { "key": "preceding_text", "operator": "not_regex_contains", "operand": "['a-zA-Z0-9_]$", "match_all": true },
        { "key": "eol_selector", "operator": "not_equal", "operand": "string.quoted.single", "match_all": true }
    ]
},
{ "keys": ["'"], "command": "insert_snippet", "args": {"contents": "'${0:$SELECTION}'"}, "context":
    [
        { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true },
        { "key": "selection_empty", "operator": "equal", "operand": false, "match_all": true }
    ]
},
{ "keys": ["'"], "command": "move", "args": {"by": "characters", "forward": true}, "context":
    [
        { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true },
        { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true },
        { "key": "following_text", "operator": "regex_contains", "operand": "^'", "match_all": true }
    ]
},
4

2 回答 2

14

我做了这个简单的事情:
这个

// Singlequote for lisp
{ "keys": ["'"], "command": "insert_snippet", "args": {"contents": "'"}, "context":
    [
        { "key": "selector", "operator": "equal", "operand": "source.lisp"}
    ]
},

在您的用户键绑定中。


提升一个档次:

在这种情况下还有一个不寻常的情况:( '|'管道代表插入符号),按退格键后,它仍然会删除两个单引号。


要解决此问题,请将添加到您的user-key-keybindings

{ "keys": ["backspace"], "command": "left_delete", "context":
    [
        { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true },
        { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true },
        { "key": "preceding_text", "operator": "regex_contains", "operand": "'$", "match_all": true },
        { "key": "following_text", "operator": "regex_contains", "operand": "^'", "match_all": true },
        { "key": "selector", "operator": "equal", "operand": "source.lisp"}
    ]
},

重要的提示:

正如pickwick在评论中所说,你当然应该改变

"source.lisp"
to
"source.<lisp-of-your-choice>"
or rather to
"source.<name-of-syntax-of-your-choice>"
or even-er:
"source.<name-of-scope-the-syntax-you're-using-is-using>".


ScopeAlways是一个插件,可以向您显示您的语法使用的正确范围名称。很可能会像"source.lisp"CL,"source.clojure"clojure,也许"source.scheme"如果你和酷孩子一起出去玩,等等......

于 2013-05-08T22:51:19.513 回答
8

你应该可以,虽然有点痛苦。首先,您必须禁用内置的自动配对(别担心,当我们完成后,其他一切的自动配对应该可以工作)。为此,请在您的用户设置中设置以下内容。

"auto_match_enabled": false

然后将以下内容添加到您的设置中。

"my_auto_match_enabled": false

接下来,我们需要添加一组新的键绑定。我只从你发布的内容中做了一个,但我会解释我做了什么,因为它可能并不明显。

{ "keys": ["'"], "command": "insert_snippet", "args": {"contents": "'${0:$SELECTION}'"}, "context":
    [
        { "key": "setting.my_auto_match_enabled", "operator": "equal", "operand": true },
        { "key": "selection_empty", "operator": "equal", "operand": false, "match_all": true },
        { "key": "selector", "operator": "not_equal", "operand": "source.clojure", "match_all": true }
    ]
}

首先,请注意我将第一个上下文键从 切换setting.auto_match_enabledsetting.my_auto_match_enabled。接下来,我添加了最后一个将限制范围的上下文条目。有了这个,片段只会在你不在source.clojure范围内时运行。您可能需要修改它,因为我不知道 clojure 中的作用域名称是什么,我只是猜到了 =)。您必须对所有单引号条目执行此操作。现在,因为我们禁用了内置的自动配对,我们也必须读取所有这些条目。在这些条目中,我们将再次更改setting.auto_match_enabledsetting.my_auto_match_enabled。在那之后,一切都应该工作。请注意,它实际上不一定是my_auto_match_enabled,这正是我选择的。您可以根据需要更改它。

话虽如此,我并没有完全测试所有这些,所以如果您遇到问题,请发表评论。

解释:

所以现在你可能会问自己,为什么我需要禁用内置的自动匹配代码?好吧,这就是答案。即使我们要在用户设置中阻止自动完成,使用类似的范围规则,它仍然会回退到默认值,因此无论我们在用户文件夹中做什么,都会插入自动配对引号。现在您可能会想,但是如果我们修改默认设置文件会怎样。虽然我们可以这样做,再次插入相同的上下文设置,但我们必须确保在任何后续更新中恢复该文件。所以我想这最终取决于你。如果您编辑默认文件,请记住,如果您需要恢复,则必须再次更改文件。

崇高的文字3:

在 ST3 中,您可以执行实际修改“默认”文件。这是由于在 ST3 中加载包的方式发生了变化。插件不需要解压缩到 Packages 文件夹,而是直接从 .sublime-package 文件(只是重命名的 zip)运行。此外,Packages 目录中的任何文件都优先于 .sublime-package 文件。因此,在 ST3 中,您将创建Packages/Default/Default (your os here).sublime-keymap并添加上下文行。任何后续更新都是安全的,因为更新不再修改 Packages 目录。

于 2013-04-06T04:04:28.093 回答