VS 代码片段将变量解释为字符串

VS Code snippet interprets variable as string

我正在使用变量转换在 VS Code 中编写一个片段。我想用插入不带扩展名的文件名的变量(例如:CurrentFileNameWithoutExtensions)替换某些文本(在本例中是复制到剪贴板上的文本)中出现的模式。发生的是模式被替换为字符串形式的变量名称,而不是变量的值。

这是片段:

"${CLIPBOARD/pattern/$TM_FILENAME_BASE/}"

输出为:“pattern”变为“$TM_FILENAME_BASE”。
正确的输出是:“pattern”变为“CurrentFileNameWithoutExtensions”。

一个可能的解决方案是输出模式之前的所有剪贴板文本,然后输出变量,最后输出模式之后的所有剪贴板文本。这将如何完成?

示例剪贴板文本:

Text that is before pattern in clipboard.
pattern
Text that is after pattern in clipboard.

代码片段可以捕获所有文本直到模式并输出:

Text that is before pattern in clipboard.

然后输出变量$TM_FILENAME_BASE:

CurrentFileNameWithoutExtensions

最后它会输出模式后的文本:

Text that is after pattern in clipboard.

输出看起来像这样放在一起:

Text that is before pattern in clipboard.
CurrentFileNameWithoutExtensions
Text that is after pattern in clipboard.

分组捕捉不同部分,只输出你想要的分组

如果 pattern 不属于剪贴板

,它也有效
"${CLIPBOARD/^((.*?)(pattern.*)|(.*))$//}$TM_FILENAME_BASE${CLIPBOARD/^((.*?pattern)(.*)|(.*))$//}"

如果总是有一个匹配的模式,那么这行得通:

"pattern": {
    "prefix": "_pt",
    "body": [
      "${CLIPBOARD/(.*[\r\n]*)((pattern)([\r\n]*))(.*)//}$TM_FILENAME_BASE${CLIPBOARD/(.*[\r\n]*)((pattern)([\r\n]*))(.*)//}"

    ],
    "description": "clipboard pattern"
}

这可以处理任意数量的换行符,如

first text
pattern
second text

first text

pattern


second text

first textpatternsecond text

regex101 demo

当然,正如 rioV8 指出的那样,如果模式在文本中除了中间部分之外的某处也匹配,那就是一个问题。