带有占位符转换和制表位的 VS 代码片段

VS Code Snippet w/ placeholder transform and tab stop

我想要一个带有两个制表位的片段。第一个制表位应允许用户输入文本。第二个制表位应默认为占位符,它是第一个制表位文本的转换。但是,第二个制表位的转换值应该 selected(即突出显示)以便用户可以轻松地使用自定义值覆盖它。

这是一个几乎有效的示例片段:

"Test Case": {
  "prefix": "tc",
  "body": [
    "TS1: ",
    "TS2: ${2:${1/(.*)/${1:/upcase}/}}",
    "[=10=]"
  ],
  "description": "Test case to demonstrate issue"
}

当您在 TS1 中输入一个值后按 Tab 键时,光标会转到转换后的 TS2 值的 end -- 但我希望它像其他占位符一样工作并且具有整个值 select 已经编辑(而不是末尾的光标)。

有趣的是,如果我在代码段中的 ${2: 之后放置一个 space,那么它 select 整个值(比如我想要)但不幸的是它包括我插入的额外 space 以实现这一点(我不想要)。

我在这里缺少什么技巧吗?

好消息是它已在当前的 Insiders Build v1.52 中修复!我想知道它是否被固定为 https://github.com/microsoft/vscode/pull/108964 的附带好处?


[在我查看 Insiders' Build 之前]:

我以前见过这种情况,一直想提出问题,但不幸的是从来没有这样做过。这绝对是一个错误。有时您可以根据您实际想要在代码段中执行的操作来解决它。

在您的情况下,您想要 select 转换后的版本。但是您可以“反转”转换和 select 非转换版本 ala:

// "TS1: ",
// "TS2: ${2:${1/(.*)/${1:/upcase}/}}",    // your code
// "[=10=]"

"TS1: ${1/(.*)/${1:/downcase}/}",
"TS2: ${2:}",
"[=10=]"

你看我现在 select 未转换的版本和 upcase 第一个而不是 downcase 第二个。 select离子会起作用。

这完全取决于您的具体情况,是否可以使用此“解决方法”- 您可能正在做一些比简单的大写 <-> 小写交换根据您的实际输入修复更复杂的事情。您可以在删除不需要的 space 的宏中调用此代码段,但这必须由键绑定而不是代码段前缀触发,因此不是最佳选择。或者第二个片段作用于现在 selected 的单词和前面的 space.