在 VScode 个片段中减少重复(保存复杂的转换以备后用)

Reduce duplications (save complicated transforms for later use) in VScode snippets

有没有办法在 VScode 片段中创建自定义变量? 我有这些片段,我根据文件名和文件夹创建了一个单例。

这是片段:

 "Service": {
   "prefix": "singletonByPath",
   "body": [
     "class ${TM_DIRECTORY/.*[^\w]([a-z])(\w+)$/${1:/upcase}/g}${TM_FILENAME_BASE/([a-z])(\w+)/${1:/upcase}/g} {",
     "  [=11=]",
     "}",
     "",
     "export const ${TM_DIRECTORY/.*[^\w]([a-z])(\w+)$/${1:/downcase}/g}${TM_FILENAME_BASE/([a-z])(\w+)/${1:/upcase}/g} = new ${TM_DIRECTORY/.*[^\w]([a-z])(\w+)$/${1:/upcase}/g}${TM_FILENAME_BASE/([a-z])(\w+)/${1:/upcase}/g}();",
     ""
   ],
   "description": "Create an exported singleton instance and a class based on the filename and path"
 },

因此,当片段在如下路径中触发时:'..../customers/service.ts' 您将得到以下结果:

class CustomersService {
  
}

export const customersService = new CustomersService();

问题是我有重复的长而难以阅读的正则表达式,我想将它们提取到变量(或没有制表位的镜像)。

我什至更喜欢将这些变量放在“片段全局位置”中,这样​​我就可以在多个片段中使用它们。

是否有可能以某种方式减少这些重复?

您可以采取一些措施来简化代码段。没有内置方法来保存预定义片段部分的“变量”。

虽然这里是您的代码的简化:

"Service": {
  "prefix": "singletonByPath",
  "body": [
    // "class ${TM_DIRECTORY/.*[^\w]([a-z])(\w+)$/${1:/upcase}/g}${TM_FILENAME_BASE/([a-z])(\w+)/${1:/upcase}/g} {",

    "class ${1:${TM_DIRECTORY/.*[^\w]([a-z])(\w+)$/${1:/upcase}/g}}${2:${TM_FILENAME_BASE/([a-z])(\w+)/${1:/upcase}/g}} {",
            --                                                           --

    "  [=10=]",
    "}",
    "",
    // "export const ${TM_DIRECTORY/.*[^\w]([a-z])(\w+)$/${1:/downcase}/g}${TM_FILENAME_BASE/([a-z])(\w+)/${1:/upcase}/g} = new ${TM_DIRECTORY/.*[^\w]([a-z])(\w+)$/${1:/upcase}/g}${TM_FILENAME_BASE/([a-z])(\w+)/${1:/upcase}/g}();",

    "export const ${1/(\w+)/${1:/downcase}/} = new ();",

    ""
  ],
  "description": "Create an exported singleton instance and a class based on the filename and path"
}

注意 :${TM_DIRECTORY...} 的用法,同样 ${2:${TM_FILENAME_BASE...}

这有效地将 </code> 设置为 <code>TM_DIRECTORY 转换的 结果,并将 </code> 设置为 <strong> 结果[= <code>TM_FILENAME_BASE 转换的 50=] 和那些“变量”可以在片段的其他地方使用,只需引用 </code> 和 <code>.

这些“变量”甚至可以像最后一行中的 ${1/(\w+)/${1:/downcase}/} 变换那样自行变换。

你的代码片段的最后一行就变成了:

"export const ${1/(\w+)/${1:/downcase}/} = new ();",

您将不得不按 Tab 键几次,因为这些“变量”现在是 Tabstop,最后一个转换只有在您通过 Tabstop 之后才会完成,但对于这样的操作来说,这是一个很小的代价简化。


您的代码段还有其他与“变量相关”无关的简化:

  "body": [
    "class ${1:${TM_DIRECTORY/.*[\/\\](.*)/${1:/capitalize}/}}${2:${TM_FILENAME_BASE/(.*)/${1:/capitalize}/}} {",
    "  [=11=]",
    "}",
    "",
    "export const ${1/(\w+)/${1:/downcase}/g} = new ();",
    ""
  ],

您可以使用 capitalize 转换。另请注意,最后一个 body 适用于 Windows 和 linux 路径分隔符。