commonEditorConfig.ts 47.9 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;
20
import { AccessibilitySupport } from 'vs/platform/accessibility/common/accessibility';
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;

37
	private readonly _onDidChangeTabFocus = 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: 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

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

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

A
Alex Dima 已提交
78
	constructor(isSimpleWidget: boolean, options: editorOptions.IEditorOptions) {
A
Alex Dima 已提交
79
		super();
80

A
Alex Dima 已提交
81 82
		this.isSimpleWidget = isSimpleWidget;

83 84 85 86 87
		// 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 已提交
88
		this._rawOptions.hover = objects.mixin({}, this._rawOptions.hover || {});
89
		this._rawOptions.parameterHints = objects.mixin({}, this._rawOptions.parameterHints || {});
90

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

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

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

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

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

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

114
		this.editor = newOptions;
E
Erich Gamma 已提交
115

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

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

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

144 145 146 147 148 149 150 151 152 153 154 155
	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;
	}

M
Matt Bierner 已提交
156 157
	private static _subsetEquals(base: { [key: string]: any }, subset: { [key: string]: any }): boolean {
		for (const key in subset) {
158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183
			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;
	}

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

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

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

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

220
	protected abstract readConfiguration(styling: BareFontInfo): FontInfo;
221

E
Erich Gamma 已提交
222 223
}

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

			],
546
			'default': EDITOR_DEFAULTS.autoClosingBrackets,
547
			'description': nls.localize('autoClosingBrackets', "Controls whether the editor should automatically close brackets after the user adds an opening bracket.")
E
Erich Gamma 已提交
548
		},
J
Jackson Kearl 已提交
549
		'editor.autoClosingQuotes': {
J
Jackson Kearl 已提交
550 551
			type: 'string',
			enum: ['always', 'languageDefined', 'beforeWhitespace', 'never'],
552
			enumDescriptions: [
553 554 555 556
				'',
				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."),
				'',
557
			],
J
Jackson Kearl 已提交
558
			'default': EDITOR_DEFAULTS.autoClosingQuotes,
A
Aldo Donetti 已提交
559
			'description': nls.localize('autoClosingQuotes', "Controls whether the editor should automatically close quotes after the user adds an opening quote.")
J
Jackson Kearl 已提交
560
		},
561
		'editor.autoSurround': {
J
Jackson Kearl 已提交
562
			type: 'string',
563
			enum: ['languageDefined', 'brackets', 'quotes', 'never'],
564
			enumDescriptions: [
565
				nls.localize('editor.autoSurround.languageDefined', "Use language configurations to determine when to automatically surround selections."),
566 567
				nls.localize('editor.autoSurround.brackets', "Surround with brackets but not quotes."),
				nls.localize('editor.autoSurround.quotes', "Surround with quotes but not brackets."),
568
				''
569
			],
570 571
			'default': EDITOR_DEFAULTS.autoSurround,
			'description': nls.localize('autoSurround', "Controls whether the editor should automatically surround selections.")
E
Erich Gamma 已提交
572
		},
J
Johannes Rieken 已提交
573
		'editor.formatOnType': {
E
Erich Gamma 已提交
574
			'type': 'boolean',
A
Alex Dima 已提交
575
			'default': EDITOR_DEFAULTS.contribInfo.formatOnType,
576
			'description': nls.localize('formatOnType', "Controls whether the editor should automatically format the line after typing.")
E
Erich Gamma 已提交
577
		},
578 579
		'editor.formatOnPaste': {
			'type': 'boolean',
A
Alex Dima 已提交
580
			'default': EDITOR_DEFAULTS.contribInfo.formatOnPaste,
581
			'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.")
582
		},
583 584 585
		'editor.autoIndent': {
			'type': 'boolean',
			'default': EDITOR_DEFAULTS.autoIndent,
586
			'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.")
587
		},
J
Johannes Rieken 已提交
588
		'editor.suggestOnTriggerCharacters': {
E
Erich Gamma 已提交
589
			'type': 'boolean',
A
Alex Dima 已提交
590
			'default': EDITOR_DEFAULTS.contribInfo.suggestOnTriggerCharacters,
591
			'description': nls.localize('suggestOnTriggerCharacters', "Controls whether suggestions should automatically show up when typing trigger characters.")
E
Erich Gamma 已提交
592
		},
