读取配置时资源参数什么时候必须传?
结论
配置的 scope 是 resource 或 language-overridable,并且窗口里可能有多个文件夹或多种语言时,getConfiguration 必须传入当前文档或资源的 URI。不传拿到的可能是另一个根或窗口级的值。
展开
const config = vscode.workspace.getConfiguration("myext", document.uri);
const enabled = config.get<boolean>("enable");
第二个参数是作用域,不是「配置文件路径」。宿主用这个 URI 判断:
- 属于哪个工作区文件夹
- 这份资源的语言是什么
从而把文件夹设置和语言覆盖叠到默认值、用户设置之上。
必须传的情况:
- 多根工作区,每个根的开关不同
- 按语言覆盖的格式化、诊断级别
- 命令是从某个文件的右键进来的,结果要跟这个文件走
可以不传的情况:
scope明确是window或machine,整窗一份- 只是读「有没有打开某个全局功能」
写入时同样要带作用域。config.update(key, value, vscode.ConfigurationTarget.WorkspaceFolder) 才能写进当前文件夹。目标和 URI 不匹配时,会写到用户设置里,看起来像「项目里的设置丢了」。
容易讲错的点
- 传了 URI 不会自动只读那一个键所在的文件夹名称。键仍然是
getConfiguration的第一个 section 加上get的名字。 document.languageId自己判断一遍,替代不了语言可覆盖配置的解析。宿主已经做了层级合并。- 在
activate里读一次存进变量,之后文件切换了也不更新,等于没传对作用域。