Visual studio code 我是否正确理解这种VS代码API行为?是否始终合并非默认*对象*设置(如果提供)?

Visual studio code 我是否正确理解这种VS代码API行为?是否始终合并非默认*对象*设置(如果提供)?,visual-studio-code,vscode-settings,vscode-extensions,Visual Studio Code,Vscode Settings,Vscode Extensions,我正在开发一个VS代码扩展,我想我可能在文档中遗漏了什么,或者我看到的行为没有在那里指定,我的假设是错误的 我已经为我的扩展定义了一些默认设置,如 package.json "contributes": { "configuration": { "title": "ToggleSettingsChanges", "properties": { "toggleSettingsChanges.settingsToToggle": {

我正在开发一个VS代码扩展,我想我可能在文档中遗漏了什么,或者我看到的行为没有在那里指定,我的假设是错误的

我已经为我的扩展定义了一些默认设置,如

package.json

  "contributes": {
    "configuration": {
      "title": "ToggleSettingsChanges",
      "properties": {
        "toggleSettingsChanges.settingsToToggle": {
          "scope": "resource",
          "type": "object",
          "default": {
            "window.zoomLevel": 2,
            "editor.fontSize": 22,
            "terminal.integrated.fontSize": 16,
            "scm.diffDecorations": "none",
            "workbench.statusBar.visible": false,
            "editor.cursorBlinking": "solid",
            "workbench.activityBar.visible": false
          },
          "description": "[ snip ]"
        }
      }
    }
  },
extension.js

//在激活命令时运行的“main”方法中:
const config=vscode.workspace.getConfiguration(“toggleSettingsChanges”);
const settingsToToggle=config.get(“settingsToToggle”);
const-inspectedSettingsToggle=config.inspect(“SettingsToggle”);
console.log(“settingsToToggle:”,JSON.stringify(settingsToToggle),“\n\n”)
console.log(“inspected SettingsToggle:”,JSON.stringify(inspected SettingsToggle),“\n\n”)
返回;
在扩展主机实例中,我可以调整设置,包括:

用户或工作区设置JSON

// ... 
"toggleSettingsChanges.settingsToToggle": {
  "editor.fontSize": 11,
  "pumpkins_are_great": true
},
在控制台输出中,我看到以下内容:

settingsToToggle: {"window.zoomLevel":2,"editor.fontSize":11,"terminal.integrated.fontSize":16,"scm.diffDecorations":"none","workbench.statusBar.visible":false,"editor.cursorBlinking":"solid","workbench.activityBar.visible":false,"pumpkins_are_great":true} 

inspected settingsToToggle: {"key":"toggleSettingsChanges.settingsToToggle","defaultValue":{"window.zoomLevel":2,"editor.fontSize":22,"terminal.integrated.fontSize":16,"scm.diffDecorations":"none","workbench.statusBar.visible":false,"editor.cursorBlinking":"solid","workbench.activityBar.visible":false},"globalValue":{"editor.fontSize":11,"pumpkins_are_great":true}} 
对于
设置切换
行,我希望只看到以下设置:

{"editor.fontSize":11,"pumpkins_are_great":true}
似乎如果提供对象默认值,则提供的任何配置都将与该对象合并,而不是完全替换它。 是这样吗?我是否在文档中遗漏了这一点


在我看来,一个值(甚至是一个对象)将被覆盖,而不是简单地合并

此问题发布后,文档可能已更新。现在的写法对我来说似乎很清楚。我写这篇文章是因为我觉得我在API中发现了一个差异,这可能有助于解决OP

参考文献

注意:仅合并对象值类型,而覆盖所有其他值类型

--


其他信息

  "contributes": {
    "configuration": {
      "title": "ToggleSettingsChanges",
      "properties": {
        "toggleSettingsChanges.settingsToToggle": {
          "scope": "resource",
          "type": "object",
          "default": {
            "window.zoomLevel": 2,
            "editor.fontSize": 22,
            "terminal.integrated.fontSize": 16,
            "scm.diffDecorations": "none",
            "workbench.statusBar.visible": false,
            "editor.cursorBlinking": "solid",
            "workbench.activityBar.visible": false
          },
          "description": "[ snip ]"
        }
      }
    }
  },
我希望我的默认值与用户设置合并,如上所述。看到我的默认设置被覆盖,我感到困惑。这个问题帮助我了解了正在发生的事情。我将分享我的方法,因为OP可能感兴趣。我的意见:

  • package.json
    中提供的默认值与用户设置合并,如文档中所述(上面的链接)

  • 通过
    WorkspaceConfiguration.get(section,defaultValue)
    以编程方式传递的默认值不显示合并行为。目前还不清楚这是否是有意的。更新:此行为按预期工作,请参考