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

A
Alex Dima 已提交
6
import * as nls from 'vs/nls';
A
Alex Dima 已提交
7
import { Emitter, Event } from 'vs/base/common/event';
J
Johannes Rieken 已提交
8
import { Disposable } from 'vs/base/common/lifecycle';
A
Alex Dima 已提交
9
import * as objects from 'vs/base/common/objects';
A
Alex Dima 已提交
10
import * as platform from 'vs/base/common/platform';
11
import * as editorOptions from 'vs/editor/common/config/editorOptions';
A
Alex Dima 已提交
12 13 14 15 16
import { EditorZoom } from 'vs/editor/common/config/editorZoom';
import { BareFontInfo, FontInfo } from 'vs/editor/common/config/fontInfo';
import * as editorCommon from 'vs/editor/common/editorCommon';
import { ConfigurationScope, Extensions, IConfigurationNode, IConfigurationRegistry } from 'vs/platform/configuration/common/configurationRegistry';
import { Registry } from 'vs/platform/registry/common/platform';
17 18 19
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 已提交
20

21 22 23 24 25 26 27
/**
 * 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 已提交
28
	onDidChangeTabFocus: Event<boolean>;
29
	getTabFocusMode(): boolean;
J
Johannes Rieken 已提交
30
	setTabFocusMode(tabFocusMode: boolean): void;
31 32
}

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

36
	private readonly _onDidChangeTabFocus = new Emitter<boolean>();
37
	public readonly onDidChangeTabFocus: Event<boolean> = this._onDidChangeTabFocus.event;
38 39 40 41 42

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

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

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

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

63 64
const hasOwnProperty = Object.hasOwnProperty;

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

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

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

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

79 80 81 82 83
		// 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 已提交
84
		this._rawOptions.hover = objects.mixin({}, this._rawOptions.hover || {});
85
		this._rawOptions.parameterHints = objects.mixin({}, this._rawOptions.parameterHints || {});
86

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

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

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

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

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

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

110
		this.editor = newOptions;
E
Erich Gamma 已提交
111

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

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

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

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
	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;
	}

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

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

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

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

216
	protected abstract readConfiguration(styling: BareFontInfo): FontInfo;
217

E
Erich Gamma 已提交
218 219
}

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

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

A
Alex Dima 已提交
902
let cachedEditorConfigurationKeys: { [key: string]: boolean; } | null = null;
903 904
function getEditorConfigurationKeys(): { [key: string]: boolean; } {
	if (cachedEditorConfigurationKeys === null) {
A
Alex Dima 已提交
905 906 907
		cachedEditorConfigurationKeys = <{ [key: string]: boolean; }>Object.create(null);
		Object.keys(editorConfiguration.properties!).forEach((prop) => {
			cachedEditorConfigurationKeys![prop] = true;
908 909 910 911 912 913 914 915 916 917 918 919 920 921
		});
	}
	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);
}

922
configurationRegistry.registerConfiguration(editorConfiguration);