如何创建使用转义字符插入 \{\} 的片段?

How do I create a snippet that inserts \{\} using escape characters?

我正在尝试在 sublime text 中创建一个片段,当我按下 ctrl+shift+[ 它会插入片段 \{\},但我无法弄清楚如何使用转义字符来完成它。

这是我的:

{
    "keys": ["ctrl+shift+["], 
    "command": "insert_snippet", 
    "args": {
        "contents": "\{\}"
    }
}

但是当我使用键盘快捷键时,它只插入没有反斜杠的 {}!这很奇怪,因为当我将它更改为 "\" 时,输出是 \,但是当两个反斜杠之后出现某些内容时,它会忽略反斜杠。

我找到了一种使用 ChainOfCommand 包的变通方法,它像这样分别插入每个字符:

{ 
    "keys": ["ctrl+shift+["], 
    "command": "chain", 
    "args": {
        "commands": [
            ["insert_snippet", {"contents": "\"}],
            ["insert_snippet", {"contents": "{"}],
            ["insert_snippet", {"contents": "\"}],
            ["insert_snippet", {"contents": "}"}]
        ]
    }
}

但这样做的问题是,如果我随后执行 ctrl-z 撤消操作,它会一次删除每个字符,而不是删除整个片段,这很烦人。另外,这只是事情的原理,我相信我应该能够在一个片段中做到这一点!

有谁知道我如何让它发挥作用吗?

尽管看起来不直观,但使用以下键绑定将插入 \{\}:

{
    "keys": ["ctrl+shift+["], 
    "command": "insert_snippet", 
    "args": {
        "contents": "\\{\\}"
    }
},

原因解释如下:https://github.com/SublimeTextIssues/Core/issues/1878#issuecomment-328133400:

Due to compatibility with TextMate snippets, the following characters must be escaped to be literal:

\, $, {, }

Any other \{CHAR} will be produced verbatim. This explains why a single backslash is fine, but two become a single.

如果有帮助,您还可以在 ST 控制台中执行以下命令以查看 JSON 额外转义所产生的差异(例如,与 [=18 中的相同内容相比=] 文件):

view.run_command('insert_snippet', { 'contents': r'\{\}' })