- 如何在编辑器中自定义代码片段?提供补全前缀,提供补全内容,然后就可以直接使用了.
- 但是只能在当前文件,当前输入位置插入特定内容,有时候不能满足需求
- 如果我们想引入一个服务,当服务不存在时那么自动创建,只能靠我们自己,因为代码片段是
静态的
不能做到可编程
- 如果您有这种需求,并想实现,那么不妨试一试
Code Recycle
导入一个服务
{
"prefix": [
"import"
],
"body": " ",
"regexp": {
"pattern": "\\.([\\p{L}\\p{N}]+)",
"flag": "u"
},
"pattern": "**/*.ts",
"dynamicMode": true,
"script": "./import-class.ts"
}
let fn: ScriptFunction = async (util, rule, host, injector) => {
let importName = util.documentContext.snippetParameters![1];
let _ = util.lodash;
let className = _.upperFirst(_.camelCase(importName));
let rootCtx = util.initContext();
await util.changeList(
[
// 查询类是否存在
{
path: `*.ts`,
name: 'classPath',
glob: true,
list: [
{
query: `export class ${className}`,
mode: 'like',
optional: true,
callback(context, index) {
let classPathCtx = context.getContext('root.classPath');
classPathCtx.data = context.node!.path!;
},
},
],
},
],
rootCtx
);
let filePath = rootCtx.getContext('root.classPath').data;
if (!filePath) {
// 从模板中创建
await util.changeList([
{
type: 'copy',
from: join(__dirname, './template/__name@dasherize__.ts'),
to: './',
pathTemplate: '@angular-devkit',
contentTemplate: '@angular-devkit',
templateContext: { name: importName },
},
]);
let changedRecord = host.records();
filePath = util.path.normalize((changedRecord[0] as any).path);
}
let pathRelative = require('../shared/path-relative');
// 插入引用
let changed = await util.changeList([
{
path: util.filePathGroup.currentPath,
list: [
{
range: [0, 0],
replace: `import {${className}} from '${pathRelative(util.filePathGroup.currentPath, filePath, util)}'\n`,
},
{
range: util.documentContext.insertRange![0].range,
replace: `let ${importName} = new ${className}()`,
},
],
},
]);
await util.updateChangeList(changed);
};
- 在编辑器中的
ts
文件里输入import.hello
,完成补全时,会自动引入Hello
类,并实现初始化
更多?
- 实例
- 工具目前支持
CLI
与VSCode Extension
进行执行,脚本支持yaml
/js
/ts
- 您可以查看文档了解更多
- 如果您已经感兴趣,那么可以快速开始
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。