VSCode不支持直接按语言ID关预览,需用workbench.editorAssociations按文件后缀+viewType组合控制:设"enablePreview": false可强制常驻,如{ "viewType": "default", "filenamePattern": "*.ts", "enablePreview": false }。

怎么用 workbench.editorAssociations 按语言关预览
VSCode 不支持直接按语言 ID(如 python 或 typescript)开关预览,但能通过文件后缀 + 编辑器类型组合控制——核心是 workbench.editorAssociations 数组,它允许你为特定 filenamePattern 指定是否启用预览。
这个配置优先级高于全局 workbench.editor.enablePreview:即使全局设为 true,你仍可让 *.ts 强制常驻;反之,若全局已关,这里写 "enablePreview": true 也无效(不生效)。
-
viewType: "default"表示使用内置文本编辑器(绝大多数情况都用这个) -
filenamePattern支持*和**,比如"*.py"、"src/**/*.test.js" - 规则按数组顺序匹配,靠前的先命中,所以更具体的模式(如
"foo.spec.ts")应放在通用模式(如"*.ts")前面
示例(禁用所有 .ts 和 .tsx 文件的预览):
"workbench.editorAssociations": [
{
"viewType": "default",
"filenamePattern": "*.ts",
"enablePreview": false
},
{
"viewType": "default",
"filenamePattern": "*.tsx",
"enablePreview": false
}
]
workbench.editor.enablePreviewFromCodeNavigation 不是按语言控制的
别被名字误导:workbench.editor.enablePreviewFromCodeNavigation 控制的是「跳转定义/引用」行为(Ctrl+Click、F12、Shift+F12),和当前文件的语言无关——它对所有语言统一生效。如果你只想让 Python 跳转不预览、而 JS 保持预览,这个配置做不到。
真要实现语言级跳转行为差异,得看对应语言服务器是否提供独立配置。例如:
- Pylance(Python)无公开 API 控制跳转预览行为
- Volar(Vue)可通过
volar.preview.enable关闭组件内跳转预览(非标准路径,需查其最新文档) - Rust Analyzer 目前不暴露该粒度开关
换句话说:VSCode 本身没给语言扩展留“跳转是否预览”的插槽,多数扩展直接调用 vscode.window.showTextDocument() 并传 { preview: false },你无法在用户设置里干预。
为什么 files.associations 对预览无效
files.associations 只决定“用哪个编辑器打开文件”,比如把 .log 当作 plaintext,或把 .yml 绑定到 yaml 语法高亮。它完全不参与预览逻辑判断。
常见错误操作:
- 把
"*.ts": "typescript"改成"*.ts": "default"—— 无意义,default不是合法 language ID - 以为加了
"*.md": "markdown"就能控制 Markdown 预览页行为 —— 实际上markdown.preview是另一套视图系统,和标签页预览无关
真正影响 Markdown 预览页的是 markdown.preview.enable(控制右键 → “Open Preview” 是否可用),和编辑器标签栏的斜体预览是两回事。
容易被忽略的边界情况
即使你配好了 workbench.editorAssociations,以下场景仍可能触发预览,且无法通过该配置拦截:
- Alt+Click(Windows/Linux)或 Option+Click(macOS)在资源管理器中点击文件:这是 editorGroup 的底层策略,硬编码,无视所有配置
- 拖拽文件到另一个 editor group(split view):同样走 editorGroup 分发逻辑,不是预览 API
- GitLens blame 行点击、Todo Tree 任务跳转:这些扩展内部调用
vscode.window.showTextDocument(..., { preview: true }),必须去对应扩展设置里找enablePreview类选项(如 GitLens 有gitlens.codeLens.enablePreview)
最稳妥的做法是:先全局关掉 workbench.editor.enablePreview,再用 workbench.editorAssociations 做例外放行(比如保留 *.md 预览),而不是反过来——因为后者无法覆盖前者未覆盖的路径。











