首页 > 解决方案 > VS Code:自定义代码段中的变量

问题描述

如何创建一个自定义代码段,该代码段将自动输入我在其前缀中键入的变量值?

我想要一个片段,它将创建一个 html 开始-结束标记注释块。例如,如果我输入/se hello我希望结果是

<!-- $var start-->

<!-- $var end-->

where$var替换为“hello”。感谢您的阅读!

标签: htmlvisual-studio-codecode-snippets

解决方案


正如VSCode 片段文档所说,它使用TextMate为其片段提供动力。TextMate 使用 和 形式的变量$name${name:default}幸运的是$TM_CURRENT_WORD,它可能足以满足您的需求。但是,没有内置变量可以直接在片段名称之后获取多个参数,即$arg1作为$arg2变量。以为您可以使用插值的 shell 代码来实现类似的效果,但不幸的是:

片段语法遵循 TextMate 片段语法,但“内插 shell 代码”和使用 \u;除外。两者都不支持。

强调我的

但是,对于这个简单的示例,以下索引变量示例可能就足够了。

<!-- $1 start-->
    $0
<!-- $1 end-->

$i给你一个要填写的值,你可以在每个值之间使用制表符。这$0是光标在末尾的位置(默认情况下是代码段的末尾)。您可以选择执行以下操作:

<!-- ${1: default text} start-->
    $0
<!-- $1 end-->

它会开始看起来像:

<!-- default text start-->

<!-- default text end-->

选择要编辑的两个默认值。

这一切放在一起在snippets.json文件中看起来像这样:

{
    "se": {
        "scope": "html",
        "prefix": "se",
        "body": [
            "<!-- ${1:default text} start-->",
            "\t$0",
            "<!--$1 end-->"
        ]
    }
}

正如@Mark 指出的那样,如果您希望它不仅仅适用于您可以使用的 HTML,$BLOCK_COMMENT_START并且$BLOCK_COMMENT_END每种语言都会有所不同。该片段将如下所示:

{
    "se": {
        // Leaving scope off will make it a global snippet
        "prefix": "se",
        "body": [
            "$BLOCK_COMMENT_START ${1:default text} start $BLOCK_COMMENT_END",
            "\t$0",
            "$BLOCK_COMMENT_START$1 end $BLOCK_COMMENT_END"
        ]
    }
}

推荐阅读