Javascript VSCode高级代码段转换
我试图创建一个基于文件路径创建类名的代码段。如果文件名为Javascript VSCode高级代码段转换,javascript,regex,visual-studio-code,code-snippets,vscode-snippets,Javascript,Regex,Visual Studio Code,Code Snippets,Vscode Snippets,我试图创建一个基于文件路径创建类名的代码段。如果文件名为index.js,我希望类名取文件夹名。否则,请使用文件名 如果文件名为index.js(它正确地插入了文件夹名),我有一个转换(如下所示)当前正在工作 我将如何扩展这一点(假设它甚至是可能的)以也适用于第二种情况 我确实从中注意到,您可以使用一些基本的if/else格式,只有在存在捕获组的情况下,这些格式才会插入给定的文本。我已经能够用一些简单的例子让他们工作。但不确定这些是否可以用某种方式来完成我想做的事情 当前代码段: { "my
index.js
,我希望类名取文件夹名。否则,请使用文件名
如果文件名为index.js
(它正确地插入了文件夹名),我有一个转换(如下所示)当前正在工作
我将如何扩展这一点(假设它甚至是可能的)以也适用于第二种情况
我确实从中注意到,您可以使用一些基本的if/else格式,只有在存在捕获组的情况下,这些格式才会插入给定的文本。我已经能够用一些简单的例子让他们工作。但不确定这些是否可以用某种方式来完成我想做的事情
当前代码段:
{
"mySnippet": {
"prefix": "cls",
"body": [
"class ${TM_FILEPATH/[\\/\\w$]+\\/(?!index)|\\/index.js//g} {}",
"export default ${TM_FILEPATH/[\\/\\w$]+\\/(?!index)|\\/index.js//g};"
]
},
}
@Wiktor稍后将添加正确的答案,但我想说一些关于vscode的变量转换中那些太长而无法注释的条件 如果你能像这样做,那就太好了:
“${TM\u FILEPATH/*\\(.+)\\((index\\.js)\;(.*)/${3:?$1:$2}}}/g}”,
有条件的如果组3不为空,则插入组1(父目录)else插入组2(文件名)。尽管正则表达式很好(尽管这里简化了re:path分隔符和文件扩展名),但这并不起作用
不幸的是,虽然“普通”条件确实非常有效:
${3:?There is an index.js file:There is not an index.js file}
似乎不支持在条件文本替换中使用正则表达式组。这似乎来自语法链接(请参见语法片段)。请查看有关条件的这一部分:
'${' int ':?' if ':' else '}'
我想说的是,条件if/else部分中的捕获组不受支持。它似乎不明确地允许捕获组-只有在/else纯文本的情况下才允许捕获组。在评论中使用Wiktor的正则表达式,结合文档、Mark的进一步见解和一些额外的调整(由于VSCode转换的限制,以替换/转换正则表达式捕获组的方式,我终于能够组合出一个有效的解决方案
{
"mySnippet": {
"prefix": "cls",
"body": [
"class ${TM_FILEPATH/(.*[\\/\\\\])([^\\/\\\\]+)([\\/\\\\]index\\.[jt]s$)|(.*[\\/\\\\])(.*)(\\.[jt]s)/${2}${5}/} {}",
"export default ${TM_FILEPATH/(.*[\\/\\\\])([^\\/\\\\]+)([\\/\\\\]index\\.[jt]s$)|(.*[\\/\\\\])(.*)(\\.[jt]s)/${2}${5}/};"
]
}
}
我建议使用
${TM_FILEPATH/.*[\\/\\\\]([^\\/\\\\]+)[\\/\\\\]index\\.js$|.*[\\/\\\\](.*)/$1$2/}
如果不想将文件扩展名包括到输出中,请使用
${TM_FILEPATH/.*[\\/\\\\]([^\\/\\\\]+)[\\/\\\\]index\\.js$|.*[\\/\\\\](.*?)(?:\\.[^.]*)$/$1$2/}
正则表达式1将起作用,或者,请参见:
这里的要点是使用两个用|
交替运算符分隔的备选方案,它们将匹配整个字符串,同时捕获所需的部分,确保更具体(使用已知文件名)的备选方案优先,而更通用的备选方案优先(匹配任何文件名的将排在最后。替换模式将是两个反向引用,$1$2
,因为在找到匹配项后,只有一个实际包含一些文本
正则表达式详细信息
注意,反斜杠加倍,因为模式是作为字符串文本传递的,而/
字符必须转义,因为字符串文本包含“stringized”regex文本
:*[\/\]([^\/\]+)[\/\\]index\.js$
-除换行符以外的任何0+字符,尽可能多*
-a[\/\\]
或/
\
-捕获组1:一个或多个(([^\/\]+)
)字符,而不是+
和/
(\
是一个否定字符类)[^…]
-a[\/\\]
或/
\
-一个index\.js
子字符串index.js
-字符串结尾$
-或|
:*[\/\\](.*)
-除换行符以外的任何0+字符,尽可能多*
-a[\/\\]
或/
\
-捕获组2:除换行符以外的任何0+字符,尽可能多(.*)
-将尽可能少地在组2中捕获除换行符以外的任何0个或更多字符,然后尝试匹配可选的(.*?(:\....^.]*)?$
和0+非点字符序列,直到字符串的末尾(
)$
{
"mySnippet": {
"prefix": "cls",
"body": [
"class ${TM_FILEPATH/.*[\\/\\\\]([^\\/\\\\]+)[\\/\\\\]index\\.js$|.*[\\/\\\\](.*?)(?:\\.[^.]*)$/$1$2/} {}",
"export default ${TM_FILEPATH/.*[\\/\\\\]([^\\/\\\\]+)[\\/\\\\]index\\.js$|.*[\\/\\\\](.*?)(?:\\.[^.]*)$/$1$2/};"
]
}
}
如果
c:\Users\wiktor\Documents\index.js
在c:\Users\wiktor\Documents\index.js
中,那么类应该是Documents
?如果是c:\index.js
?@WiktorStribiżew Right,我已经让这部分与上面的内容一起工作了。不过,我还没有第二个案例工作(如果文件名不是索引,请以文件名命名)。此代码段不会在您询问的情况下使用。我并不是真的试图防范所有边缘情况。这将是一个特定于工作流的代码段。请尝试${TM\u FILEPATH/*[\\\/\\\\](^\\/\\\\]+[\\/\\\\\\\\]index\\\\\\\.js$..[\\/\\\\\\\\\\\](.*/$1$2/}
。注意,我添加了/
和\
路径分隔符。请看,这就是它的工作方式。它是否如预期的那样工作?@WiktorStribiżew Regex解决方案非常完美,谢谢!必须进行一些调整,因为正如Mark提到的,使用VSCode转换引用Regex组是有限的。请在我的示例中随意复制/粘贴我的代码示例回答并将其作为新答案发布,我会给你评分。再次感谢!我更新了正则表达式,只返回文件名而不返回扩展名。