J
Johannes Rieken 已提交
593
		'editor.acceptSuggestionOnEnter': {
594 595
			'type': 'string',
			'enum': ['on', 'smart', 'off'],
A
Alex Dima 已提交
596
			'default': EDITOR_DEFAULTS.contribInfo.acceptSuggestionOnEnter,
597
			'markdownEnumDescriptions': [
598 599 600 601
				'',
				nls.localize('acceptSuggestionOnEnterSmart', "Only accept a suggestion with `Enter` when it makes a textual change."),
				''
			],
602
			'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.")
603 604 605
		},
		'editor.acceptSuggestionOnCommitCharacter': {
			'type': 'boolean',
A
Alex Dima 已提交
606
			'default': EDITOR_DEFAULTS.contribInfo.acceptSuggestionOnCommitCharacter,
607
			'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.")
608
		},
609
		'editor.snippetSuggestions': {
610
			'type': 'string',
611
			'enum': ['top', 'bottom', 'inline', 'none'],
J
Johannes Rieken 已提交
612 613 614 615 616 617
			'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."),
			],
618
			'default': EDITOR_DEFAULTS.contribInfo.suggest.snippets,
619
			'description': nls.localize('snippetSuggestions', "Controls whether snippets are shown with other suggestions and how they are sorted.")
620
		},
621 622
		'editor.emptySelectionClipboard': {
			'type': 'boolean',
623
			'default': EDITOR_DEFAULTS.emptySelectionClipboard,
624 625
			'description': nls.localize('emptySelectionClipboard', "Controls whether copying without a selection copies the current line.")
		},
626
		'editor.copyWithSyntaxHighlighting': {
627
			'type': 'boolean',
628
			'default': EDITOR_DEFAULTS.copyWithSyntaxHighlighting,
629
			'description': nls.localize('copyWithSyntaxHighlighting', "Controls whether syntax highlighting should be copied into the clipboard.")
630
		},
631
		'editor.wordBasedSuggestions': {
632
			'type': 'boolean',
A
Alex Dima 已提交
633
			'default': EDITOR_DEFAULTS.contribInfo.wordBasedSuggestions,
J
Johannes Rieken 已提交
634
			'description': nls.localize('wordBasedSuggestions', "Controls whether completions should be computed based on words in the document.")
635
		},
J
Johannes Rieken 已提交
636
		'editor.suggestSelection': {
637
			'type': 'string',
J
Johannes Rieken 已提交
638
			'enum': ['first', 'recentlyUsed', 'recentlyUsedByPrefix'],
639
			'markdownEnumDescriptions': [
J
Johannes Rieken 已提交
640 641 642
				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 已提交
643
			],
J
Johannes Rieken 已提交
644 645
			'default': 'recentlyUsed',
			'description': nls.localize('suggestSelection', "Controls how suggestions are pre-selected when showing the suggest list.")
646
		},
J
Johannes Rieken 已提交
647
		'editor.suggestFontSize': {
J
Joao Moreno 已提交
648 649 650
			'type': 'integer',
			'default': 0,
			'minimum': 0,
651
			'markdownDescription': nls.localize('suggestFontSize', "Font size for the suggest widget. When set to `0`, the value of `#editor.fontSize#` is used.")
J
Joao Moreno 已提交
652
		},
J
Johannes Rieken 已提交
653
		'editor.suggestLineHeight': {
J
Joao Moreno 已提交
654 655 656
			'type': 'integer',
			'default': 0,
			'minimum': 0,
657
			'markdownDescription': nls.localize('suggestLineHeight', "Line height for the suggest widget. When set to `0`, the value of `#editor.lineHeight#` is used.")
J
Joao Moreno 已提交
658
		},
659
		'editor.tabCompletion': {
660 661 662
			type: 'string',
			default: 'off',
			enum: ['on', 'off', 'onlySnippets'],
663
			enumDescriptions: [
664 665 666 667 668
				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 已提交
669
		},
670 671 672 673 674
		'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 已提交
675 676 677 678 679
		'editor.suggest.localityBonus': {
			type: 'boolean',
			default: false,
			description: nls.localize('suggest.localityBonus', "Controls whether sorting favours words that appear close to the cursor.")
		},
680 681 682 683 684
		'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#`).")
		},
685 686 687 688 689
		'editor.suggest.snippetsPreventQuickSuggestions': {
			type: 'boolean',
			default: true,
			description: nls.localize('suggest.snippetsPreventQuickSuggestions', "Control whether an active snippet prevents quick suggestions.")
		},
