Fig自定义补全规范

fig最有价值的就是补全规范定义,这里mark下如何自定义规范及投入生产使用

fig规范例子

https://fig.io/docAssets/autocomplete/handbook/cli_structure.png

  1. cd命令:https://github.com/withfig/autocomplete/blob/master/src/cd.ts
  2. echo命令:https://github.com/withfig/autocomplete/blob/master/src/echo.ts
  3. git命令:https://github.com/withfig/autocomplete/blob/master/src/git.ts#L4024

Spec定义戳这里

官方Fig补全仓库方式贡献

官方仓库提交将作为公共补全。具体使用官方readme已经说明很清晰。

这里简单赘述下。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# fork https://github.com/withfig/autocomplete

# Replace `YOUR_GITHUB_USERNAME` with your own GitHub username
git clone https://github.com/YOUR_GITHUB_USERNAME/autocomplete.git fig-autocomplete
cd fig-autocomplete

# Add withfig/autocomplete as a remote
git remote add upstream https://github.com/withfig/autocomplete.git

# Install packages
pnpm install

# Create an example spec (call it "abc")
pnpm create-spec abc

# Turn on "dev mode",本地fig会加载该目录下规范
pnpm dev

总结就是fork repo后按照要求生成补全规范=>测试=>提PR。

不走官方repo方式

不走官方repo方式即私有规范。

这里描述下方法,步骤如下。

1
2
3
4
5
6
# 创建规范
npx @withfig/autocomplete-tools create-spec

# 生成补全文件,测试,同时CodeWhisperer中自定义规范文件夹会被写入该规范路径
npx @withfig/autocomplete-tools dev

当执行上述dev时已经进行TS编译和注册到index.js,只是因为是单独的repo,因此index.js中只注册了自定义创建的单个规范。实际使用的话,可以在确定规范可用后,放在官方的规范文件夹下一块走下打包。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
const completionSpec: Fig.Spec = {
name: "ak",
description: "",
subcommands: [{
name: "say",
description: "Example subcommand",
subcommands: [{
name: "haha",
description: "Nested subcommand, example usage: 'abc my_subcommand my_nested_subcommand'"
}],
}],
options: [{
name: ["--help", "-h"],
description: "Show help for abc",
}],
// Only uncomment if abc takes an argument
// args: {}
};
export default completionSpec;

https://static.1991421.cn/2024/2024-01-18-160706.jpeg

https://static.1991421.cn/2024/2024-01-18-215649.jpeg

index.js中注册方式如下

1
var e=["ak"],diffVersionedCompletions=[];export{e as default,diffVersionedCompletions};

开发模式开关

  • CodeWhisperer下直接GUI操作即可。

  • Fig App可以走如下命令开关

1
fig settings autocomplete.developerModeNPM false