我是否正确理解了这个 VS Code API 行为?非默认 *object* 设置(如果提供)总是合并?

Am I understanding this VS Code API behavior correctly? Non-default *object* settings (when provided) are always merged?

我正在开发一个 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

// In the "main" method that runs when a command is activated:

const config = vscode.workspace.getConfiguration("toggleSettingsChanges");
const settingsToToggle = config.get("settingsToToggle");
const inspectedSettingsToToggle = config.inspect("settingsToToggle");

console.log("settingsToToggle:", JSON.stringify(settingsToToggle), "\n\n")
console.log("inspected settingsToToggle:", JSON.stringify(inspectedSettingsToToggle), "\n\n")
return;

在扩展主机实例中,我可以微调和调整设置,包括:

用户或工作区设置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}} 

对于 settingsToToggle 行,我 预期 只能看到以下设置:

{"editor.fontSize":11,"pumpkins_are_great":true}

似乎如果您提供对象默认值,则提供的任何配置都会与该对象合并,而不是完全替换它。

是这样吗?我在文档中错过了吗?

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

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

参考

Note: Only object value types are merged and all other value types are overridden.

-- VS Code API - WorkspaceConfiguration


附加信息

我希望我的默认值与用户设置合并,如上所述。看到我的默认设置被覆盖,我感到很困惑。这个问题帮助我了解正在发生的事情。我将分享我的方法,因为 OP 可能会感兴趣。我的观察:

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

  • 使用 WorkspaceConfiguration.get(section, defaultValue) 以编程方式传递的默认值不会 表现出合并行为。目前尚不清楚这是有意还是无意。更新:此行为按预期工作,参考 #105598.