Skip to content

Releases: chenmoulaile/Sublime-CppAssistant

1.7.0 — 文案英文化 + 设置走 API + hover/签名/补全全异步

Choose a tag to compare

@chenmoulaile chenmoulaile released this 17 Oct 03:06

1.7.0

面向用户的文案改为英文

  • settings 注释、Preferences 菜单、命令面板、补全类型标签、状态栏、诊断面板、引擎诊断弹窗、控制台日志全部英文
  • display_language 默认改为 en;zh / both 仍可要中文诊断翻译与中文补全说明
  • 内置数据库补齐英文说明:255 条通用 + 64 条按容器区分,覆盖率检查为 0 缺漏、0 悬空 key
  • 诊断与补全注释同时携带中英两种文本,语言在渲染时选定,切换语言不再作废编译器结果

设置读写改用 Sublime 的设置 API

  • 四个 ca_set_* 命令不再整体 decode/encode User/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 包菜单兼容

Choose a tag to compare

@chenmoulaile chenmoulaile released this 27 Sep 01:46

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 式代码审查)

Choose a tag to compare

@chenmoulaile chenmoulaile released this 26 Sep 13:31

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 补全整体失效(常量兼容)

Choose a tag to compare

@chenmoulaile chenmoulaile released this 26 Sep 12:00

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 引擎未真正接管补全(关键修复)

Choose a tag to compare

@chenmoulaile chenmoulaile released this 26 Sep 11:46

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(智能头文件插入 / 悬停文档 / 签名提示)

Choose a tag to compare

@chenmoulaile chenmoulaile released this 26 Sep 10:27

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)

Choose a tag to compare

@chenmoulaile chenmoulaile released this 26 Sep 09:11

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 - 完全汉化 + 诊断语言切换

Choose a tag to compare

@chenmoulaile chenmoulaile released this 03 Sep 12:59

完全汉化 + 诊断语言切换 + 跳转定义系统头文件 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)
  • 警告旗标:39 → 278 条(+239 条新增)

切换方式

  1. 命令面板 Ctrl+Shift+P → 搜索 CppAssistant: 切换诊断语言为 中文/英文/中英双语
  2. 菜单 Preferences → Package Settings → CppAssistant → 诊断显示语言 (display_language)
  3. 手动编辑 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"]),还可以直接打开真实的系统头文件。

跳转候选多源合并(按优先级)

  1. 当前文件 中的定义(最高优先)
  2. 已打开文件 中的定义
  3. 本地头文件(递归 #include "...")
  4. 系统头文件实际路径(可打开)
  5. 标准库符号提示

🎯 重点 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

Choose a tag to compare

@chenmoulaile chenmoulaile released this 29 Aug 15:40

修复 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

Choose a tag to compare

@chenmoulaile chenmoulaile released this 26 Aug 13:17

修复

  • printf/scanf 格式化警告全部翻译为中文(用户反馈):
    format '%d' expects a matching 'int*' argument 现在显示为
    「格式符 '%d' 需要类型为 'int*' 的匹配参数(scanf 请检查是否漏写 & 取地址符)」
  • 警告旗标规范化:[-Wformat=] 这类带等号的旗标此前未被识别,现在正确剥离并追加中文标签
  • 新增约 30 条常见警告翻译规则(隐式声明、指针转换、收窄转换、括号建议、未使用标签等)
  • 警告旗标中文表扩充至 40 项

设置入口

  • 命令面板新增 CppAssistant: 打开设置 与 CppAssistant: 使用说明(README)
  • Preferences → Package Settings → CppAssistant 菜单需重启 Sublime Text 后显示