690 691 692 693 694
		'editor.suggest.showIcons': {
			type: 'boolean',
			default: EDITOR_DEFAULTS.contribInfo.suggest.showIcons,
			description: nls.localize('suggest.showIcons', "Controls whether to show or hide icons in suggestions.")
		},
J
Johannes Rieken 已提交
695
		'editor.suggest.maxVisibleSuggestions': {
696
			type: 'number',
J
Johannes Rieken 已提交
697
			default: EDITOR_DEFAULTS.contribInfo.suggest.maxVisibleSuggestions,
698
			minimum: 1,
J
Johannes Rieken 已提交
699 700
			maximum: 15,
			description: nls.localize('suggest.maxVisibleSuggestions', "Controls how many suggestions IntelliSense will show before showing a scrollbar (maximum 15).")
701
		},
702 703
		'editor.suggest.filteredTypes': {
			type: 'object',
704
			default: { keyword: true, snippet: true },
705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838
			markdownDescription: nls.localize('suggest.filtered', "Controls whether some suggestion types should be filtered from IntelliSense. A list of suggestion types can be found here: https://code.visualstudio.com/docs/editor/intellisense#_types-of-completions."),
			properties: {
				method: {
					type: 'boolean',
					default: true,
					markdownDescription: nls.localize('suggest.filtered.method', "When set to `false` IntelliSense never shows `method` suggestions.")
				},
				function: {
					type: 'boolean',
					default: true,
					markdownDescription: nls.localize('suggest.filtered.function', "When set to `false` IntelliSense never shows `function` suggestions.")
				},
				constructor: {
					type: 'boolean',
					default: true,
					markdownDescription: nls.localize('suggest.filtered.constructor', "When set to `false` IntelliSense never shows `constructor` suggestions.")
				},
				field: {
					type: 'boolean',
					default: true,
					markdownDescription: nls.localize('suggest.filtered.field', "When set to `false` IntelliSense never shows `field` suggestions.")
				},
				variable: {
					type: 'boolean',
					default: true,
					markdownDescription: nls.localize('suggest.filtered.variable', "When set to `false` IntelliSense never shows `variable` suggestions.")
				},
				class: {
					type: 'boolean',
					default: true,
					markdownDescription: nls.localize('suggest.filtered.class', "When set to `false` IntelliSense never shows `class` suggestions.")
				},
				struct: {
					type: 'boolean',
					default: true,
					markdownDescription: nls.localize('suggest.filtered.struct', "When set to `false` IntelliSense never shows `struct` suggestions.")
				},
				interface: {
					type: 'boolean',
					default: true,
					markdownDescription: nls.localize('suggest.filtered.interface', "When set to `false` IntelliSense never shows `interface` suggestions.")
				},
				module: {
					type: 'boolean',
					default: true,
					markdownDescription: nls.localize('suggest.filtered.module', "When set to `false` IntelliSense never shows `module` suggestions.")
				},
				property: {
					type: 'boolean',
					default: true,
					markdownDescription: nls.localize('suggest.filtered.property', "When set to `false` IntelliSense never shows `property` suggestions.")
				},
				event: {
					type: 'boolean',
					default: true,
					markdownDescription: nls.localize('suggest.filtered.event', "When set to `false` IntelliSense never shows `event` suggestions.")
				},
				operator: {
					type: 'boolean',
					default: true,
					markdownDescription: nls.localize('suggest.filtered.operator', "When set to `false` IntelliSense never shows `operator` suggestions.")
				},
				unit: {
					type: 'boolean',
					default: true,
					markdownDescription: nls.localize('suggest.filtered.unit', "When set to `false` IntelliSense never shows `unit` suggestions.")
				},
				value: {
					type: 'boolean',
					default: true,
					markdownDescription: nls.localize('suggest.filtered.value', "When set to `false` IntelliSense never shows `value` suggestions.")
				},
				constant: {
					type: 'boolean',
					default: true,
					markdownDescription: nls.localize('suggest.filtered.constant', "When set to `false` IntelliSense never shows `constant` suggestions.")
				},
				enum: {
					type: 'boolean',
					default: true,
					markdownDescription: nls.localize('suggest.filtered.enum', "When set to `false` IntelliSense never shows `enum` suggestions.")
				},
				enumMember: {
					type: 'boolean',
					default: true,
					markdownDescription: nls.localize('suggest.filtered.enumMember', "When set to `false` IntelliSense never shows `enumMember` suggestions.")
				},
				keyword: {
					type: 'boolean',
					default: true,
					markdownDescription: nls.localize('suggest.filtered.keyword', "When set to `false` IntelliSense never shows `keyword` suggestions.")
				},
				text: {
					type: 'boolean',
					default: true,
					markdownDescription: nls.localize('suggest.filtered.text', "When set to `false` IntelliSense never shows `text` suggestions.")
				},
				color: {
					type: 'boolean',
					default: true,
					markdownDescription: nls.localize('suggest.filtered.color', "When set to `false` IntelliSense never shows `color` suggestions.")
				},
				file: {
					type: 'boolean',
					default: true,
					markdownDescription: nls.localize('suggest.filtered.file', "When set to `false` IntelliSense never shows `file` suggestions.")
				},
				reference: {
					type: 'boolean',
					default: true,
					markdownDescription: nls.localize('suggest.filtered.reference', "When set to `false` IntelliSense never shows `reference` suggestions.")
				},
				customcolor: {
					type: 'boolean',
					default: true,
					markdownDescription: nls.localize('suggest.filtered.customcolor', "When set to `false` IntelliSense never shows `customcolor` suggestions.")
				},
				folder: {
					type: 'boolean',
					default: true,
					markdownDescription: nls.localize('suggest.filtered.folder', "When set to `false` IntelliSense never shows `folder` suggestions.")
				},
				typeParameter: {
					type: 'boolean',
					default: true,
					markdownDescription: nls.localize('suggest.filtered.typeParameter', "When set to `false` IntelliSense never shows `typeParameter` suggestions.")
				},
				snippet: {
					type: 'boolean',
					default: true,
					markdownDescription: nls.localize('suggest.filtered.snippet', "When set to `false` IntelliSense never shows `snippet` suggestions.")
				},
			}
		},
