跳到主要内容

读取配置时资源参数什么时候必须传?

结论​

配置的 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 里读一次存进变量,之后文件切换了也不更新,等于没传对作用域。