0

我写了这样的代码

"State": {
    "prefix": "state",
    "body": [
        "const [$1, set${1:/capitalize}] = useState($2);"
    ],
    "description": "Adds state"
},

我希望结果(如果我输入test$1)是这样的:

const [test, setTest] = useState($2);

但我得到这样的结果:

const [/capitalize, set/capitalize] = useState();

在官方文档中,我发现了这样的规则:'${' int ':' '/upcase' | '/downcase' | '/capitalize' '}'.

你能告诉我我做错了什么吗?

4

2 回答 2

2

您可以将以下代码段用于请求的输出:

const [$1, set${1/(.*)/${1:/capitalize}/}] = useState($2);

输出将是(如果我输入 $1 作为测试):

const [test, setTest] = useState();
于 2019-11-18T11:40:18.820 回答
1

让我们看看为什么您的版本${1:/capitalize}不起作用:

这是您从https://code.visualstudio.com/docs/editor/userdefinedsnippets引用的片段语法的一部分

tabstop     ::= '$' int
                | '${' int '}'
                | '${' int  transform '}'

 -snip-

transform   ::= '/' regex '/' (format | text)+ '/' options

format      ::= '$' int | '${' int '}'
                | '${' int ':' '/upcase' | '/downcase' | '/capitalize' '}'

所以最初看起来${1:/capitalize}是正确的,只看上面语法的最后一行似乎

${' int ':' '/capitalize'

是一个有效的选项。但是您必须跟踪语法才能正确使用它。该format语法只能用于transform. 我们在以下方面看到了这一点:

transform ::= '/' regex '/' (format | text)+ '/' options

因此,您的版本不包含转换。您没有必要的regex先行者。所以这些'/upcase' | '/downcase' | '/capitalize'选项只能用作带有正则表达式的转换的一部分(虽然你可以有一个空的正则表达式,但这对你没有帮助,你仍然需要有正则表达式入口点)。

这是变换的一般形式:

${someInt/regex captures here/do something with the captures here, like ${1:/capitalize} /}

请注意,第一个是制表位 -例如,$someInt它可能是,但第二个(大写)不是制表位,而是对前面正则表达式中第一个捕获组的引用。因此,转换只能转换正则表达式已捕获的内容。 $1$1

语法要求format选项是 a 的一部分transform,并且转换需要 aregex和部分$n中的 'sformat指的是捕获组而不是制表符变量。

我希望这一切都有意义。

于 2019-11-18T15:37:48.703 回答