J
Johannes Rieken 已提交
839
		'editor.gotoLocation.multiple': {
J
Johannes Rieken 已提交
840
			description: nls.localize('editor.gotoLocation.multiple', "Controls the behavior of 'Go To' commands, like Go To Definition, when multiple target locations exist."),
841
			type: 'string',
J
Johannes Rieken 已提交
842
			enum: ['peek', 'gotoAndPeek', 'goto'],
J
Johannes Rieken 已提交
843
			default: EDITOR_DEFAULTS.contribInfo.gotoLocation.multiple,
844
			enumDescriptions: [
J
Johannes Rieken 已提交
845
				nls.localize('editor.gotoLocation.multiple.peek', 'Show peek view of the results (default)'),
J
Johannes Rieken 已提交
846
				nls.localize('editor.gotoLocation.multiple.gotoAndPeek', 'Go to the primary result and show a peek view'),
J
Johannes Rieken 已提交
847
				nls.localize('editor.gotoLocation.multiple.goto', 'Go to the primary result and enable peek-less navigation to others')
848 849
			]
		},
J
Johannes Rieken 已提交
850
		'editor.selectionHighlight': {
E
Erich Gamma 已提交
851
			'type': 'boolean',
A
Alex Dima 已提交
852
			'default': EDITOR_DEFAULTS.contribInfo.selectionHighlight,
R
Rob Lourens 已提交
853
			'description': nls.localize('selectionHighlight', "Controls whether the editor should highlight matches similar to the selection.")
E
Erich Gamma 已提交
854
		},
855 856
		'editor.occurrencesHighlight': {
			'type': 'boolean',
A
Alex Dima 已提交
857
			'default': EDITOR_DEFAULTS.contribInfo.occurrencesHighlight,
858
			'description': nls.localize('occurrencesHighlight', "Controls whether the editor should highlight semantic symbol occurrences.")
859
		},
J
Johannes Rieken 已提交
860
		'editor.overviewRulerLanes': {
E
Erich Gamma 已提交
861 862
			'type': 'integer',
			'default': 3,
863
			'description': nls.localize('overviewRulerLanes', "Controls the number of decorations that can show up at the same position in the overview ruler.")
E
Erich Gamma 已提交
864
		},
