commonEditorConfig.ts 38.0 KB
Newer Older
E
Erich Gamma 已提交
1 2 3 4 5 6
/*---------------------------------------------------------------------------------------------
 *  Copyright (c) Microsoft Corporation. All rights reserved.
 *  Licensed under the MIT License. See License.txt in the project root for license information.
 *--------------------------------------------------------------------------------------------*/
'use strict';

A
Alex Dima 已提交
7
import * as nls from 'vs/nls';
M
Matt Bierner 已提交
8
import { Event, Emitter } from 'vs/base/common/event';
J
Johannes Rieken 已提交
9
import { Disposable } from 'vs/base/common/lifecycle';
A
Alex Dima 已提交
10
import * as objects from 'vs/base/common/objects';
A
Alex Dima 已提交
11
import * as platform from 'vs/base/common/platform';
12
import { Extensions, IConfigurationRegistry, IConfigurationNode, ConfigurationScope } from 'vs/platform/configuration/common/configurationRegistry';
13
import { Registry } from 'vs/platform/registry/common/platform';
A
Alex Dima 已提交
14
import * as editorCommon from 'vs/editor/common/editorCommon';
15
import { FontInfo, BareFontInfo } from 'vs/editor/common/config/fontInfo';
A
Alex Dima 已提交
16
import { EditorZoom } from 'vs/editor/common/config/editorZoom';
17
import * as editorOptions from 'vs/editor/common/config/editorOptions';
18 19 20
import EDITOR_DEFAULTS = editorOptions.EDITOR_DEFAULTS;
import EDITOR_FONT_DEFAULTS = editorOptions.EDITOR_FONT_DEFAULTS;
import EDITOR_MODEL_DEFAULTS = editorOptions.EDITOR_MODEL_DEFAULTS;
E
Erich Gamma 已提交
21

22 23 24 25 26 27 28
/**
 * Control what pressing Tab does.
 * If it is false, pressing Tab or Shift-Tab will be handled by the editor.
 * If it is true, pressing Tab or Shift-Tab will move the browser focus.
 * Defaults to false.
 */
export interface ITabFocus {
J
Johannes Rieken 已提交
29
	onDidChangeTabFocus: Event<boolean>;
30
	getTabFocusMode(): boolean;
J
Johannes Rieken 已提交
31
	setTabFocusMode(tabFocusMode: boolean): void;
32 33
}

A
Alex Dima 已提交
34
export const TabFocus: ITabFocus = new class implements ITabFocus {
35 36
	private _tabFocus: boolean = false;

M
Matt Bierner 已提交
37
	private readonly _onDidChangeTabFocus: Emitter<boolean> = new Emitter<boolean>();
38
	public readonly onDidChangeTabFocus: Event<boolean> = this._onDidChangeTabFocus.event;
39 40 41 42 43

	public getTabFocusMode(): boolean {
		return this._tabFocus;
	}

J
Johannes Rieken 已提交
44
	public setTabFocusMode(tabFocusMode: boolean): void {
45 46 47 48 49 50 51 52 53
		if (this._tabFocus === tabFocusMode) {
			return;
		}

		this._tabFocus = tabFocusMode;
		this._onDidChangeTabFocus.fire(this._tabFocus);
	}
};

A
Alex Dima 已提交
54 55 56 57
export interface IEnvConfiguration {
	extraEditorClassName: string;
	outerWidth: number;
	outerHeight: number;
58
	emptySelectionClipboard: boolean;
A
Alex Dima 已提交
59 60
	pixelRatio: number;
	zoomLevel: number;
61
	accessibilitySupport: platform.AccessibilitySupport;
62 63
}

64 65
const hasOwnProperty = Object.hasOwnProperty;

A
Alex Dima 已提交
66
export abstract class CommonEditorConfiguration extends Disposable implements editorCommon.IConfiguration {
E
Erich Gamma 已提交
67

68 69
	protected _rawOptions: editorOptions.IEditorOptions;
	protected _validatedOptions: editorOptions.IValidatedEditorOptions;
70
	public editor: editorOptions.InternalEditorOptions;
J
Johannes Rieken 已提交
71
	private _isDominatedByLongLines: boolean;
72
	private _lineNumbersDigitCount: number;
E
Erich Gamma 已提交
73

74
	private _onDidChange = this._register(new Emitter<editorOptions.IConfigurationChangedEvent>());
75
	public readonly onDidChange: Event<editorOptions.IConfigurationChangedEvent> = this._onDidChange.event;
A
Alex Dima 已提交
76

A
Alex Dima 已提交
77
	constructor(options: editorOptions.IEditorOptions) {
A
Alex Dima 已提交
78
		super();
79

80 81 82 83 84
		// Do a "deep clone of sorts" on the incoming options
		this._rawOptions = objects.mixin({}, options || {});
		this._rawOptions.scrollbar = objects.mixin({}, this._rawOptions.scrollbar || {});
		this._rawOptions.minimap = objects.mixin({}, this._rawOptions.minimap || {});
		this._rawOptions.find = objects.mixin({}, this._rawOptions.find || {});
A
Alex Dima 已提交
85
		this._rawOptions.hover = objects.mixin({}, this._rawOptions.hover || {});
86
		this._rawOptions.parameterHints = objects.mixin({}, this._rawOptions.parameterHints || {});
87

88
		this._validatedOptions = editorOptions.EditorOptionsValidator.validate(this._rawOptions, EDITOR_DEFAULTS);
A
Alex Dima 已提交
89
		this.editor = null;
E
Erich Gamma 已提交
90
		this._isDominatedByLongLines = false;
91
		this._lineNumbersDigitCount = 1;
A
Alex Dima 已提交
92

93
		this._register(EditorZoom.onDidChangeZoomLevel(_ => this._recomputeOptions()));
94
		this._register(TabFocus.onDidChangeTabFocus(_ => this._recomputeOptions()));
E
Erich Gamma 已提交
95 96
	}

A
Alex Dima 已提交
97 98 99
	public observeReferenceElement(dimension?: editorCommon.IDimension): void {
	}

E
Erich Gamma 已提交
100 101 102 103 104
	public dispose(): void {
		super.dispose();
	}

