vscode自定义编辑器触发仅依赖customeditors.selector的文件名匹配,与files.associations无关;后者只影响语言模式,不控制打开方式;selector支持和*通配符,不支持正则;预览需扩展自行实现webview逻辑。

VSCode自定义编辑器本身不直接提供“按文件类型设置预览规则”的开关,它只负责注册一个 viewType 并绑定到特定文件模式;真正决定“用哪个编辑器打开哪个文件”的,是 files.associations 和 customEditors 的协同作用——前者告诉 VSCode “这是什么语言”,后者告诉 VSCode “该用哪个自定义视图打开”。搞混这两层,配置就永远不生效。
自定义编辑器触发依赖 customEditors.selector 匹配
VSCode 不会因为你写了 "*.log": "json" 就自动用你的自定义编辑器打开 .log 文件。它只认 package.json 里 customEditors.selector 的规则:
-
selector中的filenamePattern是唯一触发条件,例如"*.tensor"或"config.yaml",匹配的是完整文件名,不是语言 ID - 通配符仅支持
*和**,不支持正则;"*.log"会匹配app.log,但不会匹配logs/error.log(除非写成"**/*.log") - 多个自定义编辑器可共存,但
priority: "option"的编辑器需用户右键手动选择,“default”才会自动接管
files.associations 影响的是语言模式,不是打开方式
很多人误以为把 "*.log": "json" 加进 files.associations 就能让自定义编辑器生效——其实它只做一件事:让 VSCode 把 .log 文件当成 JSON 来高亮、补全、校验。它和自定义编辑器完全无关。
- 如果你的自定义编辑器是为
.tensor设计的,但你在files.associations里写"*.tensor": "markdown",VSCode 仍会用你的自定义编辑器打开它(只要selector匹配),只是编辑器内部看到的document.languageId是markdown - 真正影响自定义编辑器行为的,是
resolveCustomTextEditor里你如何读取document.getText()或document.uri,而不是语言 ID - 常见错误:改了
files.associations却没重启 VSCode,导致新关联未加载,结果以为自定义编辑器失效
预览逻辑必须由扩展代码显式实现
VSCode 不会自动为你渲染任何可视化内容。所谓“预览”,本质是你在 Webview 里写的 HTML + JS 逻辑。比如想让 .tensor 文件显示张量形状:
if (doc.fileName.endsWith('.tensor')) {
const content = doc.getText();
const shape = parseTensorShape(content); // 你自己写的解析函数
panel.webview.html = `<div>Shape: ${shape}</div>`;
}
- 没有内置的“预览模板”或“schema 驱动渲染”,所有结构化展示都得手写
- 如果文件是二进制(如图片、模型),必须用
vscode.workspace.fs.readFile(uri)而不是document.getText() - 别依赖
editor.document.languageId做分支判断——它可能被files.associations覆盖,而你的自定义编辑器只关心文件路径和内容
最常被忽略的一点:自定义编辑器的 viewType 必须全局唯一,且一旦注册就不能被另一个扩展覆盖;如果两个扩展用了相同的 viewType,后加载的那个会静默失败——连错误日志都不打。调试时务必先确认 viewType 是否已被占用。











