peek definition 无反应需检查三方面:语言服务器是否启动、文件是否被语言服务支持、符号本身是否可跳转;默认显示类型定义而非实现,应改用 peek implementation 查看源码。

Peek Definition 为什么没反应?检查这三件事
VSCode 的 Peek Definition(Alt+F12 / Option+F12)不是总能触发,常见原因不是插件问题,而是语言支持没到位或符号未被正确索引。
-
语言服务器没启动:比如用 Python 但没装
Python官方扩展,或已安装但python.defaultInterpreterPath指向了错误环境——Peek会静默失败,不报错也不弹窗 -
文件没被纳入语言服务范围:打开的是纯文本文件(
Untitled-1)或后缀名不被识别(如.inc文件没关联到 PHP),VSCode 根本不会尝试解析定义 -
符号本身不可“Peek”:比如
console.log是内置 API,没有源码可预览;又或者变量是eval动态生成的,语言服务器无法静态推导
怎么让 Peek 显示真正的函数源码,而不是声明或类型定义?
默认情况下,Peek Definition 可能只跳到 index.d.ts 或 declare 行——这不是 bug,是 TypeScript/JS 语言服务优先返回类型定义的行为。要看到实际实现,得靠“实现”而非“定义”。
- 用
Peek Implementation(Shift+Alt+F12 / Shift+Option+F12)代替:它专为找函数体设计,对 TypeScript 类方法、JS 模块导出函数更可靠 - 确保项目有有效的
jsconfig.json或tsconfig.json,且"allowSyntheticDefaultImports": true和"moduleResolution": "node"已启用,否则路径解析容易断在node_modules外部 - 对第三方库,如果只装了
@types/xxx而没源码(比如没node_modules/xxx/src),Peek Implementation也会 fallback 到类型声明——这时只能接受“看不到源码”这个事实
Peek 窗口太小、遮不住代码、关不掉?调这些设置
VSCode 的 Peek 弹窗默认尺寸固定、不记忆位置、按 Esc 不一定关闭——这是高频干扰点,靠配置能缓解。
- 增大预览高度:
"editor.peekWidgetDefaultHeight": 400(单位像素,加到settings.json) - 禁用自动聚焦:
"editor.quickSuggestions": false配合"editor.suggestOnTriggerCharacters": false,避免 Peek 弹出时焦点乱跳 - 关闭 Peek 的快捷键冲突:某些键盘映射(比如 macOS 的 Spotlight)会劫持
Esc,导致 Peek 关不掉;可在keybindings.json中显式绑定editor.action.hideSuggestWidget到Esc - 注意:Peek 窗口不能拖拽缩放,也不能固定在侧边栏——这是 VSCode 当前限制,别浪费时间找隐藏开关
为什么有些函数 Peek 出来是空的,或者只显示 any?
空 Peek 或泛型占位符(如 function foo(): any)本质是语言服务没拿到足够信息,不是编辑器问题。
- JS 项目没开
checkJs: true:在jsconfig.json里加上"compilerOptions": { "checkJs": true },否则 JSDoc 注释里的@returns、@param不会被解析 - TS 项目用了
export default function但没写declare module声明,node_modules里的本地包可能被当黑盒处理 - 路径别名(
paths)没同步到jsconfig.json的compilerOptions.baseUrl和paths,导致导入链断裂,Peek 失效 - 最常被忽略的一点:Peek 不支持跨工作区根目录跳转。如果你用多根工作区(workspace folder),但定义在另一个 folder 里,且没正确设置
"typeAcquisition": { "include": ["*"] },Peek 就会“看不见”
复杂项目里,Peek 的可靠性高度依赖语言服务的索引完整性。一旦发现大面积失效,先看右下角状态栏有没有黄色警告图标,再查 Output 面板里 Typescript 或 JavaScript 的日志——那里往往写着“Failed to load…”或“Skipped file…”。