865
		'editor.overviewRulerBorder': {
866
			'type': 'boolean',
A
Alex Dima 已提交
867
			'default': EDITOR_DEFAULTS.viewInfo.overviewRulerBorder,
S
SteVen Batten 已提交
868
			'description': nls.localize('overviewRulerBorder', "Controls whether a border should be drawn around the overview ruler.")
869
		},
J
Johannes Rieken 已提交
870
		'editor.cursorBlinking': {
871
			'type': 'string',
872
			'enum': ['blink', 'smooth', 'phase', 'expand', 'solid'],
873
			'default': editorOptions.blinkingStyleToString(EDITOR_DEFAULTS.viewInfo.cursorBlinking),
A
Alex Dima 已提交
874
			'description': nls.localize('cursorBlinking', "Control the cursor animation style.")
875
		},
876 877
		'editor.mouseWheelZoom': {
			'type': 'boolean',
A
Alex Dima 已提交
878
			'default': EDITOR_DEFAULTS.viewInfo.mouseWheelZoom,
879
			'markdownDescription': nls.localize('mouseWheelZoom', "Zoom the font of the editor when using mouse wheel and holding `Ctrl`.")
880
		},
881 882 883 884 885
		'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 已提交
886
		'editor.cursorStyle': {
M
markrendle 已提交
887
			'type': 'string',
888
			'enum': ['block', 'block-outline', 'line', 'line-thin', 'underline', 'underline-thin'],
889
			'default': editorOptions.cursorStyleToString(EDITOR_DEFAULTS.viewInfo.cursorStyle),
890
			'description': nls.localize('cursorStyle', "Controls the cursor style.")
M
markrendle 已提交
891
		},
892
		'editor.cursorWidth': {
893
			'type': 'integer',
894
			'default': EDITOR_DEFAULTS.viewInfo.cursorWidth,
895
			'markdownDescription': nls.localize('cursorWidth', "Controls the width of the cursor when `#editor.cursorStyle#` is set to `line`.")
896
		},
J
Johannes Rieken 已提交
897
		'editor.fontLigatures': {
898
			'type': 'boolean',
A
Alex Dima 已提交
899
			'default': EDITOR_DEFAULTS.viewInfo.fontLigatures,
900
			'description': nls.localize('fontLigatures', "Enables/Disables font ligatures.")
901
		},
J
Johannes Rieken 已提交
902
		'editor.hideCursorInOverviewRuler': {
E
Erich Gamma 已提交
903
			'type': 'boolean',
A
Alex Dima 已提交
904
			'default': EDITOR_DEFAULTS.viewInfo.hideCursorInOverviewRuler,
905
			'description': nls.localize('hideCursorInOverviewRuler', "Controls whether the cursor should be hidden in the overview ruler.")
E
Erich Gamma 已提交
906 907
		},
		'editor.renderWhitespace': {
908
			'type': 'string',
909
			'enum': ['none', 'boundary', 'selection', 'all'],
910 911
			'enumDescriptions': [
				'',
912
				nls.localize('renderWhitespace.boundary', "Render whitespace characters except for single spaces between words."),
913
				nls.localize('renderWhitespace.selection', "Render whitespace characters only on selected text."),
914 915
				''
			],
A
Alex Dima 已提交
916
			default: EDITOR_DEFAULTS.viewInfo.renderWhitespace,
917
			description: nls.localize('renderWhitespace', "Controls how the editor should render whitespace characters.")
E
Erich Gamma 已提交
918
		},
919 920
		'editor.renderControlCharacters': {
			'type': 'boolean',
A
Alex Dima 已提交
921
			default: EDITOR_DEFAULTS.viewInfo.renderControlCharacters,
922
			description: nls.localize('renderControlCharacters', "Controls whether the editor should render control characters.")
923
		},
924 925
		'editor.renderIndentGuides': {
			'type': 'boolean',
A
Alex Dima 已提交
926
			default: EDITOR_DEFAULTS.viewInfo.renderIndentGuides,
927
			description: nls.localize('renderIndentGuides', "Controls whether the editor should render indent guides.")
928
		},
929 930 931
		'editor.highlightActiveIndentGuide': {
			'type': 'boolean',
			default: EDITOR_DEFAULTS.viewInfo.highlightActiveIndentGuide,
932
			description: nls.localize('highlightActiveIndentGuide', "Controls whether the editor should highlight the active indent guide.")
933
		},
