首页 > 解决方案 > 我可以在 VS 代码片段中包含条件逻辑吗?

问题描述

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

目前有一个片段可以生成带有 1 个 case 的 switch 表达式的大纲,并允许您使用 tab 键进入条件、case 名称和其中包含的代码。

我希望能够键入“switch5”“5”是任意数字)和一个要创建 5 个案例的开关,我可以在其中通过标签查看相关代码。

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

谢谢!

标签: jsonvscode-settingscode-snippetsvscode-snippets

解决方案


简短的回答是,你不能在标准的 vscode 代码片段中做这种事情,因为它不能动态地评估其指定变量之外的任何输入,并使用一些有限的变通方法,就像我接下来会提到的那样。

您可能 - 我和其他人已经在 SO 上写了关于他的答案 -case首先输入您的各种值,然后触发一个片段 tat 会将它们转换为一个switch语句。这是一种背单词,但它可能是可能的。

但是,有些扩展确实允许您在片段或设置中评估 javascript 并输出结果。 宏命令就是这样一种扩展。我将展示另一个更简单的扩展来做你想做的事: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

切换 HyperSnips 演示


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

\${${tabStopNum++}:key}

这将解决每次插入制表位时增加的位置${n:defaultValue}n并且 :defaultValue是该制表位的可选默认值。如果您不需要 defaultValue ,请在\$${tabStopNum++}此处使用。

有关如何设置 HyperSnips 的更多信息,请参阅https://stackoverflow.com/a/62562886/836330 。


推荐阅读