	protected _recomputeOptions(): void {
A
Alex Dima 已提交
105 106
		const oldOptions = this.editor;
		const newOptions = this._computeInternalOptions();
107

A
Alex Dima 已提交
108
		if (oldOptions && oldOptions.equals(newOptions)) {
109
			return;
E
Erich Gamma 已提交
110 111
		}

112
		this.editor = newOptions;
E
Erich Gamma 已提交
113

A
Alex Dima 已提交
114 115
		if (oldOptions) {
			this._onDidChange.fire(oldOptions.createChangeEvent(newOptions));
116
		}
E
Erich Gamma 已提交
117
	}
118

119
	public getRawOptions(): editorOptions.IEditorOptions {
120
		return this._rawOptions;
E
Erich Gamma 已提交
121
	}
122

123
	private _computeInternalOptions(): editorOptions.InternalEditorOptions {
124
		const opts = this._validatedOptions;
A
Alex Dima 已提交
125 126
		const partialEnv = this._getEnvConfiguration();
		const bareFontInfo = BareFontInfo.createFromRawSettings(this._rawOptions, partialEnv.zoomLevel);
A
Alex Dima 已提交
127
		const env: editorOptions.IEnvironmentalOptions = {
A
Alex Dima 已提交
128 129
			outerWidth: partialEnv.outerWidth,
			outerHeight: partialEnv.outerHeight,
130
			fontInfo: this.readConfiguration(bareFontInfo),
131
			extraEditorClassName: partialEnv.extraEditorClassName,
132 133
			isDominatedByLongLines: this._isDominatedByLongLines,
			lineNumbersDigitCount: this._lineNumbersDigitCount,
134
			emptySelectionClipboard: partialEnv.emptySelectionClipboard,
A
Alex Dima 已提交
135
			pixelRatio: partialEnv.pixelRatio,
136 137
			tabFocusMode: TabFocus.getTabFocusMode(),
			accessibilitySupport: partialEnv.accessibilitySupport
A
Alex Dima 已提交
138
		};
139
		return editorOptions.InternalEditorOptionsFactory.createInternalEditorOptions(env, opts);
E
Erich Gamma 已提交
140 141
	}

142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181
	private static _primitiveArrayEquals(a: any[], b: any[]): boolean {
		if (a.length !== b.length) {
			return false;
		}
		for (let i = 0; i < a.length; i++) {
			if (a[i] !== b[i]) {
				return false;
			}
		}
		return true;
	}

	private static _subsetEquals(base: object, subset: object): boolean {
		for (let key in subset) {
			if (hasOwnProperty.call(subset, key)) {
				const subsetValue = subset[key];
				const baseValue = base[key];

				if (baseValue === subsetValue) {
					continue;
				}
				if (Array.isArray(baseValue) && Array.isArray(subsetValue)) {
					if (!this._primitiveArrayEquals(baseValue, subsetValue)) {
						return false;
					}
					continue;
				}
				if (typeof baseValue === 'object' && typeof subsetValue === 'object') {
					if (!this._subsetEquals(baseValue, subsetValue)) {
						return false;
					}
					continue;
				}

				return false;
			}
		}
		return true;
	}

182
	public updateOptions(newOptions: editorOptions.IEditorOptions): void {
183 184 185 186 187 188
		if (typeof newOptions === 'undefined') {
			return;
		}
		if (CommonEditorConfiguration._subsetEquals(this._rawOptions, newOptions)) {
			return;
		}
189
		this._rawOptions = objects.mixin(this._rawOptions, newOptions || {});
190
		this._validatedOptions = editorOptions.EditorOptionsValidator.validate(this._rawOptions, EDITOR_DEFAULTS);
E
Erich Gamma 已提交
191 192 193
		this._recomputeOptions();
	}

J
Johannes Rieken 已提交
194
	public setIsDominatedByLongLines(isDominatedByLongLines: boolean): void {
E
Erich Gamma 已提交
195 196 197 198
		this._isDominatedByLongLines = isDominatedByLongLines;
		this._recomputeOptions();
	}

J
Johannes Rieken 已提交
199
	public setMaxLineNumber(maxLineNumber: number): void {
200
		let digitCount = CommonEditorConfiguration._digitCount(maxLineNumber);
201
		if (this._lineNumbersDigitCount === digitCount) {
A
Alex Dima 已提交
202 203
			return;
		}
204
		this._lineNumbersDigitCount = digitCount;
E
Erich Gamma 已提交
205 206 207
		this._recomputeOptions();
	}

208
	private static _digitCount(n: number): number {
A
Alex Dima 已提交
209
		let r = 0;
210 211 212 213 214 215
		while (n) {
			n = Math.floor(n / 10);
			r++;
		}
		return r ? r : 1;
	}
A
Alex Dima 已提交
216
	protected abstract _getEnvConfiguration(): IEnvConfiguration;
217

218
	protected abstract readConfiguration(styling: BareFontInfo): FontInfo;
219

E
Erich Gamma 已提交
220 221
}

