Yimi Client VS Code Extension H01
这是 YimiClient/YimiClientVSCExtension 面向 H01 项目的精简复刻版本。
本仓库不做完整功能复刻,优先保留三个目标能力:
Description 悬停提示
- 服务器枚举补齐
EColor 颜色块展示与补全
参考上游版本:YimiClient/YimiClientVSCExtension,已对照提交 cff3a496f186。
功能范围
Description 悬停提示
在 TypeScript 文件中把鼠标悬停到 m.lang.getStr(125134) 这类调用的数字 ID 上时,扩展读取 H01 小游戏项目中的描述文件并展示对应文本。
H01 实际链路:
game1/src/mod/language/Language.ts
game1/src/mod/language/Description.ts
Language.getStr(key, ...param) 直接读取 Description.ts 里的 desc 对象;web/root/cfg 是运行时配置表目录,不参与 Description 文案悬停链路。
当前实现:
- 只注册
typescript / typescriptreact hover provider。
- 命中
m.lang.getStr(...) 或 getStr(...) 第一个参数表达式里的 Description ID 时展示文案。
- 支持
m.lang.getStr(m.raidPlunder.cache.isInspire ? 125153 : 125154) 这类条件表达式,悬停任一 ID 都能展示对应文案。
- 默认读取
game1/src/mod/language/Description.ts。
- 未配置项目路径时,会尝试从当前 TS 文件路径或 workspace folder 推导 H01
Client/project 路径。
- 文件不存在、路径未配置或 ID 未命中时安静返回空 hover。
悬停展示格式:
Description
[125153] = 已激活
[id] 使用普通文本,等号后的描述文本高亮显示。
效果示例:

服务器枚举补齐
在 TypeScript 文件中把光标放到服务端枚举值上执行命令 Yimi H01: Fix Server Enum,扩展会读取 H01 的 game1/libs/msgEnum.d.ts,把裸枚举值补成短限定名,并补齐对应 import。
当前实现:
- 默认读取
game1/libs/msgEnum.d.ts。
- 支持
ECmdGateSpeADayCumulatePay 这类裸枚举值,执行命令后替换为 EGateCommand.ECmdGateSpeADayCumulatePay。
- 支持同一
msg 子命名空间下的多个 const enum,例如 ELDTaskPetCollect 会补成 ELianDonDailyTask.ELDTaskPetCollect。
- 支持把
msg.GateCommand.EGateCommand.ECmdGateSpecialActiveUpdate 精简为 EGateCommand.ECmdGateSpecialActiveUpdate。
- 如果当前文件没有
import EGateCommand = msg.GateCommand.EGateCommand;,会插入到现有 import 区域末尾。
- 如果已经有相同 import,不会重复插入。
- 如果同名枚举值对应多个
msg.* 命名空间,会提示并停止处理,不修改文件。
效果示例:

EColor 颜色块展示与补全
在 TypeScript 文件中出现 EColor.Color102 这类颜色标签时,扩展会读取 H01 的 game1/src/common/enum/EColor.ts,解析 Color102 = "#FFFEEB" 这类枚举值,并通过编辑器装饰在标签前显示对应颜色块。
当前实现:
- 只处理
typescript / typescriptreact 文件。
- 默认读取
game1/src/common/enum/EColor.ts。
- 支持
EColor.Color001、EColor.Color102、EColor.Color403 等 Color数字 枚举成员。
- 在输入
EColor. 后提供自定义颜色补全项,补全项使用 Color 类型并显示对应十六进制值。
- 输入或粘贴
#694d3d / "#694d3d" / rgb(220,117,53) 这类已配置色值时,会自动替换成对应的 EColor.ColorXXX;如果已经在 EColor. 后输入,则只替换成 ColorXXX。
- 补全说明面板展示对应色块;补全列表主行受 VS Code API 限制,只能显示内置
Color 图标和文本值。
EColor.ts 更新后按文件修改时间自动重新读取;也可执行刷新缓存命令手动清缓存。
- 不注册 VS Code
DocumentColorProvider,因此悬停颜色标签不会打开颜色选择器面板。
代码内颜色块:

候选项颜色块:

自动识别色值并转换成枚举:

