【问题标题】:use dollar sign in a vscode snippet regex在 vscode 片段正则表达式中使用美元符号
【发布时间】:2021-04-14 12:48:07
【问题描述】:

我正在尝试制作一个从$code 占位符输入生成此行的 vs 代码 php sn-p:

Utils::getLogger.debug("code", ["code" => $code])

我使用的正则表达式是/(\$?)(.*)/(我对第二个捕获组感兴趣以获取变量名)。

这是我的 sn-p 代码:

"log debug": {
    "prefix": ["log debug", "debug"],
    "body": ["Utils::getLogger.debug(\"${1/(^\\$?)(.*)/$2/}\", [\"${1/(^\\$?)(.*)/$2/}\" => ${1:variable}])"],
    "description": "Quick variable debug."
},

问题是它不能替换我输入的美元符号。如果我将$variable 作为占位符,它会生成Utils::getLogger.debug("$variable", ["$variable" => $variable])

我让它为不同于美元符号的字符工作,例如逗号或其他字母,而且我使用TM_SELECTED_TEXT 变量并在之前选择我的变量。

我怀疑这与vscode中的vs code php变量名自动完成有冲突,就像我复制我的变量然后调用sn-p并将变量粘贴到占位符中(而不是键入它),它也可以工作。

我很想在 vscode github 上发布这个问题,但可能在这里做错了。

ps:我知道也可以输入不带$ 的变量名并将其添加到替换正则表达式中,但您知道开发人员可以...

【问题讨论】:

  • 我尝试了您的 sn-p,它按预期工作,它会删除 $(如果存在),$ 仅在您退出 ${1} 字段时才会删除,它可以是简化为${1/^\\$?(.*)/$1/}
  • 为什么将第二个变换从(^\\$?)(.*)改为(^,?)(.*)?如果您将这两个都设为(^\\$?)(.*),它将按您的预期工作。而且您不需要 ^ 正则表达式开始指示符 - 它们在这里没有做任何事情。
  • 第二个捕获组(^,?) 是对另一个角色的测试,我没有在“最终”sn-p 中使用。我编辑了
  • @rioV8 感谢您的简化,但问题仍然存在,更多信息请参阅我对 Mark 的回复(TLDR:imgur.com/Wa9yaI7
  • 我没有安装 PHP 扩展,你可以提出一个 PHP 扩展的问题,它不应该完成字符串中的变量

标签: visual-studio-code vscode-snippets


【解决方案1】:

这行得通:

"body": ["Utils::getLogger.debug(\"${2:${1/\\$?(.*)/$1/}}\", [\"$2\" => ${1:variable}])"],

请注意,由于您正在重用第一个转换,因此我将其设置为占位符 ${2},如下所示:

${2:${1/\\$?(.*)/$1/}}

现在,您可以在任何需要相同转换的结果的地方重复使用 $2 占位符 - 就像在 \"$2\" => 中一样。

感谢https://stackoverflow.com/a/66449064/836330 的使用。

【讨论】:

  • 感谢您的详细回复,这是一个不错的功能,但它不能解决问题,但我现在很确定我的问题与 php 符号自动完成冲突,正如我所做的测试所示使用您的 sn-p 代码(与我的结果相同):imgur.com/Wa9yaI7 第二个捕获组(^,?) 是对另一个字符的测试,它没有在“最终” sn-p 中使用(我编辑)
【解决方案2】:

经过讨论和进一步测试,我认为sn-p代码没有问题,它与php变量自动完成“冲突”。

答案中有一些有趣的优化。

为了资料,我终于采取了输入不带$的变量名并在transform中添加的解决方案。

"log debug quick": {
    "prefix": ["log debug quick", "debug quick"],
    "body": ["Utils::getLogger.debug(\"${1:variable}\", [\"${1}\" => \\$${1}]);"],
    "description": "Quick variable debug."
},

请注意,原始方法适用于 TM_SELECTED_TEXT 变量(因为不会发生自动完成),因此以下方法有效:

"log debug selection": {
    "prefix": ["log debug selection", "debug selection"],
    "body": ["Utils::getLogger.debug(\"${1:${TM_SELECTED_TEXT/^\\$?(.*)/$1/}}\", [\"${1}\" => $TM_SELECTED_TEXT]);"],
    "description": "Quick variable debug."
},

请注意,我使用 @Mark 和 @rioV8 建议优化了 sn-p

【讨论】:

  • 而且我想没有人注意到我在 php 中使用了. 而不是->,好吧,直到现在我才真正使用我的 sn-p...
猜你喜欢
  • 1970-01-01
  • 2022-12-04
  • 1970-01-01
  • 2016-06-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-11
  • 2020-03-08
  • 1970-01-01
相关资源
最近更新 更多