【问题标题】:Am I understanding this VS Code API behavior correctly? Non-default *object* settings (when provided) are always merged?我是否正确理解了这个 VS Code API 行为?非默认 *object* 设置(如果提供)总是合并?
【发布时间】:2019-10-26 01:43:54
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: visual-studio-code vscode-settings vscode-extensions


    【解决方案1】:

    自发布此问题以来,文档可能已更新。现在的写法,对我来说似乎很清楚。我之所以写,是因为我觉得我在 API 中发现了一个差异,这可能会对 OP 有所帮助。

    参考

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

    -- VS Code API - WorkspaceConfiguration


    其他信息

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-16
      • 2012-07-01
      • 2021-11-18
      • 2016-05-03
      • 1970-01-01
      • 2021-12-24
      相关资源
      最近更新 更多