非目标范围
本 H01 版本暂不复刻以下上游能力:
- Description 迁移
- 文本转 Description ID
- UI Binding 补全
- 代码风格转换
- Snippets
- Prefab 文本初始化
- 测试脚手架以外的上游辅助脚本
使用方式
开发宿主测试
在 VS Code 打开本扩展仓库。
执行:
npm install
npm run compile
按 F5 启动 Run Extension。
在新打开的 Extension Development Host 窗口中打开 H01 项目:
/Users/huangzhuofu/Documents/Yimi/Project/H01/Client/project
打开一个 TypeScript 调用点,例如 game1/src/mod/role/ui/RoleDetailsTip.ts,悬停 m.lang.getStr(100000) 里的 100000,预期展示 基础属性。
如果需要验证条件表达式,可临时写:
m.lang.getStr(m.raidPlunder.cache.isInspire ? 125153 : 125154)
悬停 125153 应展示 已激活,悬停 125154 应展示 未激活。
服务器枚举命令测试
在任意 H01 TypeScript 文件中输入:
this.addMsg(ECmdGateSpeADayCumulatePay, this.__onSpeADayCumulatePay);
把光标放在 ECmdGateSpeADayCumulatePay 上,执行命令面板里的 Yimi H01: Fix Server Enum,预期变成:
import EGateCommand = msg.GateCommand.EGateCommand;
this.addMsg(EGateCommand.ECmdGateSpeADayCumulatePay, this.__onSpeADayCumulatePay);
如果原来是:
this.addMsg(msg.GateCommand.EGateCommand.ECmdGateSpecialActiveUpdate, this.__onActiveUpdate);
执行同一命令后会精简为:
this.addMsg(EGateCommand.ECmdGateSpecialActiveUpdate, this.__onActiveUpdate);
并确保文件顶部已有 EGateCommand import。
同一 msg 子命名空间下的后续枚举也会被解析。例如输入:
const task = ELDTaskPetCollect;
把光标放在 ELDTaskPetCollect 上,执行命令后预期变成:
import ELianDonDailyTask = msg.ActiveDef.ELianDonDailyTask;
const task = ELianDonDailyTask.ELDTaskPetCollect;
EColor 颜色块和补全测试
打开任意包含 EColor.Color102 的 H01 TypeScript 文件,例如:
HtmlUtil.setHtmlContents(this._ui.txt_jump, text, 400, 30, EColor.Color102, 24);
预期 EColor.Color102 前显示 VS Code 颜色块,颜色对应 #FFFEEB。
输入 EColor. 时,预期候选中出现 Color102 等颜色补全项,并显示对应十六进制值。
输入 #FFFEEB、"#FFFEEB" 或 rgb(255,254,235) 时,预期自动替换成 EColor.Color102;在 EColor. 后输入 #FFFEEB 或 rgb(255,254,235) 时,预期自动替换成 Color102。
配置
优先使用独立配置命名空间,避免和原扩展冲突:
{
"yimiclienth01.curProjectPath": "/path/to/H01/Client/project",
"yimiclienth01.descriptionFile": "game1/src/mod/language/Description.ts",
"yimiclienth01.msgEnumFile": "game1/libs/msgEnum.d.ts",
"yimiclienth01.colorEnumFile": "game1/src/common/enum/EColor.ts"
}
如果 Extension Development Host 直接打开的是 H01 Client/project,通常不用配置 curProjectPath。如 H01 的资源路径变化,优先调整 descriptionFile、msgEnumFile 或 colorEnumFile。
Description 表、msgEnum 文件和 EColor 文件更新后会按文件修改时间自动重新读取;也可以在命令面板执行 Yimi H01: Refresh Description Cache 手动清缓存。
发布与安装
本地 VSIX 打包
执行:
npm install
npm run vsix
预期生成:
yimi-client-vscode-extension-h01-0.1.0.vsix
本地安装验证:
code --install-extension yimi-client-vscode-extension-h01-0.1.0.vsix
如需覆盖安装,先在 VS Code 扩展面板卸载旧版本,或递增 package.json 里的 version 后重新打包。
发布到 VS Code Marketplace
当前 Marketplace publisher 为:
Newbility523
首次发布前需要使用有 Newbility523 publisher 权限的 Azure DevOps Personal Access Token 登录。PAT 需要使用:
Organization: All accessible organizations
Scopes: Custom defined -> Marketplace -> Manage
登录:
npx @vscode/vsce login Newbility523
如果提示 Publisher 'Newbility523' is already known,选择覆盖旧 PAT:
Do you want to overwrite its PAT? [y/N] y
首次发布当前 package.json 中的版本:
npx @vscode/vsce publish
如果提示当前版本已经存在,发布 patch 版本:
npm run publish:patch
publish:patch 会递增 package.json 里的版本号。发布成功后提交版本变化:
git add package.json package-lock.json
git commit -m "chore: release 0.1.1"
git push
如果要发布指定版本,先手动修改 package.json 的 version,再执行:
npx @vscode/vsce publish
发布后可在 publisher 后台查看:
https://marketplace.visualstudio.com/manage/publishers/Newbility523
VS Code 扩展面板中搜索完整 ID 最稳定:
@id:Newbility523.yimi-client-vscode-extension-h01
命令行安装:
code --install-extension Newbility523.yimi-client-vscode-extension-h01
Marketplace 页面:
https://marketplace.visualstudio.com/items?itemName=Newbility523.yimi-client-vscode-extension-h01
如果 vsce login 偶发报 Request timeout: /_apis/securityroles,通常是 Marketplace / Azure DevOps 权限校验接口超时,等待一会儿或切换网络后重试即可。
当前包内已包含最小授权的专有 LICENSE.md。
生成文件
以下内容不进入仓库:
node_modules/
out/
dist/
.vscode-test/
coverage/
*.vsix
*.tgz
*.tsbuildinfo
当前状态
- 已完成:文档、ignore 文件、上游功能边界梳理。
- 已完成:TypeScript VS Code 扩展脚手架。
- 已完成:H01
Description.ts 悬停提示。
- 已完成:服务器枚举补齐。
- 已完成:
EColor.Color102 这类颜色标签的颜色块展示与 EColor. 颜色补全。
更多细节见: