0

在定义的这个片段中,keybindings.json我试图对来自选择对话框的输入结果运行正则表达式转换 - 我需要插入两次相同的值,在第一个位置我需要第一个分号之前的部分,在第二个位置我想要完整的选择价值。

我尝试了文档中的示例,但它们似乎不适用于choice,还是我遗漏了什么?我如何实现这一目标?

{
    "key": "cmd+alt+ctrl+t",
    "command": "editor.action.insertSnippet",
    "when": "editorTextFocus",
    "args": {
        "snippet": "Before semicolon: ${2/(\\w);{1,}/$1/} & Full value: ${2|1; testValue1, 2; testValue2|}"
    }
},

预期输出:

BeforeSemicolon: 1 & Full value: 1; testValue1
4

2 回答 2

1

不支持选择变量的转换。在https://github.com/Microsoft/vscode/pull/51621有一个一般性的讨论。

有几种解决方法,因为只要在片段中的某处有一个未转换的占位符用法,占位符的转换就可以工作。然后其他地方的转换版本将起作用。此技术适用于占位符转换,但不适用于您尝试做的选择转换。为什么我不知道这种差异?

使用一个占位符的更简单的解决方法 1:

"snippet": "Before semicolon: ${1/([^;]*).*/$1/} && Full value: ${1:1; testValue1}"

在这里,您必须接受默认占位符值 ( 1; testValue1) 或用另一个值覆盖它。然后,tab转换将应用于对同一制表位的任何其他引用。

复杂的解决方法 2 使用多个占位符(在本例中为 3 个“选择”:

"snippet": "Before semicolon: ${1/([^;]*).*/$1/}${2/([^;]*).*/$1/}${3/([^;]*).*/$1/} && Full value: ${1:1; testValue}${2:2; testValue}${3:3; testValue}"

在这里,您必须将您的三个(或您拥有的多个)选项列为单独的占位符制表位。然后,您将要么tab接受您想要的占位符,要么接受deletetab您不接受的占位符。将删除/制表符序列降下来有点棘手,但是一旦有了它,它就是重复的。您会看到光标似乎位于下一个“选择”的开头,但它实际上位于上一个“选择”的末尾。

这是第 2 版的演示,我依次选择每个“选择”/占位符。[我只是在 alti 这里使用键绑定来简化。]


显然,如果可能有很多“选择”,您可能会想要使用版本 1。如果您想要呈现的“选择”数量很少且不必键入,那么版本 2 确实可以很好地工作。

于 2020-05-04T16:57:40.520 回答
1

经过一些实验,我发现部分工作。

正则表达式匹配完整的字符串很重要。所以.*在最后加上。

(这应该添加到文档中)

{
    "key": "cmd+alt+ctrl+t",
    "command": "editor.action.insertSnippet",
    "when": "editorTextFocus",
    "args": {
        "snippet": "Before semicolon: ${1/([^;]*).*/$1/} && Full value: ${1|123; testValue1,223; testValue2|}"    }
},

它只适用于第一个选择,并且您必须在选项文本内移动光标,只需 1Left Arrow就足够了,这将接受选择但保持该字段处于活动状态。然后TAB。现在应用了变换。

您必须为此提交错误。

于 2020-05-04T11:58:48.913 回答