sublime text符号索引基于正则匹配而非ast解析,无法识别父类名、装饰器、动态构造等;ctrl+r仅提取class/def行首标识符,不解析括号内内容,故不能反映真实继承关系。

Sublime Text的符号索引不是AST解析,而是正则驱动的轻量扫描
它根本不会读取Python的ast.parse()结果,也不理解class Child(Parent)里的Parent是父类——只靠正则匹配class和def开头的行,提取行首标识符作为“符号”。这意味着:
- 所有括号内的内容(如父类名、泛型参数、装饰器目标)全部被忽略
-
@property、@cached_property修饰的方法不会出现在Ctrl+R列表里 -
type("DynamicClass", (Base,), {...})这类动态构造,完全不可见 - 如果某行写成
def helper(但没闭合括号,正则可能截断或跳过整行
为什么Ctrl+P @xxx有时搜不到刚写的函数
不是快捷键失效,而是索引触发条件没满足。Sublime只在两个时机更新符号缓存:
- 文件保存时(
Ctrl+S),未保存的修改不进索引 - 语法识别正确时:右下角必须显示
source.python,不能是Plain Text - 项目已通过
Project → Add Folder to Project加载,且路径未被"file_exclude_patterns"过滤 - 首次使用
Ctrl+P @会触发后台构建,状态栏显示Indexing…期间输入无效
Ctrl+R和Ctrl+Shift+R的本质区别在哪
Ctrl+R是单文件内正则提取,Ctrl+Shift+R是项目级符号聚合——但它仍是基于同一套正则索引,只是把所有已索引文件的符号合并展示。
-
Ctrl+R:只扫当前文件,快但视野窄;对.html文件,连class="btn"里的btn都抓不到(因非符号作用域) -
Ctrl+Shift+R:依赖全局索引就绪,若某文件夹被排除、或语法识别失败,该文件的符号就彻底消失 - 两者都不支持
from utils import helper后的跳转——因为import语句本身不产生新符号,只是绑定引用
真正需要跨文件继承分析时,别硬扛原生索引
想理清class APIHandler(BaseHandler, AuthMixin)到底继承了哪些方法、哪些被重写、哪些来自AuthMixin的__init__,原生索引完全无解。
- 它不解析父类定义位置,更不递归展开
BaseHandler的父类链 - 没有调用图、没有继承边、没有组合关系,只有扁平的名称列表
- 临时补救只能靠
Ctrl+Shift+F搜class\s+\w+\s*\(\s*[\w.]+\s*\),再手动拼接链条 - 长期方案必须换工具:
GitNexus(本地AST)、Understand Anything(Claude Code插件)、或Fitten Code逐类解释
索引机制本身没问题,问题在于把它当成了静态分析器用——而它只是个带点结构感的高级文本搜索器。











