Sublime 中函数列表靠 Ctrl+R(文件级)和 Ctrl+Shift+R(项目级)实现,非常驻面板;不显示函数主因是语法未识别(右下角为 Plain Text)、文件未保存、语言包正则规则未覆盖(如 JS 对象方法、Python 嵌套装饰器)或 ctags 配置错误(路径、参数、--python-kinds=+i 缺失)。

Sublime 里能直接看到函数列表,但不是靠“面板常驻”或“自动解析 AST”,而是靠两种机制协同:一种是文件级轻量索引(Ctrl+R),另一种是项目级静态索引(Ctrl+Shift+R 或 CTags)。不装插件也能用,但容易卡在“按了没反应”“只显示变量不显示函数”“跳转到错行”上——问题几乎全出在语法识别和符号捕获规则上。
Ctrl+R 为什么有时不显示函数?
这个快捷键调用的是 Sublime 内置的符号提取器,它不分析语法树,只靠语言包里的正则规则“猜”哪些行是函数。一旦规则没覆盖,函数就消失。
- 右下角状态栏显示
Plain Text或Unsupported syntax→ 语法未识别,Ctrl+R直接失效;手动点击右下角选对语言(如Python)或把文件存为.py后缀 - JavaScript 中
const foo = () => {}、obj = { method() {} }默认不被捕获;得用 Babel 语法插件替代原生 JS - Python 装饰器函数(如
@lru_cache)多数能识别,但多层嵌套(@a @b def f():)可能漏掉函数名 - 函数名含连字符(
get-user-data)、数字开头(2ndHandler)会被正则过滤掉,不会进列表 - 文件未保存(
Ctrl+S没按)→ 修改内容不进索引,Ctrl+R只显示旧版本符号
Ctrl+Shift+R 跳不到跨文件函数?
这个命令本质是“项目符号搜索”,但它不依赖语言服务器,而是扫描所有已知语法类型的文件(.py、.js 等),把符合 scope 规则的行提取出来建缓存。首次运行慢、后续快,但不会自动更新。
- 新增/重命名函数后,缓存不会刷新 → 手动执行
Projects → Index Files或重启 Sublime - 搜索时输入
@getUser是有效的,但@get_user和@GetUser匹配行为不同,取决于语言包是否启用驼峰模糊(Python 支持,JS 原生不支持) - 不支持正则,也不能限定文件类型;想精准搜
utils.py里的函数,得先Ctrl+P打开该文件再Ctrl+R - 大文件(>10MB)会被跳过索引,对应文件的符号不会出现在结果里
CTags 真正靠谱,但配置错一步就白忙
universal-ctags 是目前唯一能稳定生成跨语言函数索引的方案,但它不是“装完插件就自动好”,每一步都卡在路径、参数、位置上。
-
ctags命令必须在系统 PATH 里;macOS 用brew install --HEAD universal-ctags,Windows 别用老版 exuberant-ctags(不支持async def) -
tags文件必须放在项目根目录(不是 Sublime 工作区目录,也不是任意子目录),插件不会向上递归查找 - Python 项目必须加
--python-kinds=+i,否则def和class不进索引;C++ 要--c++-kinds=+p才包含函数原型 - 生成命令推荐:
ctags -R --fields=+niaz --languages=python,javascript --exclude=.git --exclude=node_modules . - 插件里不叫“Outline 面板”,调出方式仍是
Ctrl+Shift+R或右键 →Go to Symbol in Project,只是底层数据源变了
别忽略光标落点和 scope 细节
哪怕列表里函数都出来了,跳转后光标停在 async 上而不是 def 后,说明语言包的 symbol pattern 正则把修饰符也塞进了第一捕获组。这不是 bug,是设计如此。
- 验证当前函数名 scope:按
Ctrl+Shift+P→ 运行Tools → Developer → Show Scope Name,把光标放函数名上,看底部显示类似source.python meta.function.python才算被正确识别 - 临时测试语法是否生效:右键 →
View → Syntax → Open all with current extension as…,选 Python 强制解析,看Ctrl+R是否恢复 - 动态定义(
lambda、exec()生成的函数、装饰器返回的闭包)天然无法被 ctags 解析,这类符号永远不在列表里

