934
		'editor.renderLineHighlight': {
935 936
			'type': 'string',
			'enum': ['none', 'gutter', 'line', 'all'],
S
SteVen Batten 已提交
937 938 939 940 941 942
			'enumDescriptions': [
				'',
				'',
				'',
				nls.localize('renderLineHighlight.all', "Highlights both the gutter and the current line."),
			],
A
Alex Dima 已提交
943
			default: EDITOR_DEFAULTS.viewInfo.renderLineHighlight,
S
SteVen Batten 已提交
944
			description: nls.localize('renderLineHighlight', "Controls how the editor should render the current line highlight.")
945
		},
J
Johannes Rieken 已提交
946
		'editor.codeLens': {
E
Erich Gamma 已提交
947
			'type': 'boolean',
A
Alex Dima 已提交
948
			'default': EDITOR_DEFAULTS.contribInfo.codeLens,
R
Rob Lourens 已提交
949
			'description': nls.localize('codeLens', "Controls whether the editor shows CodeLens.")
E
Erich Gamma 已提交
950
		},
J
Johannes Rieken 已提交
951
		'editor.folding': {
M
Martin Aeschlimann 已提交
952
			'type': 'boolean',
A
Alex Dima 已提交
953
			'default': EDITOR_DEFAULTS.contribInfo.folding,
R
Rob Lourens 已提交
954
			'description': nls.localize('folding', "Controls whether the editor has code folding enabled.")
M
Martin Aeschlimann 已提交
955
		},
956 957 958 959
		'editor.foldingStrategy': {
			'type': 'string',
			'enum': ['auto', 'indentation'],
			'default': EDITOR_DEFAULTS.contribInfo.foldingStrategy,
960
			'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.")
961
		},
962 963 964 965 966
		'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.")
967
		},
968
		'editor.matchBrackets': {
969
			'type': 'boolean',
A
Alex Dima 已提交
970
			'default': EDITOR_DEFAULTS.contribInfo.matchBrackets,
971
			'description': nls.localize('matchBrackets', "Highlight matching brackets when one of them is selected.")
972
		},
I
isidor 已提交
973 974
		'editor.glyphMargin': {
			'type': 'boolean',
A
Alex Dima 已提交
975
			'default': EDITOR_DEFAULTS.viewInfo.glyphMargin,
I
isidor 已提交
976 977
			'description': nls.localize('glyphMargin', "Controls whether the editor should render the vertical glyph margin. Glyph margin is mostly used for debugging.")
		},
J
Johannes Rieken 已提交
978
		'editor.useTabStops': {
979
			'type': 'boolean',
980
			'default': EDITOR_DEFAULTS.useTabStops,
M
Matt Bierner 已提交
981
			'description': nls.localize('useTabStops', "Inserting and deleting whitespace follows tab stops.")
982
		},
J
Johannes Rieken 已提交
983
		'editor.trimAutoWhitespace': {
984
			'type': 'boolean',
985
			'default': EDITOR_MODEL_DEFAULTS.trimAutoWhitespace,
M
Matt Bierner 已提交
986
			'description': nls.localize('trimAutoWhitespace', "Remove trailing auto inserted whitespace.")
987
		},
J
Johannes Rieken 已提交
988
		'editor.stablePeek': {
989
			'type': 'boolean',
990
			'default': false,
991
			'markdownDescription': nls.localize('stablePeek', "Keep peek editors open even when double clicking their content or when hitting `Escape`.")
992
		},
993
		'editor.dragAndDrop': {
994
			'type': 'boolean',
995
			'default': EDITOR_DEFAULTS.dragAndDrop,
996
			'description': nls.localize('dragAndDrop', "Controls whether the editor should allow moving selections via drag and drop.")
997
		},
998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008
		'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.")
		},
1009 1010 1011 1012 1013
		'editor.showUnused': {
			'type': 'boolean',
			'default': EDITOR_DEFAULTS.showUnused,
			'description': nls.localize('showUnused', "Controls fading out of unused code.")
		},
1014
		'editor.links': {
1015
			'type': 'boolean',
1016
			'default': EDITOR_DEFAULTS.contribInfo.links,
S
SteVen Batten 已提交
1017
			'description': nls.localize('links', "Controls whether the editor should detect links and make them clickable.")
1018
		},
R
rebornix 已提交
1019
		'editor.colorDecorators': {
1020
			'type': 'boolean',
R
rebornix 已提交
1021
			'default': EDITOR_DEFAULTS.contribInfo.colorDecorators,
1022
			'description': nls.localize('colorDecorators', "Controls whether the editor should render the inline color decorators and color picker.")
1023
		},
