diff --git a/extensions/configuration-editing/src/settingsDocumentHelper.ts b/extensions/configuration-editing/src/settingsDocumentHelper.ts index dfd6100023f..5e466c2eb6f 100644 --- a/extensions/configuration-editing/src/settingsDocumentHelper.ts +++ b/extensions/configuration-editing/src/settingsDocumentHelper.ts @@ -42,11 +42,11 @@ export class SettingsDocument { }); } - // sync.ignoredExtensions - if (location.path[0] === 'sync.ignoredExtensions') { + // settingsSync.ignoredExtensions + if (location.path[0] === 'settingsSync.ignoredExtensions') { let ignoredExtensions = []; try { - ignoredExtensions = parse(this.document.getText())['sync.ignoredExtensions']; + ignoredExtensions = parse(this.document.getText())['settingsSync.ignoredExtensions']; } catch (e) {/* ignore error */ } return provideInstalledExtensionProposals(ignoredExtensions, range, true); } diff --git a/src/vs/platform/userDataSync/common/extensionsMerge.ts b/src/vs/platform/userDataSync/common/extensionsMerge.ts index 381047368e0..1540037a7b9 100644 --- a/src/vs/platform/userDataSync/common/extensionsMerge.ts +++ b/src/vs/platform/userDataSync/common/extensionsMerge.ts @@ -205,7 +205,7 @@ function massageOutgoingExtension(extension: ISyncExtension, key: string): ISync export function getIgnoredExtensions(installed: ILocalExtension[], configurationService: IConfigurationService): string[] { const defaultIgnoredExtensions = installed.filter(i => i.isMachineScoped).map(i => i.identifier.id.toLowerCase()); - const value = (configurationService.getValue('sync.ignoredExtensions') || []).map(id => id.toLowerCase()); + const value = getConfiguredIgnoredExtensions(configurationService).map(id => id.toLowerCase()); const added: string[] = [], removed: string[] = []; if (Array.isArray(value)) { for (const key of value) { @@ -218,3 +218,15 @@ export function getIgnoredExtensions(installed: ILocalExtension[], configuration } return distinct([...defaultIgnoredExtensions, ...added,].filter(setting => removed.indexOf(setting) === -1)); } + +function getConfiguredIgnoredExtensions(configurationService: IConfigurationService): string[] { + let userValue = configurationService.inspect('settingsSync.ignoredExtensions').userValue; + if (userValue !== undefined) { + return userValue; + } + userValue = configurationService.inspect('sync.ignoredExtensions').userValue; + if (userValue !== undefined) { + return userValue; + } + return configurationService.getValue('settingsSync.ignoredExtensions') || []; +} diff --git a/src/vs/platform/userDataSync/common/extensionsSync.ts b/src/vs/platform/userDataSync/common/extensionsSync.ts index 31ed99aaf13..fc78ea53ff8 100644 --- a/src/vs/platform/userDataSync/common/extensionsSync.ts +++ b/src/vs/platform/userDataSync/common/extensionsSync.ts @@ -45,10 +45,14 @@ interface ILastSyncUserData extends IRemoteUserData { export class ExtensionsSynchroniser extends AbstractSynchroniser implements IUserDataSynchroniser { private static readonly EXTENSIONS_DATA_URI = URI.from({ scheme: USER_DATA_SYNC_SCHEME, authority: 'extensions', path: `/extensions.json` }); + /* Version 3 - Introduce installed property to skip installing built in extensions + protected readonly version: number = 3; */ - protected readonly version: number = 3; + /* Version 4: Change settings from `sync.${setting}` to `settingsSync.{setting}` */ + protected readonly version: number = 4; + protected isEnabled(): boolean { return super.isEnabled() && this.extensionGalleryService.isEnabled(); } private readonly previewResource: URI = joinPath(this.syncPreviewFolder, 'extensions.json'); private readonly localResource: URI = this.previewResource.with({ scheme: USER_DATA_SYNC_SCHEME, authority: 'local' }); diff --git a/src/vs/platform/userDataSync/common/keybindingsSync.ts b/src/vs/platform/userDataSync/common/keybindingsSync.ts index 4aa6c402f65..d6571311100 100644 --- a/src/vs/platform/userDataSync/common/keybindingsSync.ts +++ b/src/vs/platform/userDataSync/common/keybindingsSync.ts @@ -37,7 +37,8 @@ interface IKeybindingsResourcePreview extends IFileResourcePreview { export class KeybindingsSynchroniser extends AbstractJsonFileSynchroniser implements IUserDataSynchroniser { - protected readonly version: number = 1; + /* Version 2: Change settings from `sync.${setting}` to `settingsSync.{setting}` */ + protected readonly version: number = 2; private readonly previewResource: URI = joinPath(this.syncPreviewFolder, 'keybindings.json'); private readonly localResource: URI = this.previewResource.with({ scheme: USER_DATA_SYNC_SCHEME, authority: 'local' }); private readonly remoteResource: URI = this.previewResource.with({ scheme: USER_DATA_SYNC_SCHEME, authority: 'remote' }); @@ -262,7 +263,7 @@ export class KeybindingsSynchroniser extends AbstractJsonFileSynchroniser implem getKeybindingsContentFromSyncContent(syncContent: string): string | null { try { const parsed = JSON.parse(syncContent); - if (!this.configurationService.getValue('sync.keybindingsPerPlatform')) { + if (!this.syncKeybindingsPerPlatform()) { return isUndefined(parsed.all) ? null : parsed.all; } switch (OS) { @@ -286,7 +287,7 @@ export class KeybindingsSynchroniser extends AbstractJsonFileSynchroniser implem } catch (e) { this.logService.error(e); } - if (!this.configurationService.getValue('sync.keybindingsPerPlatform')) { + if (!this.syncKeybindingsPerPlatform()) { parsed.all = keybindingsContent; } else { delete parsed.all; @@ -305,4 +306,16 @@ export class KeybindingsSynchroniser extends AbstractJsonFileSynchroniser implem return JSON.stringify(parsed); } + private syncKeybindingsPerPlatform(): boolean { + let userValue = this.configurationService.inspect('settingsSync.keybindingsPerPlatform').userValue; + if (userValue !== undefined) { + return userValue; + } + userValue = this.configurationService.inspect('sync.keybindingsPerPlatform').userValue; + if (userValue !== undefined) { + return userValue; + } + return this.configurationService.getValue('settingsSync.keybindingsPerPlatform'); + } + } diff --git a/src/vs/platform/userDataSync/common/settingsMerge.ts b/src/vs/platform/userDataSync/common/settingsMerge.ts index d05975d3c94..ad6800c6cbb 100644 --- a/src/vs/platform/userDataSync/common/settingsMerge.ts +++ b/src/vs/platform/userDataSync/common/settingsMerge.ts @@ -23,12 +23,9 @@ export interface IMergeResult { export function getIgnoredSettings(defaultIgnoredSettings: string[], configurationService: IConfigurationService, settingsContent?: string): string[] { let value: string[] = []; if (settingsContent) { - const setting = parse(settingsContent); - if (setting) { - value = setting['sync.ignoredSettings']; - } + value = getIgnoredSettingsFromContent(settingsContent); } else { - value = configurationService.getValue('sync.ignoredSettings'); + value = getIgnoredSettingsFromConfig(configurationService); } const added: string[] = [], removed: string[] = [...getDisallowedIgnoredSettings()]; if (Array.isArray(value)) { @@ -43,6 +40,22 @@ export function getIgnoredSettings(defaultIgnoredSettings: string[], configurati return distinct([...defaultIgnoredSettings, ...added,].filter(setting => removed.indexOf(setting) === -1)); } +function getIgnoredSettingsFromConfig(configurationService: IConfigurationService): string[] { + let userValue = configurationService.inspect('settingsSync.ignoredSettings').userValue; + if (userValue !== undefined) { + return userValue; + } + userValue = configurationService.inspect('sync.ignoredSettings').userValue; + if (userValue !== undefined) { + return userValue; + } + return configurationService.getValue('settingsSync.ignoredSettings') || []; +} + +function getIgnoredSettingsFromContent(settingsContent: string): string[] { + const parsed = parse(settingsContent); + return parsed ? parsed['settingsSync.ignoredSettings'] || parsed['sync.ignoredSettings'] || [] : []; +} export function updateIgnoredSettings(targetContent: string, sourceContent: string, ignoredSettings: string[], formattingOptions: FormattingOptions): string { if (ignoredSettings.length) { diff --git a/src/vs/platform/userDataSync/common/settingsSync.ts b/src/vs/platform/userDataSync/common/settingsSync.ts index 62911b4053b..6fb6dd218a8 100644 --- a/src/vs/platform/userDataSync/common/settingsSync.ts +++ b/src/vs/platform/userDataSync/common/settingsSync.ts @@ -42,7 +42,8 @@ function isSettingsSyncContent(thing: any): thing is ISettingsSyncContent { export class SettingsSynchroniser extends AbstractJsonFileSynchroniser implements IUserDataSynchroniser { - protected readonly version: number = 1; + /* Version 2: Change settings from `sync.${setting}` to `settingsSync.{setting}` */ + protected readonly version: number = 2; readonly previewResource: URI = joinPath(this.syncPreviewFolder, 'settings.json'); readonly localResource: URI = this.previewResource.with({ scheme: USER_DATA_SYNC_SCHEME, authority: 'local' }); readonly remoteResource: URI = this.previewResource.with({ scheme: USER_DATA_SYNC_SCHEME, authority: 'remote' }); diff --git a/src/vs/platform/userDataSync/common/userDataAutoSyncService.ts b/src/vs/platform/userDataSync/common/userDataAutoSyncService.ts index 2ca29d000b0..24493352e24 100644 --- a/src/vs/platform/userDataSync/common/userDataAutoSyncService.ts +++ b/src/vs/platform/userDataSync/common/userDataAutoSyncService.ts @@ -270,13 +270,13 @@ export class UserDataAutoSyncService extends UserDataAutoSyncEnablementService i // Incompatible Local Content else if (userDataSyncError.code === UserDataSyncErrorCode.IncompatibleLocalContent) { await this.turnOff(false, true /* force soft turnoff on error */); - this.logService.info('Auto Sync: Turned off sync because server has {0} content with newer version than of client. Requires client upgrade.', userDataSyncError.resource); + this.logService.info(`Auto Sync: Turned off sync because server has ${userDataSyncError.resource} content with newer version than of client. Requires client upgrade.`); } // Incompatible Remote Content else if (userDataSyncError.code === UserDataSyncErrorCode.IncompatibleRemoteContent) { await this.turnOff(false, true /* force soft turnoff on error */); - this.logService.info('Auto Sync: Turned off sync because server has {0} content with older version than of client. Requires server reset.', userDataSyncError.resource); + this.logService.info(`Auto Sync: Turned off sync because server has ${userDataSyncError.resource} content with older version than of client. Requires server reset.`); } // Service changed diff --git a/src/vs/platform/userDataSync/common/userDataSync.ts b/src/vs/platform/userDataSync/common/userDataSync.ts index f5df978809c..9bb9199d9fa 100644 --- a/src/vs/platform/userDataSync/common/userDataSync.ts +++ b/src/vs/platform/userDataSync/common/userDataSync.ts @@ -41,21 +41,25 @@ export function registerConfiguration(): IDisposable { const ignoredExtensionsSchemaId = 'vscode://schemas/ignoredExtensions'; const configurationRegistry = Registry.as(ConfigurationExtensions.Configuration); configurationRegistry.registerConfiguration({ - id: 'sync', + id: 'settingsSync', order: 30, - title: localize('sync', "Sync"), + title: localize('settings sync', "Settings Sync"), type: 'object', properties: { - 'sync.keybindingsPerPlatform': { + 'settingsSync.keybindingsPerPlatform': { type: 'boolean', - description: localize('sync.keybindingsPerPlatform', "Synchronize keybindings for each platform."), + description: localize('settingsSync.keybindingsPerPlatform', "Synchronize keybindings for each platform."), default: true, scope: ConfigurationScope.APPLICATION, tags: ['sync', 'usesOnlineServices'] }, - 'sync.ignoredExtensions': { + 'sync.keybindingsPerPlatform': { + type: 'boolean', + deprecationMessage: localize('sync.keybindingsPerPlatform.deprecated', "Deprecated, use settingsSync.keybindingsPerPlatform instead"), + }, + 'settingsSync.ignoredExtensions': { 'type': 'array', - 'description': localize('sync.ignoredExtensions', "List of extensions to be ignored while synchronizing. The identifier of an extension is always ${publisher}.${name}. For example: vscode.csharp."), + 'description': localize('settingsSync.ignoredExtensions', "List of extensions to be ignored while synchronizing. The identifier of an extension is always ${publisher}.${name}. For example: vscode.csharp."), $ref: ignoredExtensionsSchemaId, 'default': [], 'scope': ConfigurationScope.APPLICATION, @@ -63,9 +67,13 @@ export function registerConfiguration(): IDisposable { disallowSyncIgnore: true, tags: ['sync', 'usesOnlineServices'] }, - 'sync.ignoredSettings': { + 'sync.ignoredExtensions': { 'type': 'array', - description: localize('sync.ignoredSettings', "Configure settings to be ignored while synchronizing."), + deprecationMessage: localize('sync.ignoredExtensions.deprecated', "Deprecated, use settingsSync.ignoredExtensions instead"), + }, + 'settingsSync.ignoredSettings': { + 'type': 'array', + description: localize('settingsSync.ignoredSettings', "Configure settings to be ignored while synchronizing."), 'default': [], 'scope': ConfigurationScope.APPLICATION, $ref: ignoredSettingsSchemaId, @@ -73,6 +81,10 @@ export function registerConfiguration(): IDisposable { uniqueItems: true, disallowSyncIgnore: true, tags: ['sync', 'usesOnlineServices'] + }, + 'sync.ignoredSettings': { + 'type': 'array', + deprecationMessage: localize('sync.ignoredSettings.deprecated', "Deprecated, use settingsSync.ignoredSettings instead"), } } }); diff --git a/src/vs/platform/userDataSync/test/common/settingsSync.test.ts b/src/vs/platform/userDataSync/test/common/settingsSync.test.ts index 6b1511f0bde..3121fb533f8 100644 --- a/src/vs/platform/userDataSync/test/common/settingsSync.test.ts +++ b/src/vs/platform/userDataSync/test/common/settingsSync.test.ts @@ -300,7 +300,7 @@ suite('SettingsSync - Auto', () => { "workbench.colorTheme": "GitHub Sharp", // Ignored - "sync.ignoredSettings": [ + "settingsSync.ignoredSettings": [ "editor.fontFamily", "terminal.integrated.shell.osx" ] @@ -321,7 +321,7 @@ suite('SettingsSync - Auto', () => { "workbench.colorTheme": "GitHub Sharp", // Ignored - "sync.ignoredSettings": [ + "settingsSync.ignoredSettings": [ "editor.fontFamily", "terminal.integrated.shell.osx" ] @@ -345,7 +345,7 @@ suite('SettingsSync - Auto', () => { "workbench.colorTheme": "GitHub Sharp", // Ignored - "sync.ignoredSettings": [ + "settingsSync.ignoredSettings": [ "editor.fontFamily", "terminal.integrated.shell.osx" ], @@ -369,7 +369,7 @@ suite('SettingsSync - Auto', () => { "workbench.colorTheme": "GitHub Sharp", // Ignored - "sync.ignoredSettings": [ + "settingsSync.ignoredSettings": [ "editor.fontFamily", "terminal.integrated.shell.osx" ], @@ -417,14 +417,14 @@ suite('SettingsSync - Auto', () => { await updateSettings(JSON.stringify({ 'a': 1, 'b': 2, - 'sync.ignoredSettings': ['a'] + 'settingsSync.ignoredSettings': ['a'] }), client2); await client2.sync(); await updateSettings(JSON.stringify({ 'a': 2, 'b': 1, - 'sync.ignoredSettings': ['a'] + 'settingsSync.ignoredSettings': ['a'] }), client); await testObject.sync(await client.manifest()); @@ -435,7 +435,7 @@ suite('SettingsSync - Auto', () => { const mergeContent = (await fileService.readFile(testObject.conflicts[0].previewResource)).value.toString(); assert.deepEqual(JSON.parse(mergeContent), { 'b': 1, - 'sync.ignoredSettings': ['a'] + 'settingsSync.ignoredSettings': ['a'] }); }); @@ -474,7 +474,7 @@ suite('SettingsSync - Manual', () => { "workbench.colorTheme": "GitHub Sharp", // Ignored - "sync.ignoredSettings": [ + "settingsSync.ignoredSettings": [ "editor.fontFamily", "terminal.integrated.shell.osx" ] @@ -498,7 +498,7 @@ suite('SettingsSync - Manual', () => { "workbench.colorTheme": "GitHub Sharp", // Ignored - "sync.ignoredSettings": [ + "settingsSync.ignoredSettings": [ "editor.fontFamily", "terminal.integrated.shell.osx" ] diff --git a/src/vs/workbench/contrib/extensions/browser/extensionsActions.ts b/src/vs/workbench/contrib/extensions/browser/extensionsActions.ts index 889bfcebc0d..9d449dd9ac6 100644 --- a/src/vs/workbench/contrib/extensions/browser/extensionsActions.ts +++ b/src/vs/workbench/contrib/extensions/browser/extensionsActions.ts @@ -2785,7 +2785,7 @@ export class SyncIgnoredIconAction extends ExtensionAction { @IExtensionsWorkbenchService private readonly extensionsWorkbenchService: IExtensionsWorkbenchService, ) { super('extensions.syncignore', '', SyncIgnoredIconAction.DISABLE_CLASS, false); - this._register(Event.filter(this.configurationService.onDidChangeConfiguration, e => e.affectedKeys.includes('sync.ignoredExtensions'))(() => this.update())); + this._register(Event.filter(this.configurationService.onDidChangeConfiguration, e => e.affectedKeys.includes('settingsSync.ignoredExtensions'))(() => this.update())); this.update(); this.tooltip = localize('syncingore.label', "This extension is ignored during sync."); } diff --git a/src/vs/workbench/contrib/extensions/browser/extensionsWorkbenchService.ts b/src/vs/workbench/contrib/extensions/browser/extensionsWorkbenchService.ts index fbe745b3696..996f4bb2fed 100644 --- a/src/vs/workbench/contrib/extensions/browser/extensionsWorkbenchService.ts +++ b/src/vs/workbench/contrib/extensions/browser/extensionsWorkbenchService.ts @@ -977,7 +977,7 @@ export class ExtensionsWorkbenchService extends Disposable implements IExtension const id = extension.identifier.id.toLowerCase(); // first remove the extension completely from ignored extensions - let currentValue = [...this.configurationService.getValue('sync.ignoredExtensions')].map(id => id.toLowerCase()); + let currentValue = [...this.configurationService.getValue('settingsSync.ignoredExtensions')].map(id => id.toLowerCase()); currentValue = currentValue.filter(v => v !== id && v !== `-${id}`); // If ignored, then add only if it is ignored by default @@ -990,7 +990,7 @@ export class ExtensionsWorkbenchService extends Disposable implements IExtension currentValue.push(id); } - return this.configurationService.updateValue('sync.ignoredExtensions', currentValue.length ? currentValue : undefined, ConfigurationTarget.USER); + return this.configurationService.updateValue('settingsSync.ignoredExtensions', currentValue.length ? currentValue : undefined, ConfigurationTarget.USER); } private installWithProgress(installTask: () => Promise, extensionName?: string): Promise { diff --git a/src/vs/workbench/contrib/preferences/browser/settingsLayout.ts b/src/vs/workbench/contrib/preferences/browser/settingsLayout.ts index b66d3b8ad38..ed6f43afcfa 100644 --- a/src/vs/workbench/contrib/preferences/browser/settingsLayout.ts +++ b/src/vs/workbench/contrib/preferences/browser/settingsLayout.ts @@ -217,9 +217,9 @@ export const tocData: ITOCEntry = { settings: ['telemetry.*'] }, { - id: 'application/sync', - label: localize('sync', "Sync"), - settings: ['sync.*'] + id: 'application/settingsSync', + label: localize('settingsSync', "Settings Sync"), + settings: ['settingsSync.*'] } ] } diff --git a/src/vs/workbench/contrib/preferences/browser/settingsTree.ts b/src/vs/workbench/contrib/preferences/browser/settingsTree.ts index 060d31324f6..bb5b34aac7d 100644 --- a/src/vs/workbench/contrib/preferences/browser/settingsTree.ts +++ b/src/vs/workbench/contrib/preferences/browser/settingsTree.ts @@ -499,7 +499,7 @@ export abstract class AbstractSettingRenderer extends Disposable implements ITre this.ignoredSettings = getIgnoredSettings(getDefaultIgnoredSettings(), this._configService); this._register(this._configService.onDidChangeConfiguration(e => { - if (e.affectedKeys.includes('sync.ignoredSettings')) { + if (e.affectedKeys.includes('settingsSync.ignoredSettings')) { this.ignoredSettings = getIgnoredSettings(getDefaultIgnoredSettings(), this._configService); this._onDidChangeIgnoredSettings.fire(); } @@ -2025,7 +2025,7 @@ class SyncSettingAction extends Action { @IConfigurationService private readonly configService: IConfigurationService, ) { super(SyncSettingAction.ID, SyncSettingAction.LABEL); - this._register(Event.filter(configService.onDidChangeConfiguration, e => e.affectsConfiguration('sync.ignoredSettings'))(() => this.update())); + this._register(Event.filter(configService.onDidChangeConfiguration, e => e.affectsConfiguration('settingsSync.ignoredSettings'))(() => this.update())); this.update(); } @@ -2036,7 +2036,7 @@ class SyncSettingAction extends Action { async run(): Promise { // first remove the current setting completely from ignored settings - let currentValue = [...this.configService.getValue('sync.ignoredSettings')]; + let currentValue = [...this.configService.getValue('settingsSync.ignoredSettings')]; currentValue = currentValue.filter(v => v !== this.setting.key && v !== `-${this.setting.key}`); const defaultIgnoredSettings = getDefaultIgnoredSettings(); @@ -2053,7 +2053,7 @@ class SyncSettingAction extends Action { currentValue.push(this.setting.key); } - this.configService.updateValue('sync.ignoredSettings', currentValue.length ? currentValue : undefined, ConfigurationTarget.USER); + this.configService.updateValue('settingsSync.ignoredSettings', currentValue.length ? currentValue : undefined, ConfigurationTarget.USER); return Promise.resolve(undefined); } diff --git a/src/vs/workbench/contrib/userDataSync/browser/userDataSync.contribution.ts b/src/vs/workbench/contrib/userDataSync/browser/userDataSync.contribution.ts index e786b7f98bc..9a055fc2d7a 100644 --- a/src/vs/workbench/contrib/userDataSync/browser/userDataSync.contribution.ts +++ b/src/vs/workbench/contrib/userDataSync/browser/userDataSync.contribution.ts @@ -12,6 +12,7 @@ import { INotificationService, Severity } from 'vs/platform/notification/common/ import { Disposable } from 'vs/base/common/lifecycle'; import { localize } from 'vs/nls'; import { isWeb } from 'vs/base/common/platform'; +import { IConfigurationService, ConfigurationTarget } from 'vs/platform/configuration/common/configuration'; class UserDataSyncReportIssueContribution extends Disposable implements IWorkbenchContribution { @@ -38,8 +39,34 @@ class UserDataSyncReportIssueContribution extends Disposable implements IWorkben } } +export class UserDataSyncSettingsMigrationContribution implements IWorkbenchContribution { + + constructor( + @IConfigurationService private readonly configurationService: IConfigurationService + ) { + this.migrateSettings(); + } + + private async migrateSettings(): Promise { + await this.migrateSetting('sync.keybindingsPerPlatform', 'settingsSync.keybindingsPerPlatform'); + await this.migrateSetting('sync.ignoredExtensions', 'settingsSync.ignoredExtensions'); + await this.migrateSetting('sync.ignoredSettings', 'settingsSync.ignoredSettings'); + } + + private async migrateSetting(oldSetting: string, newSetting: string): Promise { + const userValue = this.configurationService.inspect(oldSetting).userValue; + if (userValue !== undefined) { + // remove the old setting + await this.configurationService.updateValue(oldSetting, undefined, ConfigurationTarget.USER); + // add the new setting + await this.configurationService.updateValue(newSetting, userValue, ConfigurationTarget.USER); + } + } +} + const workbenchRegistry = Registry.as(WorkbenchExtensions.Workbench); workbenchRegistry.registerWorkbenchContribution(UserDataSyncWorkbenchContribution, LifecyclePhase.Ready); +workbenchRegistry.registerWorkbenchContribution(UserDataSyncSettingsMigrationContribution, LifecyclePhase.Eventually); if (isWeb) { workbenchRegistry.registerWorkbenchContribution(UserDataSyncReportIssueContribution, LifecyclePhase.Ready); diff --git a/src/vs/workbench/contrib/userDataSync/browser/userDataSync.ts b/src/vs/workbench/contrib/userDataSync/browser/userDataSync.ts index 1060ec6036a..ddb653082f3 100644 --- a/src/vs/workbench/contrib/userDataSync/browser/userDataSync.ts +++ b/src/vs/workbench/contrib/userDataSync/browser/userDataSync.ts @@ -554,7 +554,7 @@ export class UserDataSyncWorkbenchContribution extends Disposable implements IWo }, { id: SyncResource.Keybindings, label: getSyncAreaLabel(SyncResource.Keybindings), - description: this.configurationService.getValue('sync.keybindingsPerPlatform') ? localize('per platform', "for each platform") : undefined + description: this.configurationService.getValue('settingsSync.keybindingsPerPlatform') ? localize('per platform', "for each platform") : undefined }, { id: SyncResource.Snippets, label: getSyncAreaLabel(SyncResource.Snippets)