我可以在 VS 代码片段中包含条件逻辑吗?

Can I include conditional logic in VS Code snippets?

我想在 VS Code 中编写一个片段来编写“开关”表达式(在 Javascript 中),但我可以在其中定义案例数。

目前有一个片段可以生成包含 1 个案例的 switch 表达式的轮廓,并允许您跳入条件、案例名称和其中包含的代码。

我希望能够输入 "switch5""5" 是任意数字)和一个有 5 个案例的开关被创建,我可以在其中切换相关代码。

我知道代码片段写在 JSON 文件中,我可以在其中包含这样的条件逻辑吗?还是不可能?

谢谢!

简短的回答是,您不能在标准 vscode 代码段中执行此类操作,因为它无法使用一些有限的解决方法动态评估其指定变量之外的任何输入,就像我接下来要提到的那样。

你可能 - 我和其他人已经写了关于他的答案 - 首先输入你的各种 case 值,然后触发一个片段 tat 将它们转换成 switch 语句。它有点像倒退,但它可能是可能的。

但是,有些扩展允许您直接在片段或设置中评估 javascript 并输出结果。 macro-commander is one such extension. I'll show another simpler extension doing what you want: HyperSnips.

在你的 javascript.hsnips:

snippet `switch(\d)` "add number of cases to a switch statement" A
``
let numCases = Number(m[1])     // 'm' is an array of regex capture groups
let caseString = ''

if (numCases) {       // if not 'switch0'
    let tabStopNum = 1
    caseString = `switch (${${tabStopNum++}:key}) {\n`

    for (let index = 0; index < m[1]; index++) {
        caseString += `\tcase ${${tabStopNum++}:value}:\n\t\t$${tabStopNum++}\n`
        caseString += '\t\tbreak;\n\n'
    }

    caseString += '\tdefault:\n'
    caseString += '\t\tbreak;\n}\n'
}
rv = `${caseString}`       // return value
``
endsnippet


最棘手的部分是让未知数量的制表位正常工作。我是这样做的:

${${tabStopNum++}:key}

将解析为 ${n:defaultValue},其中每次插入制表位时 n 都会递增。 :defaultValue 是该制表位的可选默认值。如果您不需要默认值,只需在此处使用 $${tabStopNum++}

有关如何设置 HyperSnips 的详细信息,请参阅