在 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 路径分隔符。
有没有办法在 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 路径分隔符。