我刚刚更新了一个扩展Find and Transform,它可以对插入的文本进行数学运算。使用这个简单的键绑定(in keybindings.json
):
{
"key": "alt+r", // choose your keybinding
"command": "findInCurrentFile",
"args": {
"replace": "[$${ return ${CURRENT_HOUR} - 1 }$$:${CURRENT_MINUTE}]"
}
由于没有find
,它只会在光标所在的位置插入替换(只要该光标不在单词中或单词旁边)。
这部分$${ return ${CURRENT_HOUR} - 1 }$$
表示一个 javascript 操作$${ <some operation here> }$$
,在这种情况下获取当前小时并从中减去 1。

你也可以使用replace
这样的:
"replace": [
"$${",
"const date = new Date();",
"return new Intl.DateTimeFormat('en-GB', { dateStyle: 'full', timeStyle: 'long' }).format(date)",
"}$$"
]
它将在光标处插入:
Tuesday, 22 February 2022 at 00:04:52 GMT-7
上一个答案使用宏扩展来运行多个命令:
通常,如果没有真正丑陋的条件替换变换,就无法对片段变量进行数学运算。然而,一些聪明的家伙想出了一种方法来做简单的递增/递减 1(或 10 或 0.1 或这些的倍数和组合!)。
请参阅如何在 vscode 片段中增加变量,例如行号,以及查找数字并替换 + 1。{但似乎没有人注意到。]
在您的情况下,使用宏扩展多命令将其放入您的 settings.json 中:
"multiCommand.commands": [
{
"command": "multiCommand.decrementHourInSnippet",
"sequence": [
{
"command": "editor.action.insertSnippet",
"args": {
"snippet": "[$CURRENT_HOUR"
}
},
"editor.emmet.action.decrementNumberByOne",
{
"command": "editor.action.insertSnippet",
"args": {
"snippet": ":$CURRENT_MINUTE]"
}
}
]
}
]
为了使 emmetdecrementNumberByOne
技巧起作用,您不能在一行中有两个数字,只有一个您想要递减。这就是为什么你的实际片段被分成两半,在减量发生后添加分钟。
现在,在 keybindings.json 中将您选择的键绑定分配给此宏:
{
"key": "ctrl+shift+i",
"command": "extension.multiCommand.execute",
"args": { "command": "multiCommand.decrementHourInSnippet" }
}
它有效。演示:

当然,正如您所说,您不在乎从哪个0
到-1
哪个是我认为它会在午夜后一个小时做的事情。