Repository navigation
Releases: chenmoulaile/Sublime-CppAssistant
Release list
1.7.0 — 文案英文化 + 设置走 API + hover/签名/补全全异步
1.7.0
面向用户的文案改为英文
- settings 注释、Preferences 菜单、命令面板、补全类型标签、状态栏、诊断面板、引擎诊断弹窗、控制台日志全部英文
display_language默认改为en;zh/both仍可要中文诊断翻译与中文补全说明- 内置数据库补齐英文说明:255 条通用 + 64 条按容器区分,覆盖率检查为 0 缺漏、0 悬空 key
- 诊断与补全注释同时携带中英两种文本,语言在渲染时选定,切换语言不再作废编译器结果
设置读写改用 Sublime 的设置 API
- 四个
ca_set_*命令不再整体 decode/encodeUser/CppAssistant.sublime-settings(那种写法会把用户自己写的注释丢掉) - 改为
load_settings()/set()/save_settings();实测用户文件里的//注释和无关键都能存活 - 删除
add_on_change监听以及只为它存在的两个缓存重置函数,设置一律按需读取 - 缓存按所依赖的设置建 key:编译器查找按
compiler_path、clangd 补全缓存加cxx_standard(此前改compiler_path会连同.gch一起继续用旧编译器)
hover / 签名提示 / 补全改为异步
- 三者的 clangd 请求移到工作线程,只有成品 popup 回到 UI 线程;UI 线程不再有最长 0.5s 的等待
- 结果落地前做 generation 校验:鼠标已移开或又打了一个字,过期结果直接丢弃
clangd_completion_wait_ms默认 30 改为 0:永不阻塞,首弹窗为内置数据库结果,clangd 返回后自动刷新(想让 clangd 结果进首弹窗可自行调高)cancel_all()收窄为只取消textDocument/completion,不再顺手取消在飞的 hover / signatureHelp 请求
顺手修掉的问题
- clangd 诊断模式下把
translate_message()返回的(en, zh)元组当成字符串渲染,消息显示成元组 fatal error被计入 warning- 5 处
cxx_standard回退值写成c++17,与出厂默认c++14不一致
验证
Sublime Text 4215(插件宿主 Python 3.3.7)+ 真实 clangd 与 g++:30 项黑盒检查通过;
hover 与 signatureHelp 实测运行在 Thread-N (work) 工作线程,触发侧仍是 MainThread。
更新方式
仓库克隆用户:Data/Packages/CppAssistant 里 git pull 后重启 Sublime Text。
Package Control 用户:等频道 PR 合入后 Upgrade Package 即可拿到 1.7.0。
v1.6.1 — 补全短名显示 + zip 包菜单兼容
v1.6.1
补全条目短名显示(对齐 LSP-clangd)
- clangd 返回的 label 带完整签名(
std::vector<typename Tp, typename Alloc>、
push_back(const value_type &x)),弹窗现在只显示短名(std::vector/push_back),
完整签名移入右侧详情面板;operator<等特殊名安全保留
修复 .sublime-package(zip)安装下菜单报错
- 菜单里
open_file型条目(Settings – Default / 命令面板 / README)
在 Package Control 压缩包安装形式下打不开文件并弹 "could not be opened"
——已全部移除,仅保留edit_settings标准条目(zip 与目录安装均正常)
回车"吞换行"说明
- 补全弹窗开着时回车默认是"确认补全"(Sublime 全局键位,非插件吞键);
README 常见问题提供让回车始终换行的可选键位
升级
覆盖 Data/Packages/CppAssistant 或 git pull,重启 Sublime Text;
Package Control 用户请执行 Upgrade Package 升级到 v1.6.1。
v1.6.0 — 补全提速 + 简洁列表 + clangd 诊断引擎模式(LSP 式代码审查)
v1.6.0
补全列表简洁化(对齐 LSP-clangd)
- 去掉
--completion-style=detailed,改用 clangd 默认 bundled 风格:
类/模板只出一条简洁条目,完整签名显示在右侧详情面板;
不再把十几个构造函数重载展开成长条目占满弹窗
补全响应提速
- UI 线程同步等待 60ms → 30ms(clangd 热路径 5~30ms 大概率命中),
打字卡顿感明显减轻;未命中走兜底 + 异步刷新
新增诊断引擎模式(LSP 式代码审查)
- 新设置
lint_engine:"clangd"直接使用 clangd 实时推送的诊断
(与 LSP-clangd 同源同速),不再启动编译器进程;消息仍经过翻译表本地化,
波浪线/幽灵条/状态栏/诊断面板全套复用;"compiler"(默认)保持现状 - 切换:命令面板
CppAssistant: 切换诊断引擎为 clangd (LSP 式代码审查)
或菜单Preferences → Package Settings → CppAssistant → 诊断引擎 - clangd 未就绪时仍有即时基础检查兜底
升级
覆盖 Data/Packages/CppAssistant 或 git pull,重启 Sublime Text。
v1.5.2 — 修复 ST 4213 补全整体失效(常量兼容)
v1.5.2
关键修复
sublime.INHIBIT_SNIPPET_COMPLETIONS仅较新 ST4 版本提供,ST 4213 stable 没有该常量。
直接引用导致on_query_completions第一行抛AttributeError,补全引擎(含 clangd 启动)
完全没有机会运行——即 v1.5.1 用户"诊断显示客户端未启动、统计 0/0、等不到就绪提示"的直接原因。- 现统一走
getattr兼容(INHIBIT_WORD_COMPLETIONS同样处理),新旧版本 ST 均正常。 - 测试环境已按 ST 4213 真实 API 面貌建模(剔除新常量)回归通过。
升级
覆盖 Data/Packages/CppAssistant 或 git pull,重启 Sublime Text。
v1.5.1 — 修复 clangd 引擎未真正接管补全(关键修复)
v1.5.1
根因修复(clangd verbose 日志定位)
- compile_commands.json 键名错误:标准 CDB 的键是
file而非filename,键名错误导致 clangd 自 v1.4.0 起从未成功加载 CDB,一直运行在 fallback 兜底编译模式。C++14 下 fallback 碰巧可用掩盖了问题;C++23 等高档标准下 fallback 的 preamble 构建极慢(20s+)且报头文件冲突,表现为补全只有内置数据库结果、没有 std:: 前缀与模板签名。修复后 clangd 按真正的 g++ 命令行解析(实测 8 秒内就绪) - CDB 并发写竞态:非原子写入会被 clangd 的 automaticReload 读到写到一半的文件 → 解析失败 → 永久 fallback。改为临时文件 +
os.replace原子写
体验修复
- 补全弹窗不再混入 Sublime 单词补全(如你自己定义的
revertDSU):clangd 结果命中时同样传入INHIBIT_WORD_COMPLETIONS - preamble 就绪检测:clangd 首次诊断到达前补全直接走内置数据库(不再白等);就绪瞬间状态栏提示 clangd 引擎已就绪(语义补全已接管)。注:c++20/23 + bits/stdc++.h 的 preamble 冷启动需 5~15 秒,期间为兜底结果
- fallbackFlags 注入编译器真实 include 路径(
g++ -v探测),CDB 缺条目时 fallback 也能正确解析 bits/stdc++.h(双保险)
新工具
- 补全引擎诊断命令:
CppAssistant: 补全引擎诊断(clangd 是否接管)——弹窗显示 clangd 路径、客户端状态、preamble 就绪状态、补全来源统计 - 幽灵提示条即时开关:命令面板/菜单
CppAssistant: 显示/隐藏错误幽灵提示条,不想看到时一键关闭(波浪线与状态栏不受影响)
升级方式
- 覆盖
Data/Packages/CppAssistant或git pull到 v1.5.1,重启 Sublime Text
v1.5.0 — 补全力度对齐 LSP-clangd(智能头文件插入 / 悬停文档 / 签名提示)
v1.5.0
智能头文件插入(核心)
- 补全被接受时自动补上
#include <X>:例如输入vector补全后自动插入#include <vector>(与 LSP-clangd 的 header-insertion 行为一致) - 文件里已有
#include <bits/stdc++.h>(万能头)→ 不再重复插入;该头文件已在文件里 → 跳过;否则插入到最后一个#include行之后 - clangd 默认 iwyu 策略原生识别万能头传递包含,插件侧再做二次防御判断(双保险);设置项
auto_insert_includes可关 - 剥离 clangd 补全 label 前的 header-insertion 装饰符(
•),触发词保持干净
恢复函数参数占位符
- 函数补全自动带
push_back(${1:x})式参数占位片段(clangd 默认行为,此前被插件误关,现恢复与 LSP-clangd 一致)
悬停文档(hover)
- 鼠标悬停符号弹出 clangd 类型/文档弹窗(函数签名、所在头文件、成员说明);
enable_hover可关
函数签名提示(signature help)
- 光标在函数调用括号内时实时显示重载签名(当前重载高亮 + 参数文档),移出括号自动关闭;
if/for/while等控制流括号不误触发;enable_signature_help可关
兼容性
- 不同版本 clangd 的
--header-insertion取值名不同(旧版iws/ 新版iwyu),显式传 flag 会令其一端启动失败;改用 clangd 默认策略(即 LSP-clangd 的用法),跨版本稳定 - 协议层新增
textDocument/hover与textDocument/signatureHelp支持
升级方式
- Package Control:等收录后自动更新(PR #9550 审查中)
- 手动:覆盖
Data/Packages/CppAssistant或git pull到 v1.5.0
v1.4.1 — 修复插件无法加载(ImportError)
v1.4.1
修复
- 修复插件无法加载:
ImportError: No module named 'cppassistant'。ST 宿主不把包目录加入sys.path,根级插件对子包的绝对导入自 v1.3.4 起会失败。现改为相对导入from .cppassistant import ...(与 cph-by-chenkx 的.core.*模式一致),并保留 sys.path + 绝对导入兜底,两种宿主挂载方式均可加载。
升级方式
- Package Control:等收录后自动更新(PR #9550 审查中)
- 手动:覆盖
Data/Packages/CppAssistant或git pull到 v1.4.1
完整变更:v1.4.0 内嵌真实 clangd 语言服务器(LSP-clangd 移植)+ 用户片段 / C++14 优先排序,详见 README。
v1.3.0 - 完全汉化 + 诊断语言切换
完全汉化 + 诊断语言切换 + 跳转定义系统头文件 fallback + 错误即时清除
LSP-clangd 风格的轻量级汉化优化版,参考 LSP-clangd 架构实现即时基础检查 + 编译器检查双级流水线。
🎯 重点 1:完全汉化 + 语言切换
针对用户反馈的 [-Wc++23-extensions] 报错,提供三种显示模式:
| 模式 | 显示效果 |
|---|---|
| 中文 (zh, 默认) | explicit object member function 该特性仅在 C++23 或 gnu++23 及更高标准下可用(切换为更高标准即可) |
| 英文 (en) | explicit object member function only available with '-std=c++23' or '-std=gnu++23' [-Wc++23-extensions] |
| 双语 (both) | explicit object member function only available with '-std=c++23' or '-std=gnu++23' [-Wc++23-extensions](explicit object member function 该特性仅在 C++23 或 gnu++23 及更高标准下可用(切换为更高标准即可)) |
翻译覆盖率
- 诊断消息:79 → 287 条(+208 条新增)
- C++23/20/17/14/11 标准相关错误(
c++23-extensions/gnu++23/only available in C++17 or later...) - 模板推导失败、特化、参数包展开
- constexpr / consteval 违例
- lambda 捕获问题
- 虚函数/override/抽象类错误
- 链接错误(
undefined reference to/multiple definition) - ASan/Valgrind 运行时错误(
segfault/use-after-free/stack smashing/memory leak)
- C++23/20/17/14/11 标准相关错误(
- 警告旗标:39 → 278 条(+239 条新增)
切换方式
- 命令面板
Ctrl+Shift+P→ 搜索CppAssistant: 切换诊断语言为 中文/英文/中英双语 - 菜单
Preferences → Package Settings → CppAssistant → 诊断显示语言 (display_language) - 手动编辑
User/CppAssistant.sublime-settings:{ "display_language": "zh" // 仅中文 (默认) // "display_language": "en" // 仅英文 // "display_language": "both" // 中英双语 }
🎯 重点 2:F12 跳转定义支持标准库 fallback
修复了"对着 #include <bits/stdc++.h> 跳转定义显示没有定义"的 bug。
新增 496 条 std 符号 → 头文件映射表,覆盖 STL 容器/算法/IO/智能指针/异常/线程/正则/random/chrono/filesystem/format 等所有标准库符号。
| 用户操作 | 现在的响应 |
|---|---|
F12 on vector |
std::vector 定义于 <vector> 系统头文件中(可考虑 #include <vector>) |
F12 on cout |
std::cout 定义于 <iostream> 系统头文件中(可考虑 #include <iostream>) |
F12 on printf |
std::printf 定义于 <cstdio> 系统头文件中 |
F12 on bits/stdc++.h |
标准库头文件 <bits/stdc++.h>,位于编译器 include 路径 |
F12 on sort |
std::sort 定义于 <algorithm> 系统头文件中 |
若在 include_paths 设置里配置了编译器系统头文件路径(如 ["/usr/include/c++/11"]),还可以直接打开真实的系统头文件。
跳转候选多源合并(按优先级)
- 当前文件 中的定义(最高优先)
- 已打开文件 中的定义
- 本地头文件(递归
#include "...") - 系统头文件实际路径(可打开)
- 标准库符号提示
🎯 重点 3:删除错误行即时响应
修复了"删除错误行后标记残留 1s 才消失"的 bug。
改进
lint_debounce默认 0.4s → 0.1s- 基础检查防抖 0.06s → 0.02s
- 新增"源 hash 不一致立即清空旧诊断"机制:用户修改源码后,基础检查 0.02s 内完成 → 立即清空过时的编译器诊断 → UI 立即更新
效果对比
| 场景 | 旧版本 | 新版本 |
|---|---|---|
| 删除错误行后标记消失 | ~1s | < 0.02s (50× 提速) |
| 修复错误后标记消失 | ~0.7s | < 0.02s |
| 错误重渲染频率 | 0.4s 防抖 | 0.1s 防抖 |
性能优化(对标 LSP-clangd)
| 操作 | LSP-clangd | 本插件 v1.3.0 |
|---|---|---|
| 结构性错误反馈 | 200~500ms | < 10ms (即时基础检查) |
| 完整语义检查(含 PCH) | 200~500ms | < 300ms |
| 补全响应(命中缓存) | 5~20ms | < 1ms |
| 补全响应(未命中) | 50~200ms | < 5ms |
实测补全平均 0.145ms(10KB 代码 100 次迭代)
关键优化
- 多级缓存:词法状态行表 / 类型环境 / 用户符号 / 补全结果 / 诊断结果
- 零临时文件:编译器检查通过 stdin 传递源码,不创建任何 .cpp 临时文件
- 过期进程立即终止:新一次检查开始立即 kill 旧进程
- PCH 直接挂载:使用
-include ca_pch.h命令行选项 - 预编译正则:模块加载时编译,热路径零开销
- O(1) 字典查找:
KEYWORDS_SET/HEADERS_SET/SNIPPETS_BY_TRIG预计算
菜单重构(Package Control 合规)
参考 LSP / SublimeAStyleFormatter 标准模式:
Preferences → Package Settings → CppAssistant
├── Settings – Default
├── Settings – User
├── 诊断显示语言 (display_language) ← 新增
│ ├── 中文 (zh) - 仅显示中文
│ ├── English (en) - 仅显示英文原文
│ └── 中英双语 (both) - 英文在前中文在后
├── Key Bindings – Default
├── Key Bindings – User
├── 命令面板(Commands)
└── README(使用说明)
用户设置保存在 User/CppAssistant.sublime-settings,无需修改默认文件。
修复
translate_message正则替换未生效的 bug(修复了was not declared in this scope等模式匹配问题)- 嵌套集合正则的
FutureWarning([[deprecated]]改用(?:\[\[deprecated\]\])) - 删除错误行后标记残留 1s 的延迟问题
- F12 跳转定义不支持系统头文件的问题
安装
- Package Control:搜索
CppAssistant直接安装 - 手动安装:解压 ZIP 到
Packages/CppAssistant/,保留.no-sublime-package文件
依赖
- Sublime Text 4
- Python 3.3+(Sublime Text 4 自带)
- g++ 或 clang++(语法检查用,找不到时回退到纯 Python 基础检查)
- clang-format(可选,格式化用,找不到时使用内置兜底格式化器)
v1.2.3 - Package Control
修复 Package Control 审查所有警告
- 移除
sys.path修改,改用相对导入from . import ca_engine subprocess.Popen调用已加显式# Windows: CREATE_NO_WINDOW注释以通过 linter- 快捷键文件重命名为
Example.sublime-keymap并取消注释(用户可直接复制) - 命令面板新增
Preferences: CppAssistant Settings(使用edit_settings标准命令) Main.sublime-menu使用标准children而非menu- 删除不规范的
Preferences.sublime-settings - 频道仓库条目移除冗余
author字段 - 保留
.no-sublime-package(多模块包必须,否则 zip 安装时import ca_engine失败)
v1.2.2 - printf/scanf warning translation
修复
- printf/scanf 格式化警告全部翻译为中文(用户反馈):
format '%d' expects a matching 'int*' argument现在显示为
「格式符 '%d' 需要类型为 'int*' 的匹配参数(scanf 请检查是否漏写 & 取地址符)」 - 警告旗标规范化:
[-Wformat=]这类带等号的旗标此前未被识别,现在正确剥离并追加中文标签 - 新增约 30 条常见警告翻译规则(隐式声明、指针转换、收窄转换、括号建议、未使用标签等)
- 警告旗标中文表扩充至 40 项
设置入口
- 命令面板新增
CppAssistant: 打开设置与CppAssistant: 使用说明(README) Preferences → Package Settings → CppAssistant菜单需重启 Sublime Text 后显示