除了使用TM_FILENAME_BASE之外,还有没有办法修剪TM_FILENAME?

时间:2019-07-01 17:24:07

标签: visual-studio-code vscode-snippets

我正在尝试为redux容器文件创建一个片段,该片段需要导入一些具有相同基本名称的react文件。 TM_FILENAME_BASE非常适合从文件名中删除.js,但是在这种情况下,我的组件文件的扩展名为fun-thing.component.js,容器将跟着扩展名为fun-thing.container.js。

我用来选择第一个句点之前的所有内容的正则表达式是^([^.]+)

  "Redux Container": {
    "prefix": "rc",
    "body": [
      "// @flow",
      "import { connect } from 'react-redux';",
      "import { ${TM_FILENAME/^([^.]+)/${1:/pascalcase}/}Component } from './${TM_FILENAME/^([^.]+)/$1/}.component';",
      "",
      "const mapStateToProps = (state) => ({});",
      "",
      "const mapDispatchToProps = {};",
      "",
      "export const ${TM_FILENAME/^([^.]+)/${1:/pascalcase}/} = connect(",
      "  mapStateToProps,",
      "  mapDispatchToProps",
      ")(${TM_FILENAME/^([^.]+)/${1:/pascalcase}/}Component);"
    ],
    "description": "Creates a normal container for a normal component"
  }

预期

// @flow
import { connect } from 'react-redux';
import { FunThingComponent } from './fun-thing.component';
...

实际

// @flow
import { connect } from 'react-redux';
import { FunThing.container.jsComponent } from './FunThing.container.js.component';
...

如您所见,它并没有忽略文件扩展名。

1 个答案:

答案 0 :(得分:0)

这两项工作

  "import { ${TM_FILENAME/^([^.]+).*/${1:/pascalcase}/}Component } from './${TM_FILENAME/^([^.]+).*/$1/}.component';",

  "import { ${TM_FILENAME/(.*?)\\..+/${1:/pascalcase}/}Component } from './${TM_FILENAME/(.*?)\\..+/$1/}.component';"

如果要根据需要排除变量的一部分,使用vscode代码段转换,请从文件名中删除.component.js,则该变量的那一部分必须在正则表达式-因此为(.*?)\\..+

否则,变量的“看不见的”部分将通过。

因此,您的正则表达式^([^.]+)准确地捕获了第一个.之前的文件名部分,但是其余变量未修改就“通过”了。

通过此示例,您可以更清楚地看到这一点:

"import { ${TM_FILENAME//${1:/pascalcase}/}Component }

产生:

import { fun-thing.component.jsComponent }

因此,尽管没有捕获任何文件名,但整个文件名都会通过。

${someVariable/everything To Be Transformed/what To Do To the previous/}

如果它不在“所有要转换的内容”部分中,则没有任何反应。