diff --git a/src/vs/workbench/electron-browser/crashReporter.ts b/src/vs/workbench/electron-browser/crashReporter.ts index ccc2be403cf4058484f7a8e5fa7d937e49f2a401..302f8671bdcfe50c5807304bf59058ff5361b762 100644 --- a/src/vs/workbench/electron-browser/crashReporter.ts +++ b/src/vs/workbench/electron-browser/crashReporter.ts @@ -31,7 +31,7 @@ configurationRegistry.registerConfiguration({ 'properties': { 'telemetry.enableCrashReporter': { 'type': 'boolean', - 'description': nls.localize('telemetry.enableCrashReporting', "Enable crash reports to be sent to Microsoft.\n\t// This option requires restart to take effect."), + 'description': nls.localize('telemetry.enableCrashReporting', "Enable crash reports to be sent to Microsoft.\nThis option requires restart to take effect."), 'default': true } } diff --git a/src/vs/workbench/parts/settings/browser/defaultSettingsEditors.ts b/src/vs/workbench/parts/settings/browser/defaultSettingsEditors.ts index 5847191af05aa57a2bb0f2d504abd3cdebea2aef..485d01fe3532611e667465089f3fcebe1722f363 100644 --- a/src/vs/workbench/parts/settings/browser/defaultSettingsEditors.ts +++ b/src/vs/workbench/parts/settings/browser/defaultSettingsEditors.ts @@ -187,9 +187,8 @@ export class DefaultSettingsContribution extends Disposable implements editorCom private renderDecorations(model: editorCommon.IModel) { this.settingsActions = this.instantiationService.createInstance(SettingsActionsDecorators, this.editor); - this.settingsActions.render(this.openSettingsService.defaultSettings.getSettingsGroups()); + this.settingsActions.render(this.openSettingsService.defaultSettings.settingsGroups); } - } export class SettingsActionsDecorators extends Disposable { @@ -228,11 +227,11 @@ export class SettingsActionsDecorators extends Disposable { private createDecoration(setting: ISetting, model: editorCommon.IModel): editorCommon.IModelDeltaDecoration { const jsonSchema: IJSONSchema = this.getConfigurationsMap()[setting.key]; - const maxColumn = model.getLineMaxColumn(setting.range.startLineNumber + 1); + const maxColumn = model.getLineMaxColumn(setting.valueRange.startLineNumber); const range = { - startLineNumber: setting.range.startLineNumber + 1, + startLineNumber: setting.valueRange.startLineNumber, startColumn: maxColumn, - endLineNumber: setting.range.startLineNumber + 1, + endLineNumber: setting.valueRange.startLineNumber, endColumn: maxColumn }; return { diff --git a/src/vs/workbench/parts/settings/common/defaultSettings.ts b/src/vs/workbench/parts/settings/common/defaultSettings.ts index 33bb7a813528ccd6c18401085883360df1e6e10f..d22997bb82af62bc4991953addd4977b3082da9a 100644 --- a/src/vs/workbench/parts/settings/common/defaultSettings.ts +++ b/src/vs/workbench/parts/settings/common/defaultSettings.ts @@ -9,24 +9,21 @@ import * as strings from 'vs/base/common/strings'; import URI from 'vs/base/common/uri'; import { Registry } from 'vs/platform/platform'; import { IConfigurationNode, IConfigurationRegistry, Extensions } from 'vs/platform/configuration/common/configurationRegistry'; -import { IDefaultSettings, IDefaultKeybindings, ISettingsGroup } from 'vs/workbench/parts/settings/common/openSettings'; +import { IDefaultSettings, IDefaultKeybindings, ISettingsGroup, ISetting } from 'vs/workbench/parts/settings/common/openSettings'; import { IWorkspaceConfigurationService } from 'vs/workbench/services/configuration/common/configuration'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; export class DefaultSettings implements IDefaultSettings { private _uri: URI = URI.from({ scheme: network.Schemas.vscode, authority: 'defaultsettings', path: '/settings.json' }); - private _content: string; - private _settingsGroups: ISettingsGroup[]; private indent: string; + private _settingsGroups: ISettingsGroup[]; + private _content: string; + constructor( @IWorkspaceConfigurationService private configurationService: IWorkspaceConfigurationService) { const editorConfig = this.configurationService.getConfiguration(); this.indent = editorConfig.editor.insertSpaces ? strings.repeat(' ', editorConfig.editor.tabSize) : '\t'; - - const configurations = Registry.as(Extensions.Configuration).getConfigurations(); - this._settingsGroups = configurations.sort(this.compareConfigurationNodes).reduce((result, config) => this.parseConfig(config, result), []); - this._content = this.toContent(); } public get uri(): URI { @@ -34,10 +31,17 @@ export class DefaultSettings implements IDefaultSettings { } public get content(): string { + if (!this._content) { + this._content = this.toContent(this.settingsGroups); + } return this._content; } - public getSettingsGroups(): ISettingsGroup[] { + public get settingsGroups(): ISettingsGroup[] { + if (!this._settingsGroups) { + const configurations = Registry.as(Extensions.Configuration).getConfigurations(); + this._settingsGroups = configurations.sort(this.compareConfigurationNodes).reduce((result, config) => this.parseConfig(config, result), []); + } return this._settingsGroups; } @@ -46,23 +50,23 @@ export class DefaultSettings implements IDefaultSettings { if (!settingsGroup) { settingsGroup = result.filter(g => g.title === config.title)[0]; if (!settingsGroup) { - settingsGroup = { sections: [{ settings: [] }], title: config.title }; + settingsGroup = { sections: [{ settings: [] }], title: config.title, titleRange: null }; result.push(settingsGroup); } } else { - settingsGroup.sections[settingsGroup.sections.length - 1].description = config.title; + settingsGroup.sections[settingsGroup.sections.length - 1].title = config.title; } } if (config.properties) { if (!settingsGroup) { - settingsGroup = { sections: [{ settings: [] }], title: config.id }; + settingsGroup = { sections: [{ settings: [] }], title: config.id, titleRange: null }; result.push(settingsGroup); } - const configurationSettings = Object.keys(config.properties).map((key) => { + const configurationSettings: ISetting[] = Object.keys(config.properties).map((key) => { const prop = config.properties[key]; const value = prop.default; const description = prop.description || ''; - return { key, value, description }; + return { key, value, description, range: null, valueRange: null }; }); settingsGroup.sections[settingsGroup.sections.length - 1].settings.push(...configurationSettings); } @@ -87,63 +91,69 @@ export class DefaultSettings implements IDefaultSettings { return c1.order - c2.order; } - private toContent(): string { - let defaultsHeader = '// ' + nls.localize('defaultSettingsHeader', "Overwrite settings by placing them into your settings file.\n"); - defaultsHeader += '// ' + nls.localize('defaultSettingsHeader2', "See http://go.microsoft.com/fwlink/?LinkId=808995 for the most commonly used settings.\n\n"); - - let lastEntry = -1; + private toContent(settingsGroups: ISettingsGroup[]): string { + let lastSetting: ISetting = null; const result: string[] = []; + + result.push('// ' + nls.localize('defaultSettingsHeader', "Overwrite settings by placing them into your settings file.")); + result.push('// ' + nls.localize('defaultSettingsHeader2', "See http://go.microsoft.com/fwlink/?LinkId=808995 for the most commonly used settings.")); result.push('{'); - let lineNumber = 4; // Beginning of settings - for (const group of this._settingsGroups) { - result.push('// ' + group.title); - lineNumber++; - group.range = { startLineNumber: lineNumber, startColumn: 1, endLineNumber: lineNumber, endColumn: 1 }; + + for (const group of settingsGroups) { + this.addTitleOrDescription(group.title, '', result); + let groupTitleStart = result.length + 1; + group.titleRange = { startLineNumber: groupTitleStart, startColumn: 1, endLineNumber: result.length, endColumn: result[result.length - 1].length }; for (const section of group.sections) { - if (section.description) { - result.push(this.indent + '// ' + section.description); - lineNumber++; - section.range = { startLineNumber: lineNumber, startColumn: 1, endLineNumber: lineNumber, endColumn: 1 }; + if (section.title) { + let sectionTitleStart = result.length + 1; + this.addTitleOrDescription(section.title, this.indent, result); + section.titleRange = { startLineNumber: sectionTitleStart, startColumn: 1, endLineNumber: result.length, endColumn: result[result.length - 1].length }; } for (const setting of section.settings) { - result.push(this.indent + '// ' + setting.description); - lineNumber++; - const settingStart = lineNumber; + const settingStart = result.length + 1; + this.addTitleOrDescription(setting.description, this.indent, result); + const valueStart = result.length + 1; let valueString = JSON.stringify(setting.value, null, this.indent); - let valueLines = 1; if (valueString && (typeof setting.value === 'object')) { const mulitLineValue = valueString.split('\n'); - valueString = mulitLineValue.join('\n' + this.indent); - valueLines = mulitLineValue.length; - } - if (lastEntry !== -1) { - result[lastEntry] += ','; + result.push(this.indent + JSON.stringify(setting.key) + ': ' + mulitLineValue[0]); + for (let i = 1; i < mulitLineValue.length; i++) { + result.push(this.indent + mulitLineValue[i]); + } + } else { + result.push(this.indent + JSON.stringify(setting.key) + ': ' + valueString); } - lastEntry = result.length; - result.push(this.indent + JSON.stringify(setting.key) + ': ' + valueString); - lineNumber += valueLines; - setting.range = { startLineNumber: settingStart, startColumn: 1, endLineNumber: lineNumber, endColumn: 1 }; + result[result.length - 1] += ','; + lastSetting = setting; result.push(''); - lineNumber++; + setting.valueRange = { startLineNumber: valueStart, startColumn: 1, endLineNumber: result.length, endColumn: result[result.length - 1].length }; + setting.range = { startLineNumber: settingStart, startColumn: 1, endLineNumber: result.length, endColumn: result[result.length - 1].length }; } } } + + if (lastSetting) { + const content = result[lastSetting.range.endLineNumber - 2]; + result[lastSetting.range.endLineNumber - 2] = content.substring(0, content.length - 1); + } result.push('}'); + return result.join('\n'); + } - return defaultsHeader + result.join('\n'); + private addTitleOrDescription(description: string, indent: string, result: string[]) { + const multiLines = description.split('\n'); + for (const line of multiLines) { + result.push(indent + '//' + line); + } } } export class DefaultKeybindings implements IDefaultKeybindings { - private _uri: URI; + private _uri: URI = URI.from({ scheme: network.Schemas.vscode, authority: 'defaultsettings', path: '/keybindings.json' }); private _content: string; - constructor( @IKeybindingService keybindingService: IKeybindingService) { - this._uri = URI.from({ scheme: network.Schemas.vscode, authority: 'defaultsettings', path: '/keybindings.json' }); - - const defaultsHeader = '// ' + nls.localize('defaultKeybindingsHeader', "Overwrite key bindings by placing them into your key bindings file."); - this._content = defaultsHeader + '\n' + keybindingService.getDefaultKeybindings(); + constructor( @IKeybindingService private keybindingService: IKeybindingService) { } public get uri(): URI { @@ -151,6 +161,10 @@ export class DefaultKeybindings implements IDefaultKeybindings { } public get content(): string { + if (!this._content) { + const defaultsHeader = '// ' + nls.localize('defaultKeybindingsHeader', "Overwrite key bindings by placing them into your key bindings file."); + this._content = defaultsHeader + '\n' + this.keybindingService.getDefaultKeybindings(); + } return this._content; } } \ No newline at end of file diff --git a/src/vs/workbench/parts/settings/common/openSettings.ts b/src/vs/workbench/parts/settings/common/openSettings.ts index 561a135d16495593ebffd2a6ff45620111421190..9ae547ee2424d204a4bc15ccfbda2c987fc77938 100644 --- a/src/vs/workbench/parts/settings/common/openSettings.ts +++ b/src/vs/workbench/parts/settings/common/openSettings.ts @@ -10,29 +10,31 @@ import URI from 'vs/base/common/uri'; import { IConfigurationValue } from 'vs/workbench/services/configuration/common/configurationEditing'; export interface ISettingsGroup { - range?: IRange; + titleRange: IRange; title: string; sections: ISettingsSection[]; } export interface ISettingsSection { - range?: IRange; - description?: string; + titleRange?: IRange; + title?: string; settings: ISetting[]; } export interface ISetting { - range?: IRange; + range: IRange; key: string; value: any; - description?: string; + valueRange: IRange; + description: string; } export interface IDefaultSettings { uri: URI; content: string; + settingsGroups: ISettingsGroup[]; - getSettingsGroups(): ISettingsGroup[]; + // filterSettings(filter: string): ISettingsGroup[]; } export interface IDefaultKeybindings {