Overview Version History Q & A Rating & Review
CIndex
免编译的 C/C++ 全局代码索引 —— 跳转定义、调用关系、符号浏览与同名高亮。
为什么用 CIndex
零依赖与开箱即用 —— 无须预先构建工程,基于纯静态分析引擎,可完整索引头文件、未参与构建的代码段及跨平台条件编译分支。
极佳的内存控制与海量代码承载能力 —— 针对超大型工程深度优化。
高性能与毫秒级响应
首次全量索引:分钟级完成;
单文件增量更新:亚秒级响应;
代码跳转延迟:约 7 ms ;
编辑器冷启动恢复:仅需 1.9 s 。
智能无感后台调度 —— 精细化资源隔离,保障开发过程流畅。支持 线程数上限限制 、跨进程 CPU 预算管控 、进程优先级下沉 、过载自动限速 四重可配置策略,确保后台索引不占用核心开发资源。
性能实测
真实工程、单机 8 线程实测。工作量:A = 28,153 个 C/C++ 文件 / 988,668 个符号 / 1,375,921 条调用边;B = 21,925 个文件 / 820,789 个符号 / 1,007,253 条调用边。
指标
实测
首次全量建索引(A)
64 ~ 99 秒
无改动重新同步(A)
0.57 秒
改动 1 个文件后同步(A)
0.62 秒
跳转定义响应(A)
约 7 ms (含读取源码与文件内解析的完整往返)
重启恢复快照(B)
1.9 秒
索引快照体积(B)
337 MB
索引后常驻内存(B)
315 MB (≈ 0.45 KB / 符号 )
增量同步只重新解析变更过的文件 ,其余靠时间戳比对 —— 「改一个文件」与「什么都不改」都是亚秒级,成本主要在遍历目录而不是解析。
病态文件不会拖住整轮同步 :单个文件解析超过 3 秒即放弃,超过 12 秒的墙钟死线强制跳过。工程 A 实测有 11 个超大生成头文件 被跳过,整轮同步照常完成,被跳过的文件会记进运行日志。
功能
跳转定义
Ctrl/Cmd + 左键 或 F12,直接落到真实定义处。
函数落到实现,类型落到定义所在的头文件 —— 只有声明的地方会继续找定义。
覆盖函数、方法、结构体 / 类 / 联合 / 枚举标签、typedef、using 别名、宏、命名空间成员、类成员、文件级变量;头文件里同样能跳转 。
同一份头文件在工程里有多个副本时优先跳到「正本」;常见名字在多个作用域重复时按作用域与引用上下文消歧;候选按位置去重,同一个定义不会弹好几个候选框。
认继承链 —— 点派生类里没有声明 的成员(继承来的方法 / 字段)会沿继承链向上落到基类的定义;静态类型上只有纯虚声明(没有函数体)时,沿链向下落到实际的重写实现。多继承、隔代重写、跨文件派生都认。
拿不准时不装作确定 —— 同名类分布在不同命名空间、或条件编译的两个分支同时被索引时,几个可能的基类会一起作为候选给出,而不是替你猜一个。
调用关系(只做入向)
右键符号 →「CIndex: 显示调用者」,或调用关系视图,沿调用者一路向上展开;树节点单击即跳到对应代码行。
只做入向(谁调用我)。读代码要回答的是「这个函数被谁用到、改动会波及哪条链路」;出向(我调用了谁)顺着函数体往下看就有,再开一棵树只是重复信息。
当前文件(符号浏览)
活动栏 CIndex 视图的「当前文件」页,两级分组:
文件内符号 (默认展开)—— 当前文件里的全部符号按源码行序平铺。每项左侧一个字母徽章标明类别:T 类型 / F 函数 / M 宏 / V 变量。单击跳转。
同目录文件 (默认折叠,首次展开才查询)—— 当前文件所在目录下其它已索引 的文件,按文件名升序,单击即打开。
切文件、保存后自动刷新。列表按索引范围 给出而不是按磁盘列 —— 被 cindex.skipDirs 排除的文件不会出现在列表里,不会出现「列表里有、点进去跳不动」。
符号高亮
光标停在符号上按 F8,当前文件里所有同名位置一起高亮,再按一次取消 ;Shift + F8 强制取消。
注释与字符串里的同名文字不会被点亮 —— 高亮按语法结构匹配,不是文本查找。
不依赖索引 :还没同步、或者文件从未保存过(有未保存的改动)都能正常工作,用的是编辑器缓冲区里的当前内容。
深浅两套配色跟随编辑器主题自动切换;高亮位置同时标在滚动条上,长文件里一眼能看出别处还有哪几处。
其它
语义着色 —— 同步完成后,宏 / 类型 / 枚举成员 按索引结果分色(可用 cindex.semanticHighlight 关闭)。只对索引认识的名字生效,认不出的保持主题默认色。
索引范围由你决定 —— 索引的是已添加的文件夹 ;默认只跳过隐藏目录 ,其余一律进入索引,要排除第三方库 / 生成代码用 cindex.skipDirs、要强行纳入隐藏目录用 cindex.keepDirs(优先级 keep > skip > 默认)。可写目录名(匹配任意层级),也可写相对索引根的路径后缀(带 / 时按路径匹配)。
编辑器外的改动自动跟进 —— 保存文件即时增量索引;切分支(git checkout / git pull)、代码生成脚本、删除、重命名等发生在编辑器之外的变化,由文件系统监听合并后自动增量同步,一轮外部操作只会触发一次同步。只监听已添加的索引文件夹 :文件夹在工作区内时覆盖其全部子目录,工作区外的文件夹受编辑器限制只能收到其直接子级的变化。索引尚未建立时不会触发 —— 首次索引仍然由你手动发起。可用 cindex.autoSyncExternal 关掉。
同步全程有进度,随时可停 —— 状态栏持续显示已扫描规模与已耗时;长时间没有新进展会提示,并点名最常见的那个原因(索引文件夹在网络盘 / 共享盘上)。任意时刻点击状态栏即可取消,索引回到上一次完成的状态。
持久化,重启免重建 —— 同步完成后索引自动快照到工作区下的 .cindex/,重开编辑器直接恢复;升级若改变索引格式,日志里会明确提示重新同步一次。
后台索引时的机器保护 —— cindex.cpuBudget(整机所有索引进程共享的 CPU 预算,按并发进程数自动分片)、cindex.maxThreads(单引擎线程上限,默认按物理核数)、cindex.nice(优先级下沉,默认 10,I/O 走 idle)、cindex.throttle(宿主机过载时动态压 CPU 占用率)。
快速上手
打开 C/C++ 工程文件夹(文件 → 打开文件夹)。
点状态栏的 CIndex 按钮,或命令面板执行「CIndex: 同步代码索引」。首次是全量,进度显示在状态栏。
Ctrl/Cmd + 点击 或 F12 跳转定义;右键符号 →「CIndex: 显示调用者」看调用链。
光标停在符号上按 F8 高亮同名位置。
之后正常写代码 —— 保存文件会自动增量索引;切分支、脚本生成代码、删除或重命名文件这类发生在编辑器之外的改动也会自动跟进,都不用手动同步。
工程大、首次同步慢的话,先用 cindex.skipDirs 排除掉第三方库和生成代码目录,索引量与耗时都会明显下降。
命令
命令
说明
CIndex: 同步代码索引
同步已添加的文件夹(默认增量)
CIndex: 取消同步
中断正在进行的同步
CIndex: 重建索引
清空后全量重建
CIndex: 添加索引文件夹 / 移除索引文件夹
维护索引范围
CIndex: 清空索引和缓存
内存与磁盘快照一起清掉
CIndex: 显示索引状态
文件数 / 符号数 / 调用边数 / 内存占用
CIndex: 显示调用者
光标处符号的调用关系
CIndex: 刷新符号与同目录列表
手动刷新「当前文件」视图
CIndex: 高亮光标处符号 / 取消符号高亮
高亮与取消(F8 / Shift+F8)
CIndex: 显示运行日志
打开「输出」面板的 CIndex 通道
快捷键
键位
命令
生效范围
F8
高亮光标处符号(再按一次取消)
C/C++ 编辑器
Shift + F8
取消符号高亮
C/C++ 编辑器
编辑器默认把 F8 用作「转到下一个问题 / 错误」。本插件只在 C/C++ 编辑器里使用它;把设置 cindex.highlightKeybinding 关掉 即可把 F8 还给编辑器,命令仍可从命令面板或右键菜单调用。换键位不必关掉它 —— 在「快捷键」里搜 CIndex 直接改,或在 keybindings.json 里为 cindex.highlightSymbol / cindex.clearHighlight 另绑,用户键位永远优先。
设置
设置项
默认
说明
cindex.semanticHighlight
true
宏 / 类型 / 枚举成员的语义着色
cindex.highlightKeybinding
true
是否占用 F8 / Shift+F8 作为符号高亮快捷键
cindex.autoSyncExternal
true
编辑器外的文件改动(切分支 / 代码生成 / 删除 / 重命名)自动增量同步
cindex.skipDirs
[]
追加跳过的目录(目录名,或相对索引根的路径后缀)
cindex.keepDirs
[]
强制纳入的目录,优先级高于 skipDirs 与隐藏目录规则
cindex.maxThreads
0
单引擎线程上限,0 = 按物理核数自动
cindex.cpuBudget
0
整机所有索引进程共享的 CPU 预算(物理核),0 = 等于物理核数
cindex.nice
10
索引进程优先级下沉量,0 关闭
cindex.throttle
true
宿主机过载时动态限制索引进程 CPU 占用
cindex.logLevel
minimal
运行日志详略:minimal / verbose
cindex.enginePath
""
指定引擎可执行文件路径,留空用内置引擎
许可
MIT License