首页 > 解决方案 > 减少 VScode 片段中的重复(保存复杂的转换以供以后使用)

问题描述

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

这是片段:

 "Service": {
   "prefix": "singletonByPath",
   "body": [
     "class ${TM_DIRECTORY/.*[^\\w]([a-z])(\\w+)$/${1:/upcase}$2/g}${TM_FILENAME_BASE/([a-z])(\\w+)/${1:/upcase}$2/g} {",
     "  $0",
     "}",
     "",
     "export const ${TM_DIRECTORY/.*[^\\w]([a-z])(\\w+)$/${1:/downcase}$2/g}${TM_FILENAME_BASE/([a-z])(\\w+)/${1:/upcase}$2/g} = new ${TM_DIRECTORY/.*[^\\w]([a-z])(\\w+)$/${1:/upcase}$2/g}${TM_FILENAME_BASE/([a-z])(\\w+)/${1:/upcase}$2/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();

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

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

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

标签: variablesvisual-studio-codeduplicatestextmatevscode-snippets

解决方案


您可以做几件事来简化您的代码段。没有内置方法可以保存预定义片段部分的“变量”。

这是您的代码的简化:

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

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

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

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

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

注意使用$1:${TM_DIRECTORY...}和 同样${2:${TM_FILENAME_BASE...}

这有效地设置了转换的结果和转换$1结果并且这些“变量”可以通过引用和在片段的其他地方使用。TM_DIRECTORY$2TM_FILENAME_BASE$1$2

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

您的代码段的最后一行就变成了简单的:

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

您将不得不按几次制表符,因为这些“变量”现在是制表符,并且在您通过制表符执行最后一次转换之前不会完成最后一次转换,但对于这种简化来说,这是一个很小的代价。


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

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

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

简化片段演示


推荐阅读