ctrl+t/cmd+t默认搜索全类型符号,需加@前缀(如@foo)才能精准过滤函数;@function可限定仅函数,而ctrl+shift+o更适合单文件内快速定位函数定义。

Ctrl+T 搜函数定义必须加 @ 前缀
直接输函数名进 Ctrl+T(Windows/Linux)或 Cmd+T(macOS),默认会混入类、变量、接口等所有符号。想只看函数,得强制限定类型:@foo 才能过滤出 function 和 method;@foo@utils 还能进一步限定在 utils 模块下。
常见误区是以为输入 foo 就够了——结果列表里夹着 class Foo、const foo = {},甚至 FooService。这不是搜索不准,是没触发类型过滤机制。
-
@后不空格,直接跟函数名,比如@calculate,不是@ calculate - 大小写不敏感,但全词匹配:输
@calcsco也能命中calculate_score - 不支持正则,也不能用通配符 *,
@get*无效
Ctrl+Shift+O 在当前文件里筛函数更稳
Ctrl+Shift+O(或 Cmd+Shift+O)是查单个文件内函数定义的首选,响应快、不依赖项目级索引,而且原生支持前缀过滤:@function 能直接收起所有非函数项,只留 def、function、export const fn = 这类声明。
它比 Ctrl+F 可靠得多:不会把字符串里的 "handleClick" 或注释里的 # called by main() 当成函数;也不会因文件太大而卡顿——哪怕 5000 行的 Python 文件,符号列表也是毫秒级弹出。
- 若列表为空,先点右下角语言模式,确认是
Python或TypeScript,不是Plain Text -
obj.handleClick = () => {}这种动态挂载不会出现在Ctrl+Shift+O列表里,语言服务器静态分析时直接跳过 - 支持模糊输入:输
rend就列render、renderItem,但不会带出renderer(除非你开了 fuzzy match)
文本搜索兜底时怎么排除非定义行
当语言服务器没启动、或函数是动态生成的(比如 lambda、globals()["foo"] =),Ctrl+T 和 Ctrl+Shift+O 都会失效。这时只能回到 Ctrl+Shift+F 文本搜索,但必须手动过滤干扰项:
- 在“文件中包括”填
*.py或*.ts,避免搜进node_modules或venv - 勾选
Match Whole Word,防止log匹配到logging - Python 项目可加前缀
def(注意空格),搜def my_func;TS/JS 可搜function myFunc或const myFunc = - 别信“正则”开关——
^def在 VSCode 全局搜索里实际不可靠,尤其跨行或缩进不一致时
为什么 Pylance/TS 服务没起来,@ 过滤就无效
@ 前缀不是 UI 层面的筛选逻辑,它依赖语言服务器返回的符号类型字段。如果状态栏右下角显示 Plain Text,或者 Python 项目里 python.languageServer 没设为 Pylance,那 Ctrl+T 实际退化为模糊文本匹配——此时输 @foo 和输 foo 效果一样,都是满屏噪音。
检查三件事就能快速定位是不是服务问题:
- 打开命令面板(
Ctrl+Shift+P),运行Developer: Toggle Developer Tools,看 Console 有没有Pylance或typescript-language-server报错 - Python 项目确认有
pyproject.toml或setup.py,且已选对解释器(右下角点击选择) - TS/JS 项目至少要有空的
tsconfig.json,内容可以只是{"compilerOptions": {"allowJs": true}}
真正难处理的是那些语言服务器「故意不索引」的情况:比如函数写在 if (false) { function foo() {} } 里,或用 eval 动态生成——这时候再怎么调 @ 前缀也没用,得换思路,比如改用文本搜索加行首锚定。











