C/C++ Struct Member Expander
独立 VSCode 扩展:在结构体变量的 . 或 -> 后,一键展开当前语言服务提供的全部成员赋值,右侧留空,按 Tab 逐项填写。不依赖 Keil,也不修改工程文件。
安装
- VSCode 1.85 或更新版本。
- 安装并配置 Microsoft C/C++(
ms-vscode.cpptools)或 clangd(llvm-vs-code-extensions.vscode-clangd),二选一提供准确的成员补全。
- 扩展面板右上角「…」→「从 VSIX 安装…」→ 选择
c-struct-member-expander-1.0.1.vsix,按提示重载窗口。
若曾安装旧发布者下的结构体展开扩展(keil-file-importer.c-struct-member-expander),请先卸载旧版,再安装本包,避免相同命令重复注册;不需要卸载 Keil File Importer 文件导入扩展。
本扩展不是语言服务器,不会安装编译器。先确认输入 变量. 能看到成员补全;如果原本没有补全,应先修正 includePath / 宏定义 / 编译配置。Keil Assistant 的工程树本身不提供 C/C++ 类型信息。
使用:以 STM32 为例
已有声明:
SPI_InitTypeDef SPI_InitStructure;
在函数内部的独立一行输入以下内容,光标放在点号之后:
SPI_InitStructure.
按 Ctrl+Alt+J(macOS:Cmd+Alt+J),或者右键 → C/C++: 展开结构体全部成员赋值(空值);命令面板中也可以搜索该命令。补全弹窗遮挡时可以先按 Esc 关闭,再执行。快捷键冲突时可在 VSCode 键盘快捷方式中搜索命令并重新绑定。
生成示例(成员顺序由语言服务决定):
SPI_InitStructure.SPI_Direction = ;
SPI_InitStructure.SPI_Mode = ;
SPI_InitStructure.SPI_DataSize = ;
SPI_InitStructure.SPI_CPOL = ;
SPI_InitStructure.SPI_CPHA = ;
SPI_InitStructure.SPI_NSS = ;
SPI_InitStructure.SPI_BaudRatePrescaler = ;
SPI_InitStructure.SPI_FirstBit = ;
SPI_InitStructure.SPI_CRCPolynomial = ;
第一个空值处自动获得光标:输入值 → Tab 到下一个空值;Shift+Tab 返回上一个;最后一次 Tab 跳出片段。空值确实为空,绝不自动填入 0。填写前的 = ; 是故意保留的不完整语法,报错属于正常现象。 不需要先在补全列表中逐个选择成员。生成后不保存文件,可撤销。
支持的输入
cfg.
ptr->
device.config.
ptr->config.
items[0].
items[index].
- 只支持当前一行单个光标、无选区,表达式单独占据一行;可保留原缩进,也允许末尾已有一个分号(光标必须在它之前)。
- 不需要预先为每种结构体编写模板;类型、头文件和宏上下文由现有语言服务处理。
- 只展开一层 Field / Property;去重,不生成方法或函数调用,不执行补全项命令,也不用补全项的 textEdit / insertText。
- 读取的是语言服务返回的完整候选列表,不解析固定 STM32 头文件。若服务标记列表不完整,则拒绝生成,避免静默遗漏;索引完成后重试。
- 没有结果、超时、取消、光标/文档/活动编辑器发生变化时,不进行插入。修改只发生在当前输入行,不改其它行或文件。
- 为避免重复求值副作用,不接受
getConfig().、items[i++].、含内部空格、括号解引用、嵌入 if/return 的表达式,也不处理宏展开;请先用简单变量承接,再输入 变量. 或 指针->。
- 使用 ASCII C/C++ 标识符;不支持含中文/Unicode 或特殊符号的成员名。注释与字符串中的触发会被保守拒绝;词法保护不是完整的预处理器。
- 不递归展开嵌套结构体,不展开数组元素,不跳过你之前在其它行写过的赋值。
- 数组、const/只读成员等不一定能直接赋值;联合体也不应盲目逐项赋值。本扩展只生成待填写模板,不保证所有模板行在填写后都合法,请按实际类型调整或删除。
常见问题
没有成员 / 只出现关键字:先检查 C/C++ 语言模式、头文件搜索路径及宏,等待索引完成。在完全相同的点号位置按 Ctrl+Space 验证补全是否正常。
不能输入到空位:生成后不要先点击别处,直接输入并按 Tab。若已经退出 snippet 状态,仍可正常手动编辑。
已有 Keil 文件导入扩展:可以同时安装,扩展 ID 与命令不同,无需卸载 Keil File Importer。
开发与打包
运行时无第三方依赖,源码为 CommonJS,不需要编译或联网。开发及打包建议 Node.js >= 22、pnpm 11:
pnpm install --frozen-lockfile --ignore-scripts
pnpm test
pnpm run package
源码包包含纯核心测试、模拟 VSCode API 测试,以及真实 VSCode Extension Host 集成测试:
test/vscode/run.cjs:受控成员补全提供者,已在 VSCode 1.142.0 验证真实编辑器中的缩进、空占位符、Tab/Shift+Tab、CRLF 和撤销。
test/vscode/cpptools.cjs:已用本机 Microsoft C/C++ 1.34.4 读取测试头文件中的 SPI 结构体,验证 9 个成员全部展开、右侧留空、未写磁盘及撤销。测试类型是与示例同名字段的最小夹具,不是完整 STM32 工程。
以上不等同于对所有语言服务版本、编译配置及真实 STM32 工程的兼容性承诺。Windows 下可用独立的测试配置目录复现,不会修改日常 VSCode 配置:
# 真实编辑器 + 受控补全服务
./scripts/test-vscode.ps1
# 真实 Microsoft C/C++ 服务(路径从自己的 VSCode 查询,不附带该扩展)
$cpp = code --locate-extension ms-vscode.cpptools
./scripts/test-vscode.ps1 -CppToolsDirectory $cpp
需要先安装 VSCode,并让 code 命令可用;也可用 -CodeCommand 指定完整 CLI 路径。脚本会短暂打开独立测试窗口,测试后自动退出,不会写入测试夹具。打包 VSIX 后可用 python scripts/package-source.py 校验包内源码与发布者信息,并生成不含依赖目录的源码 ZIP。
发布信息
- 显示名称:C/C++ Struct Member Expander
- 发布者 ID:
c-struct-member-expander
- name:
c-struct-member-expander
- 完整扩展 ID:
c-struct-member-expander.c-struct-member-expander
- 版本:
1.0.1
如自行上传 Marketplace,请选发布者 c-struct-member-expander,确保包内 publisher 与账号一致。项目没有虚构的仓库地址;发布到真实仓库后可自行补上 repository 字段。本扩展为非官方独立工具,与 Microsoft、LLVM、Keil 无隶属关系。MIT 许可证。