除了使用 TM_FILENAME_BASE 之外,还有什么方法可以 trim a TM_FILENAME 吗?

Is there a way to trim a TM_FILENAME beyond using TM_FILENAME_BASE?

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

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

  "Redux Container": {
    "prefix": "rc",
    "body": [
      "// @flow",
      "import { connect } from 'react-redux';",
      "import { ${TM_FILENAME/^([^.]+)/${1:/pascalcase}/}Component } from './${TM_FILENAME/^([^.]+)//}.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';
...

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

这两个都有效:

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

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

使用 vscode 片段转换,如果您想 排除 部分变量,从文件名中删除 .component.js,那么变量的一部分必须在正则表达式中说明 - 因此 (.*?)\..+.

否则"unseen"部分变量正好通过。

因此您的正则表达式 ^([^.]+) 准确地捕获了第一个 . 之前的文件名部分,但随后变量的其余部分 "passing through" 未修改。

你可以通过这个例子更清楚地看到这一点:

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

产生:

import { fun-thing.component.jsComponent }

所以整个文件名都通过了,尽管 none 被捕获了。

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

如果它不在 "everything to be transformed" 部分,则不会发生任何事情。