1024 1025 1026
		'editor.lightbulb.enabled': {
			'type': 'boolean',
			'default': EDITOR_DEFAULTS.contribInfo.lightbulbEnabled,
S
SteVen Batten 已提交
1027
			'description': nls.localize('codeActions', "Enables the code action lightbulb in the editor.")
1028
		},
1029 1030 1031
		'editor.maxTokenizationLineLength': {
			'type': 'integer',
			'default': 20_000,
A
Alex Dima 已提交
1032
			'description': nls.localize('maxTokenizationLineLength', "Lines above this length will not be tokenized for performance reasons")
1033
		},
1034 1035 1036 1037 1038
		'editor.codeActionsOnSave': {
			'type': 'object',
			'properties': {
				'source.organizeImports': {
					'type': 'boolean',
1039
					'description': nls.localize('codeActionsOnSave.organizeImports', "Controls whether organize imports action should be run on file save.")
1040
				},
1041
				'source.fixAll': {
1042
					'type': 'boolean',
1043
					'description': nls.localize('codeActionsOnSave.fixAll', "Controls whether auto fix action should be run on file save.")
1044 1045 1046 1047 1048 1049
				}
			},
			'additionalProperties': {
				'type': 'boolean'
			},
			'default': EDITOR_DEFAULTS.contribInfo.codeActionsOnSave,
M
Matt Bierner 已提交
1050
			'description': nls.localize('codeActionsOnSave', "Code action kinds to be run on save.")
1051 1052 1053 1054
		},
		'editor.codeActionsOnSaveTimeout': {
			'type': 'number',
			'default': EDITOR_DEFAULTS.contribInfo.codeActionsOnSaveTimeout,
1055
			'description': nls.localize('codeActionsOnSaveTimeout', "Timeout in milliseconds after which the code actions that are run on save are cancelled.")
1056
		},
1057 1058 1059
		'editor.selectionClipboard': {
			'type': 'boolean',
			'default': EDITOR_DEFAULTS.contribInfo.selectionClipboard,
S
SteVen Batten 已提交
1060
			'description': nls.localize('selectionClipboard', "Controls whether the Linux primary clipboard should be supported."),
1061
			'included': platform.isLinux
1062
		},
J
Johannes Rieken 已提交
1063
		'diffEditor.renderSideBySide': {
E
Erich Gamma 已提交
1064 1065
			'type': 'boolean',
			'default': true,
1066
			'description': nls.localize('sideBySide', "Controls whether the diff editor shows the diff side by side or inline.")
E
Erich Gamma 已提交
1067
		},
J
Johannes Rieken 已提交
1068
		'diffEditor.ignoreTrimWhitespace': {
E
Erich Gamma 已提交
1069 1070
			'type': 'boolean',
			'default': true,
1071
			'description': nls.localize('ignoreTrimWhitespace', "Controls whether the diff editor shows changes in leading or trailing whitespace as diffs.")
1072
		},
1073 1074 1075 1076
		'editor.largeFileOptimizations': {
			'type': 'boolean',
			'default': EDITOR_MODEL_DEFAULTS.largeFileOptimizations,
			'description': nls.localize('largeFileOptimizations', "Special handling for large files to disable certain memory intensive features.")
1077
		},
1078 1079 1080
		'diffEditor.renderIndicators': {
			'type': 'boolean',
			'default': true,
1081
			'description': nls.localize('renderIndicators', "Controls whether the diff editor shows +/- indicators for added/removed changes.")
E
Erich Gamma 已提交
1082 1083
		}
	}
A
Alex Dima 已提交
1084 1085
};

A
Alex Dima 已提交
1086
let cachedEditorConfigurationKeys: { [key: string]: boolean; } | null = null;
1087 1088
function getEditorConfigurationKeys(): { [key: string]: boolean; } {
	if (cachedEditorConfigurationKeys === null) {
A
Alex Dima 已提交
1089 1090 1091
		cachedEditorConfigurationKeys = <{ [key: string]: boolean; }>Object.create(null);
		Object.keys(editorConfiguration.properties!).forEach((prop) => {
			cachedEditorConfigurationKeys![prop] = true;
1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105
		});
	}
	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);
}

1106
configurationRegistry.registerConfiguration(editorConfiguration);