222
const configurationRegistry = Registry.as<IConfigurationRegistry>(Extensions.Configuration);
223
const editorConfiguration: IConfigurationNode = {
E
Erich Gamma 已提交
224 225 226
	'id': 'editor',
	'order': 5,
	'type': 'object',
227
	'title': nls.localize('editorConfigurationTitle', "Editor"),
228
	'overridable': true,
S
Sandeep Somavarapu 已提交
229
	'scope': ConfigurationScope.RESOURCE,
J
Johannes Rieken 已提交
230 231
	'properties': {
		'editor.fontFamily': {
E
Erich Gamma 已提交
232
			'type': 'string',
233
			'default': EDITOR_FONT_DEFAULTS.fontFamily,
E
Erich Gamma 已提交
234 235
			'description': nls.localize('fontFamily', "Controls the font family.")
		},
J
Johannes Rieken 已提交
236
		'editor.fontWeight': {
237
			'type': 'string',
238
			'enum': ['normal', 'bold', '100', '200', '300', '400', '500', '600', '700', '800', '900'],
239
			'default': EDITOR_FONT_DEFAULTS.fontWeight,
240 241
			'description': nls.localize('fontWeight', "Controls the font weight.")
		},
J
Johannes Rieken 已提交
242
		'editor.fontSize': {
E
Erich Gamma 已提交
243
			'type': 'number',
244
			'default': EDITOR_FONT_DEFAULTS.fontSize,
245
			'description': nls.localize('fontSize', "Controls the font size in pixels.")
E
Erich Gamma 已提交
246
		},
J
Johannes Rieken 已提交
247
		'editor.lineHeight': {
E
Erich Gamma 已提交
248
			'type': 'number',
249
			'default': EDITOR_FONT_DEFAULTS.lineHeight,
S
SteVen Batten 已提交
250
			'description': nls.localize('lineHeight', "Controls the line height. Use 0 to compute the line height from the font size.")
E
Erich Gamma 已提交
251
		},
252 253
		'editor.letterSpacing': {
			'type': 'number',
254
			'default': EDITOR_FONT_DEFAULTS.letterSpacing,
255 256
			'description': nls.localize('letterSpacing', "Controls the letter spacing in pixels.")
		},
J
Johannes Rieken 已提交
257
		'editor.lineNumbers': {
258
			'type': 'string',
259
			'enum': ['off', 'on', 'relative', 'interval'],
260 261 262
			'enumDescriptions': [
				nls.localize('lineNumbers.off', "Line numbers are not rendered."),
				nls.localize('lineNumbers.on', "Line numbers are rendered as absolute number."),
263 264
				nls.localize('lineNumbers.relative', "Line numbers are rendered as distance in lines to cursor position."),
				nls.localize('lineNumbers.interval', "Line numbers are rendered every 10 lines.")
265
			],
266
			'default': 'on',
A
Alex Dima 已提交
267
			'description': nls.localize('lineNumbers', "Controls the display of line numbers.")
E
Erich Gamma 已提交
268
		},
J
Johannes Rieken 已提交
269
		'editor.rulers': {
270 271 272 273
			'type': 'array',
			'items': {
				'type': 'number'
			},
A
Alex Dima 已提交
274
			'default': EDITOR_DEFAULTS.viewInfo.rulers,
S
SteVen Batten 已提交
275
			'description': nls.localize('rulers', "Render vertical rulers after a certain number of monospace characters. Use multiple values for multiple rulers. No rulers are drawn if array is empty.")
276
		},
J
Johannes Rieken 已提交
277
		'editor.wordSeparators': {
A
Alex Dima 已提交
278
			'type': 'string',
279
			'default': EDITOR_DEFAULTS.wordSeparators,
M
Matt Bierner 已提交
280
			'description': nls.localize('wordSeparators', "Characters that will be used as word separators when doing word related navigations or operations.")
A
Alex Dima 已提交
281
		},
J
Johannes Rieken 已提交
282
		'editor.tabSize': {
283
			'type': 'number',
284
			'default': EDITOR_MODEL_DEFAULTS.tabSize,
E
Erich Gamma 已提交
285
			'minimum': 1,
286
			'markdownDescription': nls.localize('tabSize', "The number of spaces a tab is equal to. This setting is overridden based on the file contents when `#editor.detectIndentation#` is on.")
E
Erich Gamma 已提交
287
		},
J
Johannes Rieken 已提交
288
		'editor.insertSpaces': {
289
			'type': 'boolean',
290
			'default': EDITOR_MODEL_DEFAULTS.insertSpaces,
291
			'markdownDescription': nls.localize('insertSpaces', "Insert spaces when pressing `Tab`. This setting is overridden based on the file contents when `#editor.detectIndentation#` is on.")
E
Erich Gamma 已提交
292
		},
J
Johannes Rieken 已提交
293
		'editor.detectIndentation': {
294
			'type': 'boolean',
295
			'default': EDITOR_MODEL_DEFAULTS.detectIndentation,
296
			'markdownDescription': nls.localize('detectIndentation', "Controls whether `#editor.tabSize#` and `#editor.insertSpaces#` will be automatically detected when a file is opened based on the file contents.")
297
		},
J
Johannes Rieken 已提交
298
		'editor.roundedSelection': {
E
Erich Gamma 已提交
299
			'type': 'boolean',
A
Alex Dima 已提交
300
			'default': EDITOR_DEFAULTS.viewInfo.roundedSelection,
301
			'description': nls.localize('roundedSelection', "Controls whether selections should have rounded corners.")
E
Erich Gamma 已提交
302
		},
J
Johannes Rieken 已提交
303
		'editor.scrollBeyondLastLine': {
E
Erich Gamma 已提交
304
			'type': 'boolean',
A
Alex Dima 已提交
305
			'default': EDITOR_DEFAULTS.viewInfo.scrollBeyondLastLine,
S
SteVen Batten 已提交
306
			'description': nls.localize('scrollBeyondLastLine', "Controls whether the editor will scroll beyond the last line.")
E
Erich Gamma 已提交
307
		},
308 309 310
		'editor.scrollBeyondLastColumn': {
			'type': 'number',
			'default': EDITOR_DEFAULTS.viewInfo.scrollBeyondLastColumn,
S
SteVen Batten 已提交
311
			'description': nls.localize('scrollBeyondLastColumn', "Controls the number of extra characters beyond which the editor will scroll horizontally.")
312
		},
313 314 315
		'editor.smoothScrolling': {
			'type': 'boolean',
			'default': EDITOR_DEFAULTS.viewInfo.smoothScrolling,
316
			'description': nls.localize('smoothScrolling', "Controls whether the editor will scroll using an animation.")
317
		},
318 319
		'editor.minimap.enabled': {
			'type': 'boolean',
A
Alex Dima 已提交
320
			'default': EDITOR_DEFAULTS.viewInfo.minimap.enabled,
S
SteVen Batten 已提交
321
			'description': nls.localize('minimap.enabled', "Controls whether the minimap is shown.")
322
		},
323 324 325 326
		'editor.minimap.side': {
			'type': 'string',
			'enum': ['left', 'right'],
			'default': EDITOR_DEFAULTS.viewInfo.minimap.side,
A
Alex Dima 已提交
327
			'description': nls.localize('minimap.side', "Controls the side where to render the minimap.")
328
		},
329 330 331 332
		'editor.minimap.showSlider': {
			'type': 'string',
			'enum': ['always', 'mouseover'],
			'default': EDITOR_DEFAULTS.viewInfo.minimap.showSlider,
A
Alex Dima 已提交
333
			'description': nls.localize('minimap.showSlider', "Controls whether the minimap slider is automatically hidden.")
334
		},
335
		'editor.minimap.renderCharacters': {
336
			'type': 'boolean',
A
Alex Dima 已提交
337
			'default': EDITOR_DEFAULTS.viewInfo.minimap.renderCharacters,
S
SteVen Batten 已提交
338
			'description': nls.localize('minimap.renderCharacters', "Render the actual characters on a line as opposed to color blocks.")
339
		},
A
Alex Dima 已提交
340 341
		'editor.minimap.maxColumn': {
			'type': 'number',
A
Alex Dima 已提交
342
			'default': EDITOR_DEFAULTS.viewInfo.minimap.maxColumn,
S
SteVen Batten 已提交
343
			'description': nls.localize('minimap.maxColumn', "Limit the width of the minimap to render at most a certain number of columns.")
A
Alex Dima 已提交
344
		},
A
Alex Dima 已提交
345 346 347
		'editor.hover.enabled': {
			'type': 'boolean',
			'default': EDITOR_DEFAULTS.contribInfo.hover.enabled,
348
			'description': nls.localize('hover.enabled', "Controls whether the hover is shown.")
A
Alex Dima 已提交
349
		},
350 351 352
		'editor.hover.delay': {
			'type': 'number',
			'default': EDITOR_DEFAULTS.contribInfo.hover.delay,
353
			'description': nls.localize('hover.delay', "Controls the delay in milliseconds after which the hover is shown.")
354
		},
355 356 357
		'editor.hover.sticky': {
			'type': 'boolean',
			'default': EDITOR_DEFAULTS.contribInfo.hover.sticky,
358
			'description': nls.localize('hover.sticky', "Controls whether the hover should remain visible when mouse is moved over it.")
359
		},
360 361 362
		'editor.find.seedSearchStringFromSelection': {
			'type': 'boolean',
			'default': EDITOR_DEFAULTS.contribInfo.find.seedSearchStringFromSelection,
363
			'description': nls.localize('find.seedSearchStringFromSelection', "Controls whether the search string in the Find Widget is seeded from the editor selection.")
364
		},
R
rebornix 已提交
365 366 367
		'editor.find.autoFindInSelection': {
			'type': 'boolean',
			'default': EDITOR_DEFAULTS.contribInfo.find.autoFindInSelection,
368
			'description': nls.localize('find.autoFindInSelection', "Controls whether the find operation is carried out on selected text or the entire file in the editor.")
R
rebornix 已提交
369
		},
370 371 372
		'editor.find.globalFindClipboard': {
			'type': 'boolean',
			'default': EDITOR_DEFAULTS.contribInfo.find.globalFindClipboard,
373
			'description': nls.localize('find.globalFindClipboard', "Controls whether the Find Widget should read or modify the shared find clipboard on macOS."),
374
			'included': platform.isMacintosh
375
		},
J
Johannes Rieken 已提交
376
		'editor.wordWrap': {
377
			'type': 'string',
A
Alex Dima 已提交
378
			'enum': ['off', 'on', 'wordWrapColumn', 'bounded'],
379
			'markdownEnumDescriptions': [
380 381
				nls.localize('wordWrap.off', "Lines will never wrap."),
				nls.localize('wordWrap.on', "Lines will wrap at the viewport width."),
A
Alex Dima 已提交
382 383 384 385 386
				nls.localize({
					key: 'wordWrap.wordWrapColumn',
					comment: [
						'- `editor.wordWrapColumn` refers to a different setting and should not be localized.'
					]
387
				}, "Lines will wrap at `#editor.wordWrapColumn#`."),
A
Alex Dima 已提交
388 389 390 391
				nls.localize({
					key: 'wordWrap.bounded',
					comment: [
						'- viewport means the edge of the visible window size.',
A
Alex Dima 已提交
392
						'- `editor.wordWrapColumn` refers to a different setting and should not be localized.'
A
Alex Dima 已提交
393
					]
394
				}, "Lines will wrap at the minimum of viewport and `#editor.wordWrapColumn#`."),
395
			],
396
			'default': EDITOR_DEFAULTS.wordWrap,
A
Alex Dima 已提交
397 398 399 400 401 402
			'description': nls.localize({
				key: 'wordWrap',
				comment: [
					'- \'off\', \'on\', \'wordWrapColumn\' and \'bounded\' refer to values the setting can take and should not be localized.',
					'- `editor.wordWrapColumn` refers to a different setting and should not be localized.'
				]
403
			}, "Controls how lines should wrap.")
404 405 406
		},
		'editor.wordWrapColumn': {
			'type': 'integer',
407
			'default': EDITOR_DEFAULTS.wordWrapColumn,
408
			'minimum': 1,
409
			'markdownDescription': nls.localize({
A
Alex Dima 已提交
410 411 412 413 414
				key: 'wordWrapColumn',
				comment: [
					'- `editor.wordWrap` refers to a different setting and should not be localized.',
					'- \'wordWrapColumn\' and \'bounded\' refer to values the different setting can take and should not be localized.'
				]
415
			}, "Controls the wrapping column of the editor when `#editor.wordWrap#` is `wordWrapColumn` or `bounded`.")
416
		},
J
Johannes Rieken 已提交
417
		'editor.wrappingIndent': {
E
Erich Gamma 已提交
418
			'type': 'string',
419
			'enum': ['none', 'same', 'indent', 'deepIndent'],
M
Matt Bierner 已提交
420 421 422 423 424 425
			enumDescriptions: [
				nls.localize('wrappingIndent.none', "No indentation. Wrapped lines begin at column 1."),
				nls.localize('wrappingIndent.same', "Wrapped lines get the same indentation as the parent."),
				nls.localize('wrappingIndent.indent', "Wrapped lines get +1 indentation toward the parent."),
				nls.localize('wrappingIndent.deepIndent', "Wrapped lines get +2 indentation toward the parent."),
			],
426
			'default': 'same',
M
Matt Bierner 已提交
427
			'description': nls.localize('wrappingIndent', "Controls the indentation of wrapped lines."),
E
Erich Gamma 已提交
428
		},
J
Johannes Rieken 已提交
429
		'editor.mouseWheelScrollSensitivity': {
E
Erich Gamma 已提交
430
			'type': 'number',
A
Alex Dima 已提交
431
			'default': EDITOR_DEFAULTS.viewInfo.scrollbar.mouseWheelScrollSensitivity,
432
			'markdownDescription': nls.localize('mouseWheelScrollSensitivity', "A multiplier to be used on the `deltaX` and `deltaY` of mouse wheel scroll events.")
E
Erich Gamma 已提交
433
		},
434
		'editor.multiCursorModifier': {
435
			'type': 'string',
436
			'enum': ['ctrlCmd', 'alt'],
437
			'markdownEnumDescriptions': [
438 439
				nls.localize('multiCursorModifier.ctrlCmd', "Maps to `Control` on Windows and Linux and to `Command` on macOS."),
				nls.localize('multiCursorModifier.alt', "Maps to `Alt` on Windows and Linux and to `Option` on macOS.")
440
			],
441
			'default': 'alt',
442
			'markdownDescription': nls.localize({
443 444 445 446 447
				key: 'multiCursorModifier',
				comment: [
					'- `ctrlCmd` refers to a value the setting can take and should not be localized.',
					'- `Control` and `Command` refer to the modifier keys Ctrl or Cmd on the keyboard and can be localized.'
				]
448
			}, "The modifier to be used to add multiple cursors with the mouse. The Go To Definition and Open Link mouse gestures will adapt such that they do not conflict with the multicursor modifier. [Read more](https://code.visualstudio.com/docs/editor/codebasics#_multicursor-modifier).")
449
		},
A
Alex Dima 已提交
450
		'editor.multiCursorMergeOverlapping': {
451
			'type': 'boolean',
A
Alex Dima 已提交
452 453
			'default': EDITOR_DEFAULTS.multiCursorMergeOverlapping,
			'description': nls.localize('multiCursorMergeOverlapping', "Merge multiple cursors when they are overlapping.")
454
		},
J
Johannes Rieken 已提交
455
		'editor.quickSuggestions': {
456
			'anyOf': [
457 458 459
				{
					type: 'boolean',
				},
460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480
				{
					type: 'object',
					properties: {
						strings: {
							type: 'boolean',
							default: false,
							description: nls.localize('quickSuggestions.strings', "Enable quick suggestions inside strings.")
						},
						comments: {
							type: 'boolean',
							default: false,
							description: nls.localize('quickSuggestions.comments', "Enable quick suggestions inside comments.")
						},
						other: {
							type: 'boolean',
							default: true,
							description: nls.localize('quickSuggestions.other', "Enable quick suggestions outside of strings and comments.")
						},
					}
				}
			],
A
Alex Dima 已提交
481
			'default': EDITOR_DEFAULTS.contribInfo.quickSuggestions,
S
SteVen Batten 已提交
482
			'description': nls.localize('quickSuggestions', "Controls whether suggestions should automatically show up while typing.")
E
Erich Gamma 已提交
483
		},
J
Johannes Rieken 已提交
484
		'editor.quickSuggestionsDelay': {
E
Erich Gamma 已提交
485
			'type': 'integer',
A
Alex Dima 已提交
486
			'default': EDITOR_DEFAULTS.contribInfo.quickSuggestionsDelay,
E
Erich Gamma 已提交
487
			'minimum': 0,
S
SteVen Batten 已提交
488
			'description': nls.localize('quickSuggestionsDelay', "Controls the delay in milliseconds after which quick suggestions will show up.")
E
Erich Gamma 已提交
489
		},
490
		'editor.parameterHints.enabled': {
J
Joao Moreno 已提交
491
			'type': 'boolean',
492 493
			'default': EDITOR_DEFAULTS.contribInfo.parameterHints.enabled,
			'description': nls.localize('parameterHints.enabled', "Enables a pop-up that shows parameter documentation and type information as you type.")
J
Joao Moreno 已提交
494
		},
495
		'editor.parameterHints.cycle': {
E
Erich Gamma 已提交
496
			'type': 'boolean',
497 498
			'default': EDITOR_DEFAULTS.contribInfo.parameterHints.cycle,
			'description': nls.localize('parameterHints.cycle', "Controls whether the parameter hints menu cycles or closes when reaching the end of the list.")
J
Joao Moreno 已提交
499
		},
J
Johannes Rieken 已提交
500
		'editor.autoClosingBrackets': {
J
Jackson Kearl 已提交
501 502
			type: 'string',
			enum: ['always', 'languageDefined', 'beforeWhitespace', 'never'],
503
			enumDescriptions: [
504 505 506 507
				'',
				nls.localize('editor.autoClosingBrackets.languageDefined', "Use language configurations to determine when to autoclose brackets."),
				nls.localize('editor.autoClosingBrackets.beforeWhitespace', "Autoclose brackets only when the cursor is to the left of whitespace."),
				'',
508 509

			],
510
			'default': EDITOR_DEFAULTS.autoClosingBrackets,
511
			'description': nls.localize('autoClosingBrackets', "Controls whether the editor should automatically close brackets after the user adds an opening bracket.")
E
Erich Gamma 已提交
512
		},
J
Jackson Kearl 已提交
513
		'editor.autoClosingQuotes': {
J
Jackson Kearl 已提交
514 515
			type: 'string',
			enum: ['always', 'languageDefined', 'beforeWhitespace', 'never'],
516
			enumDescriptions: [
517 518 519 520
				'',
				nls.localize('editor.autoClosingQuotes.languageDefined', "Use language configurations to determine when to autoclose quotes."),
				nls.localize('editor.autoClosingQuotes.beforeWhitespace', "Autoclose quotes only when the cursor is to the left of whitespace."),
				'',
521
			],
J
Jackson Kearl 已提交
522
			'default': EDITOR_DEFAULTS.autoClosingQuotes,
A
Aldo Donetti 已提交
523
			'description': nls.localize('autoClosingQuotes', "Controls whether the editor should automatically close quotes after the user adds an opening quote.")
J
Jackson Kearl 已提交
524
		},
525
		'editor.autoSurround': {
J
Jackson Kearl 已提交
526
			type: 'string',
527
			enum: ['languageDefined', 'brackets', 'quotes', 'never'],
528
			enumDescriptions: [
529
				nls.localize('editor.autoSurround.languageDefined', "Use language configurations to determine when to automatically surround selections."),
530 531
				nls.localize('editor.autoSurround.brackets', "Surround with brackets but not quotes."),
				nls.localize('editor.autoSurround.quotes', "Surround with quotes but not brackets."),
532
				''
533
			],
534 535
			'default': EDITOR_DEFAULTS.autoSurround,
			'description': nls.localize('autoSurround', "Controls whether the editor should automatically surround selections.")
E
Erich Gamma 已提交
536
		},
J
Johannes Rieken 已提交
537
		'editor.formatOnType': {
E
Erich Gamma 已提交
538
			'type': 'boolean',
A
Alex Dima 已提交
539
			'default': EDITOR_DEFAULTS.contribInfo.formatOnType,
540
			'description': nls.localize('formatOnType', "Controls whether the editor should automatically format the line after typing.")
E
Erich Gamma 已提交
541
		},
542 543
		'editor.formatOnPaste': {
			'type': 'boolean',
A
Alex Dima 已提交
544
			'default': EDITOR_DEFAULTS.contribInfo.formatOnPaste,
545
			'description': nls.localize('formatOnPaste', "Controls whether the editor should automatically format the pasted content. A formatter must be available and the formatter should be able to format a range in a document.")
546
		},
547 548 549
		'editor.autoIndent': {
			'type': 'boolean',
			'default': EDITOR_DEFAULTS.autoIndent,
550
			'description': nls.localize('autoIndent', "Controls whether the editor should automatically adjust the indentation when users type, paste or move lines. Extensions with indentation rules of the language must be available.")
551
		},
J
Johannes Rieken 已提交
552
		'editor.suggestOnTriggerCharacters': {
E
Erich Gamma 已提交
553
			'type': 'boolean',
A
Alex Dima 已提交
554
			'default': EDITOR_DEFAULTS.contribInfo.suggestOnTriggerCharacters,
555
			'description': nls.localize('suggestOnTriggerCharacters', "Controls whether suggestions should automatically show up when typing trigger characters.")
E
Erich Gamma 已提交
556
		},
J
Johannes Rieken 已提交
557
		'editor.acceptSuggestionOnEnter': {
558 559
			'type': 'string',
			'enum': ['on', 'smart', 'off'],
A
Alex Dima 已提交
560
			'default': EDITOR_DEFAULTS.contribInfo.acceptSuggestionOnEnter,
561
			'markdownEnumDescriptions': [
562 563 564 565
				'',
				nls.localize('acceptSuggestionOnEnterSmart', "Only accept a suggestion with `Enter` when it makes a textual change."),
				''
			],
566
			'markdownDescription': nls.localize('acceptSuggestionOnEnter', "Controls whether suggestions should be accepted on `Enter`, in addition to `Tab`. Helps to avoid ambiguity between inserting new lines or accepting suggestions.")
567 568 569
		},
		'editor.acceptSuggestionOnCommitCharacter': {
			'type': 'boolean',
A
Alex Dima 已提交
570
			'default': EDITOR_DEFAULTS.contribInfo.acceptSuggestionOnCommitCharacter,
571
			'markdownDescription': nls.localize('acceptSuggestionOnCommitCharacter', "Controls whether suggestions should be accepted on commit characters. For example, in JavaScript, the semi-colon (`;`) can be a commit character that accepts a suggestion and types that character.")
572
		},
573
		'editor.snippetSuggestions': {
574
			'type': 'string',
575
			'enum': ['top', 'bottom', 'inline', 'none'],
J
Johannes Rieken 已提交
576 577 578 579 580 581
			'enumDescriptions': [
				nls.localize('snippetSuggestions.top', "Show snippet suggestions on top of other suggestions."),
				nls.localize('snippetSuggestions.bottom', "Show snippet suggestions below other suggestions."),
				nls.localize('snippetSuggestions.inline', "Show snippets suggestions with other suggestions."),
				nls.localize('snippetSuggestions.none', "Do not show snippet suggestions."),
			],
582
			'default': EDITOR_DEFAULTS.contribInfo.suggest.snippets,
583
			'description': nls.localize('snippetSuggestions', "Controls whether snippets are shown with other suggestions and how they are sorted.")
584
		},
585 586
		'editor.emptySelectionClipboard': {
			'type': 'boolean',
587
			'default': EDITOR_DEFAULTS.emptySelectionClipboard,
588 589
			'description': nls.localize('emptySelectionClipboard', "Controls whether copying without a selection copies the current line.")
		},
590
		'editor.copyWithSyntaxHighlighting': {
591
			'type': 'boolean',
592
			'default': EDITOR_DEFAULTS.copyWithSyntaxHighlighting,
593
			'description': nls.localize('copyWithSyntaxHighlighting', "Controls whether syntax highlighting should be copied into the clipboard.")
594
		},
595
		'editor.wordBasedSuggestions': {
596
			'type': 'boolean',
A
Alex Dima 已提交
597
			'default': EDITOR_DEFAULTS.contribInfo.wordBasedSuggestions,
J
Johannes Rieken 已提交
598
			'description': nls.localize('wordBasedSuggestions', "Controls whether completions should be computed based on words in the document.")
599
		},
J
Johannes Rieken 已提交
600
		'editor.suggestSelection': {
601
			'type': 'string',
J
Johannes Rieken 已提交
602
			'enum': ['first', 'recentlyUsed', 'recentlyUsedByPrefix'],
603
			'markdownEnumDescriptions': [
J
Johannes Rieken 已提交
604 605 606
				nls.localize('suggestSelection.first', "Always select the first suggestion."),
				nls.localize('suggestSelection.recentlyUsed', "Select recent suggestions unless further typing selects one, e.g. `console.| -> console.log` because `log` has been completed recently."),
				nls.localize('suggestSelection.recentlyUsedByPrefix', "Select suggestions based on previous prefixes that have completed those suggestions, e.g. `co -> console` and `con -> const`."),
J
Johannes Rieken 已提交
607
			],
J
Johannes Rieken 已提交
608 609
			'default': 'recentlyUsed',
			'description': nls.localize('suggestSelection', "Controls how suggestions are pre-selected when showing the suggest list.")
610
		},
J
Johannes Rieken 已提交
611
		'editor.suggestFontSize': {
J
Joao Moreno 已提交
612 613 614
			'type': 'integer',
			'default': 0,
			'minimum': 0,
615
			'markdownDescription': nls.localize('suggestFontSize', "Font size for the suggest widget. When set to `0`, the value of `#editor.fontSize#` is used.")
J
Joao Moreno 已提交
616
		},
J
Johannes Rieken 已提交
617
		'editor.suggestLineHeight': {
J
Joao Moreno 已提交
618 619 620
			'type': 'integer',
			'default': 0,
			'minimum': 0,
621
			'markdownDescription': nls.localize('suggestLineHeight', "Line height for the suggest widget. When set to `0`, the value of `#editor.lineHeight#` is used.")
J
Joao Moreno 已提交
622
		},
623 624 625 626 627
		'editor.tabCompletion': {
			type: 'boolean',
			default: false,
			description: nls.localize('tabCompletion', "Insert snippets when their prefix matches. Works best when 'quickSuggestions' aren't enabled.")
		},
628 629 630 631 632
		'editor.suggest.filterGraceful': {
			type: 'boolean',
			default: true,
			description: nls.localize('suggest.filterGraceful', "Controls whether filtering and sorting suggestions accounts for small typos.")
		},
633 634 635 636 637
		'editor.suggest.snippetsPreventQuickSuggestions': {
			type: 'boolean',
			default: true,
			description: nls.localize('suggest.snippetsPreventQuickSuggestions', "Control whether an active snippet prevents quick suggestions.")
		},
J
Johannes Rieken 已提交
638
		'editor.selectionHighlight': {
E
Erich Gamma 已提交
639
			'type': 'boolean',
A
Alex Dima 已提交
640
			'default': EDITOR_DEFAULTS.contribInfo.selectionHighlight,
P
Pine Wu 已提交
641
			'description': nls.localize('selectionHighlight', "Controls whether the editor should highlight matches similar to the selection")
E
Erich Gamma 已提交
642
		},
643 644
		'editor.occurrencesHighlight': {
			'type': 'boolean',
A
Alex Dima 已提交
645
			'default': EDITOR_DEFAULTS.contribInfo.occurrencesHighlight,
646
			'description': nls.localize('occurrencesHighlight', "Controls whether the editor should highlight semantic symbol occurrences.")
647
		},
J
Johannes Rieken 已提交
648
		'editor.overviewRulerLanes': {
E
Erich Gamma 已提交
649 650
			'type': 'integer',
			'default': 3,
651
			'description': nls.localize('overviewRulerLanes', "Controls the number of decorations that can show up at the same position in the overview ruler.")
E
Erich Gamma 已提交
652
		},
653
		'editor.overviewRulerBorder': {
654
			'type': 'boolean',
A
Alex Dima 已提交
655
			'default': EDITOR_DEFAULTS.viewInfo.overviewRulerBorder,
S
SteVen Batten 已提交
656
			'description': nls.localize('overviewRulerBorder', "Controls whether a border should be drawn around the overview ruler.")
657
		},
J
Johannes Rieken 已提交
658
		'editor.cursorBlinking': {
659
			'type': 'string',
660
			'enum': ['blink', 'smooth', 'phase', 'expand', 'solid'],
661
			'default': editorOptions.blinkingStyleToString(EDITOR_DEFAULTS.viewInfo.cursorBlinking),
A
Alex Dima 已提交
662
			'description': nls.localize('cursorBlinking', "Control the cursor animation style.")
663
		},
664 665
		'editor.mouseWheelZoom': {
			'type': 'boolean',
A
Alex Dima 已提交
666
			'default': EDITOR_DEFAULTS.viewInfo.mouseWheelZoom,
667
			'markdownDescription': nls.localize('mouseWheelZoom', "Zoom the font of the editor when using mouse wheel and holding `Ctrl`.")
668
		},
J
Johannes Rieken 已提交
669
		'editor.cursorStyle': {
M
markrendle 已提交
670
			'type': 'string',
671
			'enum': ['block', 'block-outline', 'line', 'line-thin', 'underline', 'underline-thin'],
672
			'default': editorOptions.cursorStyleToString(EDITOR_DEFAULTS.viewInfo.cursorStyle),
673
			'description': nls.localize('cursorStyle', "Controls the cursor style.")
M
markrendle 已提交
674
		},
675
		'editor.cursorWidth': {
676
			'type': 'integer',
677
			'default': EDITOR_DEFAULTS.viewInfo.cursorWidth,
678
			'markdownDescription': nls.localize('cursorWidth', "Controls the width of the cursor when `#editor.cursorStyle#` is set to `line`.")
679
		},
J
Johannes Rieken 已提交
680
		'editor.fontLigatures': {
681
			'type': 'boolean',
A
Alex Dima 已提交
682
			'default': EDITOR_DEFAULTS.viewInfo.fontLigatures,
683
			'description': nls.localize('fontLigatures', "Enables/Disables font ligatures.")
684
		},
J
Johannes Rieken 已提交
685
		'editor.hideCursorInOverviewRuler': {
E
Erich Gamma 已提交
686
			'type': 'boolean',
A
Alex Dima 已提交
687
			'default': EDITOR_DEFAULTS.viewInfo.hideCursorInOverviewRuler,
688
			'description': nls.localize('hideCursorInOverviewRuler', "Controls whether the cursor should be hidden in the overview ruler.")
E
Erich Gamma 已提交
689 690
		},
		'editor.renderWhitespace': {
691 692
			'type': 'string',
			'enum': ['none', 'boundary', 'all'],
693 694 695 696 697
			'enumDescriptions': [
				'',
				nls.localize('renderWhiteSpace.boundary', "Render whitespace characters except for single spaces between words."),
				''
			],
A
Alex Dima 已提交
698
			default: EDITOR_DEFAULTS.viewInfo.renderWhitespace,
699
			description: nls.localize('renderWhitespace', "Controls how the editor should render whitespace characters.")
E
Erich Gamma 已提交
700
		},
701 702
		'editor.renderControlCharacters': {
			'type': 'boolean',
A
Alex Dima 已提交
703
			default: EDITOR_DEFAULTS.viewInfo.renderControlCharacters,
704
			description: nls.localize('renderControlCharacters', "Controls whether the editor should render control characters.")
705
		},
706 707
		'editor.renderIndentGuides': {
			'type': 'boolean',
A
Alex Dima 已提交
708
			default: EDITOR_DEFAULTS.viewInfo.renderIndentGuides,
709
			description: nls.localize('renderIndentGuides', "Controls whether the editor should render indent guides.")
710
		},
711 712 713
		'editor.highlightActiveIndentGuide': {
			'type': 'boolean',
			default: EDITOR_DEFAULTS.viewInfo.highlightActiveIndentGuide,
714
			description: nls.localize('highlightActiveIndentGuide', "Controls whether the editor should highlight the active indent guide.")
715
		},
716
		'editor.renderLineHighlight': {
717 718
			'type': 'string',
			'enum': ['none', 'gutter', 'line', 'all'],
S
SteVen Batten 已提交
719 720 721 722 723 724
			'enumDescriptions': [
				'',
				'',
				'',
				nls.localize('renderLineHighlight.all', "Highlights both the gutter and the current line."),
			],
A
Alex Dima 已提交
725
			default: EDITOR_DEFAULTS.viewInfo.renderLineHighlight,
S
SteVen Batten 已提交
726
			description: nls.localize('renderLineHighlight', "Controls how the editor should render the current line highlight.")
727
		},
J
Johannes Rieken 已提交
728
		'editor.codeLens': {
E
Erich Gamma 已提交
729
			'type': 'boolean',
A
Alex Dima 已提交
730
			'default': EDITOR_DEFAULTS.contribInfo.codeLens,
731
			'description': nls.localize('codeLens', "Controls whether the editor shows CodeLens")
E
Erich Gamma 已提交
732
		},
J
Johannes Rieken 已提交
733
		'editor.folding': {
M
Martin Aeschlimann 已提交
734
			'type': 'boolean',
A
Alex Dima 已提交
735
			'default': EDITOR_DEFAULTS.contribInfo.folding,
736
			'description': nls.localize('folding', "Controls whether the editor has code folding enabled")
M
Martin Aeschlimann 已提交
737
		},
738 739 740 741
		'editor.foldingStrategy': {
			'type': 'string',
			'enum': ['auto', 'indentation'],
			'default': EDITOR_DEFAULTS.contribInfo.foldingStrategy,
742
			'markdownDescription': nls.localize('foldingStrategy', "Controls the strategy for computing folding ranges. `auto` uses a language specific folding strategy, if available. `indentation` uses the indentation based folding strategy.")
743
		},
744 745 746 747 748
		'editor.showFoldingControls': {
			'type': 'string',
			'enum': ['always', 'mouseover'],
			'default': EDITOR_DEFAULTS.contribInfo.showFoldingControls,
			'description': nls.localize('showFoldingControls', "Controls whether the fold controls on the gutter are automatically hidden.")
749
		},
750
		'editor.matchBrackets': {
751
			'type': 'boolean',
A
Alex Dima 已提交
752
			'default': EDITOR_DEFAULTS.contribInfo.matchBrackets,
753
			'description': nls.localize('matchBrackets', "Highlight matching brackets when one of them is selected.")
754
		},
I
isidor 已提交
755 756
		'editor.glyphMargin': {
			'type': 'boolean',
A
Alex Dima 已提交
757
			'default': EDITOR_DEFAULTS.viewInfo.glyphMargin,
I
isidor 已提交
758 759
			'description': nls.localize('glyphMargin', "Controls whether the editor should render the vertical glyph margin. Glyph margin is mostly used for debugging.")
		},
J
Johannes Rieken 已提交
760
		'editor.useTabStops': {
761
			'type': 'boolean',
762
			'default': EDITOR_DEFAULTS.useTabStops,
M
Matt Bierner 已提交
763
			'description': nls.localize('useTabStops', "Inserting and deleting whitespace follows tab stops.")
764
		},
J
Johannes Rieken 已提交
765
		'editor.trimAutoWhitespace': {
766
			'type': 'boolean',
767
			'default': EDITOR_MODEL_DEFAULTS.trimAutoWhitespace,
M
Matt Bierner 已提交
768
			'description': nls.localize('trimAutoWhitespace', "Remove trailing auto inserted whitespace.")
769
		},
J
Johannes Rieken 已提交
770
		'editor.stablePeek': {
771
			'type': 'boolean',
772
			'default': false,
773
			'markdownDescription': nls.localize('stablePeek', "Keep peek editors open even when double clicking their content or when hitting `Escape`.")
774
		},
775
		'editor.dragAndDrop': {
776
			'type': 'boolean',
777
			'default': EDITOR_DEFAULTS.dragAndDrop,
778
			'description': nls.localize('dragAndDrop', "Controls whether the editor should allow moving selections via drag and drop.")
779
		},
780 781 782 783 784 785 786 787 788 789 790
		'editor.accessibilitySupport': {
			'type': 'string',
			'enum': ['auto', 'on', 'off'],
			'enumDescriptions': [
				nls.localize('accessibilitySupport.auto', "The editor will use platform APIs to detect when a Screen Reader is attached."),
				nls.localize('accessibilitySupport.on', "The editor will be permanently optimized for usage with a Screen Reader."),
				nls.localize('accessibilitySupport.off', "The editor will never be optimized for usage with a Screen Reader."),
			],
			'default': EDITOR_DEFAULTS.accessibilitySupport,
			'description': nls.localize('accessibilitySupport', "Controls whether the editor should run in a mode where it is optimized for screen readers.")
		},
791 792 793 794 795
		'editor.showUnused': {
			'type': 'boolean',
			'default': EDITOR_DEFAULTS.showUnused,
			'description': nls.localize('showUnused', "Controls fading out of unused code.")
		},
796
		'editor.links': {
797
			'type': 'boolean',
798
			'default': EDITOR_DEFAULTS.contribInfo.links,
S
SteVen Batten 已提交
799
			'description': nls.localize('links', "Controls whether the editor should detect links and make them clickable.")
800
		},
R
rebornix 已提交
801
		'editor.colorDecorators': {
802
			'type': 'boolean',
R
rebornix 已提交
803
			'default': EDITOR_DEFAULTS.contribInfo.colorDecorators,
804
			'description': nls.localize('colorDecorators', "Controls whether the editor should render the inline color decorators and color picker.")
805
		},
806 807 808
		'editor.lightbulb.enabled': {
			'type': 'boolean',
			'default': EDITOR_DEFAULTS.contribInfo.lightbulbEnabled,
S
SteVen Batten 已提交
809
			'description': nls.localize('codeActions', "Enables the code action lightbulb in the editor.")
810
		},
811 812 813 814 815
		'editor.codeActionsOnSave': {
			'type': 'object',
			'properties': {
				'source.organizeImports': {
					'type': 'boolean',
816
					'description': nls.localize('codeActionsOnSave.organizeImports', "Controls whether organize imports action should be run on file save.")
817 818 819 820 821 822
				}
			},
			'additionalProperties': {
				'type': 'boolean'
			},
			'default': EDITOR_DEFAULTS.contribInfo.codeActionsOnSave,
M
Matt Bierner 已提交
823
			'description': nls.localize('codeActionsOnSave', "Code action kinds to be run on save.")
824 825 826 827
		},
		'editor.codeActionsOnSaveTimeout': {
			'type': 'number',
			'default': EDITOR_DEFAULTS.contribInfo.codeActionsOnSaveTimeout,
828
			'description': nls.localize('codeActionsOnSaveTimeout', "Timeout in milliseconds after which the code actions that are run on save are cancelled.")
829
		},
830 831 832
		'editor.selectionClipboard': {
			'type': 'boolean',
			'default': EDITOR_DEFAULTS.contribInfo.selectionClipboard,
S
SteVen Batten 已提交
833
			'description': nls.localize('selectionClipboard', "Controls whether the Linux primary clipboard should be supported."),
834
			'included': platform.isLinux
835
		},
J
Johannes Rieken 已提交
836
		'diffEditor.renderSideBySide': {
E
Erich Gamma 已提交
837 838
			'type': 'boolean',
			'default': true,
839
			'description': nls.localize('sideBySide', "Controls whether the diff editor shows the diff side by side or inline.")
E
Erich Gamma 已提交
840
		},
J
Johannes Rieken 已提交
841
		'diffEditor.ignoreTrimWhitespace': {
E
Erich Gamma 已提交
842 843
			'type': 'boolean',
			'default': true,
844
			'description': nls.localize('ignoreTrimWhitespace', "Controls whether the diff editor shows changes in leading or trailing whitespace as diffs.")
845
		},
846 847 848 849
		'editor.largeFileOptimizations': {
			'type': 'boolean',
			'default': EDITOR_MODEL_DEFAULTS.largeFileOptimizations,
			'description': nls.localize('largeFileOptimizations', "Special handling for large files to disable certain memory intensive features.")
850
		},
851 852 853
		'diffEditor.renderIndicators': {
			'type': 'boolean',
			'default': true,
854
			'description': nls.localize('renderIndicators', "Controls whether the diff editor shows +/- indicators for added/removed changes.")
E
Erich Gamma 已提交
855 856
		}
	}
A
Alex Dima 已提交
857 858
};

859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878
let cachedEditorConfigurationKeys: { [key: string]: boolean; } = null;
function getEditorConfigurationKeys(): { [key: string]: boolean; } {
	if (cachedEditorConfigurationKeys === null) {
		cachedEditorConfigurationKeys = Object.create(null);
		Object.keys(editorConfiguration.properties).forEach((prop) => {
			cachedEditorConfigurationKeys[prop] = true;
		});
	}
	return cachedEditorConfigurationKeys;
}

export function isEditorConfigurationKey(key: string): boolean {
	const editorConfigurationKeys = getEditorConfigurationKeys();
	return (editorConfigurationKeys[`editor.${key}`] || false);
}
export function isDiffEditorConfigurationKey(key: string): boolean {
	const editorConfigurationKeys = getEditorConfigurationKeys();
	return (editorConfigurationKeys[`diffEditor.${key}`] || false);
}

879
configurationRegistry.registerConfiguration(editorConfiguration);