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

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

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

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

	private _onDidChangeTabFocus: Emitter<boolean> = new Emitter<boolean>();
J
Johannes Rieken 已提交
38
	public onDidChangeTabFocus: Event<boolean> = this._onDidChangeTabFocus.event;
39 40 41 42 43

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

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

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

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

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

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

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

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

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

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

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

	public dispose(): void {
		super.dispose();
	}

	protected _recomputeOptions(): void {
A
Alex Dima 已提交
98 99
		const oldOptions = this.editor;
		const newOptions = this._computeInternalOptions();
100

A
Alex Dima 已提交
101
		if (oldOptions && oldOptions.equals(newOptions)) {
102
			return;
E
Erich Gamma 已提交
103 104
		}

105
		this.editor = newOptions;
E
Erich Gamma 已提交
106

A
Alex Dima 已提交
107 108
		if (oldOptions) {
			this._onDidChange.fire(oldOptions.createChangeEvent(newOptions));
109
		}
E
Erich Gamma 已提交
110
	}
111

112
	public getRawOptions(): editorOptions.IEditorOptions {
113
		return this._rawOptions;
E
Erich Gamma 已提交
114
	}
115

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

135
	public updateOptions(newOptions: editorOptions.IEditorOptions): void {
136
		this._rawOptions = objects.mixin(this._rawOptions, newOptions || {});
137
		this._validatedOptions = editorOptions.EditorOptionsValidator.validate(this._rawOptions, EDITOR_DEFAULTS);
E
Erich Gamma 已提交
138 139 140
		this._recomputeOptions();
	}

J
Johannes Rieken 已提交
141
	public setIsDominatedByLongLines(isDominatedByLongLines: boolean): void {
E
Erich Gamma 已提交
142 143 144 145
		this._isDominatedByLongLines = isDominatedByLongLines;
		this._recomputeOptions();
	}

J
Johannes Rieken 已提交
146
	public setMaxLineNumber(maxLineNumber: number): void {
147
		let digitCount = CommonEditorConfiguration._digitCount(maxLineNumber);
148
		if (this._lineNumbersDigitCount === digitCount) {
A
Alex Dima 已提交
149 150
			return;
		}
151
		this._lineNumbersDigitCount = digitCount;
E
Erich Gamma 已提交
152 153 154
		this._recomputeOptions();
	}

155
	private static _digitCount(n: number): number {
156 157 158 159 160 161 162
		var r = 0;
		while (n) {
			n = Math.floor(n / 10);
			r++;
		}
		return r ? r : 1;
	}
A
Alex Dima 已提交
163
	protected abstract _getEnvConfiguration(): IEnvConfiguration;
164

165
	protected abstract readConfiguration(styling: BareFontInfo): FontInfo;
166

E
Erich Gamma 已提交
167 168
}

169 170
const configurationRegistry = <IConfigurationRegistry>Registry.as(Extensions.Configuration);
const editorConfiguration: IConfigurationNode = {
E
Erich Gamma 已提交
171 172 173
	'id': 'editor',
	'order': 5,
	'type': 'object',
174
	'title': nls.localize('editorConfigurationTitle', "Editor"),
175
	'overridable': true,
S
Sandeep Somavarapu 已提交
176
	'scope': ConfigurationScope.RESOURCE,
J
Johannes Rieken 已提交
177 178
	'properties': {
		'editor.fontFamily': {
E
Erich Gamma 已提交
179
			'type': 'string',
180
			'default': EDITOR_FONT_DEFAULTS.fontFamily,
E
Erich Gamma 已提交
181 182
			'description': nls.localize('fontFamily', "Controls the font family.")
		},
J
Johannes Rieken 已提交
183
		'editor.fontWeight': {
184
			'type': 'string',
185
			'enum': ['normal', 'bold', '100', '200', '300', '400', '500', '600', '700', '800', '900'],
186
			'default': EDITOR_FONT_DEFAULTS.fontWeight,
187 188
			'description': nls.localize('fontWeight', "Controls the font weight.")
		},
J
Johannes Rieken 已提交
189
		'editor.fontSize': {
E
Erich Gamma 已提交
190
			'type': 'number',
191
			'default': EDITOR_FONT_DEFAULTS.fontSize,
192
			'description': nls.localize('fontSize', "Controls the font size in pixels.")
E
Erich Gamma 已提交
193
		},
J
Johannes Rieken 已提交
194
		'editor.lineHeight': {
E
Erich Gamma 已提交
195
			'type': 'number',
196
			'default': EDITOR_FONT_DEFAULTS.lineHeight,
197
			'description': nls.localize('lineHeight', "Controls the line height. Use 0 to compute the lineHeight from the fontSize.")
E
Erich Gamma 已提交
198
		},
199 200
		'editor.letterSpacing': {
			'type': 'number',
201
			'default': EDITOR_FONT_DEFAULTS.letterSpacing,
202 203
			'description': nls.localize('letterSpacing', "Controls the letter spacing in pixels.")
		},
J
Johannes Rieken 已提交
204
		'editor.lineNumbers': {
205
			'type': 'string',
206
			'enum': ['off', 'on', 'relative', 'interval'],
207 208 209
			'enumDescriptions': [
				nls.localize('lineNumbers.off', "Line numbers are not rendered."),
				nls.localize('lineNumbers.on', "Line numbers are rendered as absolute number."),
210 211
				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.")
212
			],
213
			'default': 'on',
214
			'description': nls.localize('lineNumbers', "Controls the display of line numbers. Possible values are 'on', 'off', and 'relative'.")
E
Erich Gamma 已提交
215
		},
J
Johannes Rieken 已提交
216
		'editor.rulers': {
217 218 219 220
			'type': 'array',
			'items': {
				'type': 'number'
			},
A
Alex Dima 已提交
221
			'default': EDITOR_DEFAULTS.viewInfo.rulers,
222
			'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")
223
		},
J
Johannes Rieken 已提交
224
		'editor.wordSeparators': {
A
Alex Dima 已提交
225
			'type': 'string',
226
			'default': EDITOR_DEFAULTS.wordSeparators,
A
Alex Dima 已提交
227 228
			'description': nls.localize('wordSeparators', "Characters that will be used as word separators when doing word related navigations or operations")
		},
J
Johannes Rieken 已提交
229
		'editor.tabSize': {
230
			'type': 'number',
231
			'default': EDITOR_MODEL_DEFAULTS.tabSize,
E
Erich Gamma 已提交
232
			'minimum': 1,
233
			'description': nls.localize('tabSize', "The number of spaces a tab is equal to. This setting is overriden based on the file contents when `editor.detectIndentation` is on."),
234
			'errorMessage': nls.localize('tabSize.errorMessage', "Expected 'number'. Note that the value \"auto\" has been replaced by the `editor.detectIndentation` setting.")
E
Erich Gamma 已提交
235
		},
J
Johannes Rieken 已提交
236
		'editor.insertSpaces': {
237
			'type': 'boolean',
238
			'default': EDITOR_MODEL_DEFAULTS.insertSpaces,
239
			'description': nls.localize('insertSpaces', "Insert spaces when pressing Tab. This setting is overriden based on the file contents when `editor.detectIndentation` is on."),
240
			'errorMessage': nls.localize('insertSpaces.errorMessage', "Expected 'boolean'. Note that the value \"auto\" has been replaced by the `editor.detectIndentation` setting.")
E
Erich Gamma 已提交
241
		},
J
Johannes Rieken 已提交
242
		'editor.detectIndentation': {
243
			'type': 'boolean',
244
			'default': EDITOR_MODEL_DEFAULTS.detectIndentation,
A
Alex Dima 已提交
245
			'description': nls.localize('detectIndentation', "When opening a file, `editor.tabSize` and `editor.insertSpaces` will be detected based on the file contents.")
246
		},
J
Johannes Rieken 已提交
247
		'editor.roundedSelection': {
E
Erich Gamma 已提交
248
			'type': 'boolean',
A
Alex Dima 已提交
249
			'default': EDITOR_DEFAULTS.viewInfo.roundedSelection,
E
Erich Gamma 已提交
250 251
			'description': nls.localize('roundedSelection', "Controls if selections have rounded corners")
		},
J
Johannes Rieken 已提交
252
		'editor.scrollBeyondLastLine': {
E
Erich Gamma 已提交
253
			'type': 'boolean',
A
Alex Dima 已提交
254
			'default': EDITOR_DEFAULTS.viewInfo.scrollBeyondLastLine,
E
Erich Gamma 已提交
255 256
			'description': nls.localize('scrollBeyondLastLine', "Controls if the editor will scroll beyond the last line")
		},
257 258 259 260 261
		'editor.smoothScrolling': {
			'type': 'boolean',
			'default': EDITOR_DEFAULTS.viewInfo.smoothScrolling,
			'description': nls.localize('smoothScrolling', "Controls if the editor will scroll using an animation")
		},
262 263
		'editor.minimap.enabled': {
			'type': 'boolean',
A
Alex Dima 已提交
264
			'default': EDITOR_DEFAULTS.viewInfo.minimap.enabled,
265 266
			'description': nls.localize('minimap.enabled', "Controls if the minimap is shown")
		},
267 268 269 270
		'editor.minimap.showSlider': {
			'type': 'string',
			'enum': ['always', 'mouseover'],
			'default': EDITOR_DEFAULTS.viewInfo.minimap.showSlider,
B
BrokenBacon 已提交
271
			'description': nls.localize('minimap.showSlider', "Controls whether the minimap slider is automatically hidden. Possible values are \'always\' and \'mouseover\'")
272
		},
273
		'editor.minimap.renderCharacters': {
274
			'type': 'boolean',
A
Alex Dima 已提交
275
			'default': EDITOR_DEFAULTS.viewInfo.minimap.renderCharacters,
276
			'description': nls.localize('minimap.renderCharacters', "Render the actual characters on a line (as opposed to color blocks)")
277
		},
A
Alex Dima 已提交
278 279
		'editor.minimap.maxColumn': {
			'type': 'number',
A
Alex Dima 已提交
280
			'default': EDITOR_DEFAULTS.viewInfo.minimap.maxColumn,
A
Alex Dima 已提交
281 282
			'description': nls.localize('minimap.maxColumn', "Limit the width of the minimap to render at most a certain number of columns")
		},
283 284 285
		'editor.find.seedSearchStringFromSelection': {
			'type': 'boolean',
			'default': EDITOR_DEFAULTS.contribInfo.find.seedSearchStringFromSelection,
286
			'description': nls.localize('find.seedSearchStringFromSelection', "Controls if we seed the search string in Find Widget from editor selection")
287
		},
R
rebornix 已提交
288 289 290 291 292
		'editor.find.autoFindInSelection': {
			'type': 'boolean',
			'default': EDITOR_DEFAULTS.contribInfo.find.autoFindInSelection,
			'description': nls.localize('find.autoFindInSelection', "Controls if Find in Selection flag is turned on when multiple characters or lines of text are selected in the editor")
		},
J
Johannes Rieken 已提交
293
		'editor.wordWrap': {
294
			'type': 'string',
A
Alex Dima 已提交
295
			'enum': ['off', 'on', 'wordWrapColumn', 'bounded'],
296 297 298
			'enumDescriptions': [
				nls.localize('wordWrap.off', "Lines will never wrap."),
				nls.localize('wordWrap.on', "Lines will wrap at the viewport width."),
A
Alex Dima 已提交
299 300 301 302 303 304
				nls.localize({
					key: 'wordWrap.wordWrapColumn',
					comment: [
						'- `editor.wordWrapColumn` refers to a different setting and should not be localized.'
					]
				}, "Lines will wrap at `editor.wordWrapColumn`."),
A
Alex Dima 已提交
305 306 307 308
				nls.localize({
					key: 'wordWrap.bounded',
					comment: [
						'- viewport means the edge of the visible window size.',
A
Alex Dima 已提交
309
						'- `editor.wordWrapColumn` refers to a different setting and should not be localized.'
A
Alex Dima 已提交
310 311
					]
				}, "Lines will wrap at the minimum of viewport and `editor.wordWrapColumn`."),
312
			],
313
			'default': EDITOR_DEFAULTS.wordWrap,
A
Alex Dima 已提交
314 315 316 317 318 319 320
			'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.'
				]
			}, "Controls how lines should wrap. Can be:\n - 'off' (disable wrapping),\n - 'on' (viewport wrapping),\n - 'wordWrapColumn' (wrap at `editor.wordWrapColumn`) or\n - 'bounded' (wrap at minimum of viewport and `editor.wordWrapColumn`).")
321 322 323
		},
		'editor.wordWrapColumn': {
			'type': 'integer',
324
			'default': EDITOR_DEFAULTS.wordWrapColumn,
325
			'minimum': 1,
A
Alex Dima 已提交
326 327 328 329 330 331 332
			'description': nls.localize({
				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.'
				]
			}, "Controls the wrapping column of the editor when `editor.wordWrap` is 'wordWrapColumn' or 'bounded'.")
333
		},
J
Johannes Rieken 已提交
334
		'editor.wrappingIndent': {
E
Erich Gamma 已提交
335 336
			'type': 'string',
			'enum': ['none', 'same', 'indent'],
337
			'default': 'same',
E
Erich Gamma 已提交
338 339
			'description': nls.localize('wrappingIndent', "Controls the indentation of wrapped lines. Can be one of 'none', 'same' or 'indent'.")
		},
J
Johannes Rieken 已提交
340
		'editor.mouseWheelScrollSensitivity': {
E
Erich Gamma 已提交
341
			'type': 'number',
A
Alex Dima 已提交
342
			'default': EDITOR_DEFAULTS.viewInfo.scrollbar.mouseWheelScrollSensitivity,
E
Erich Gamma 已提交
343 344
			'description': nls.localize('mouseWheelScrollSensitivity', "A multiplier to be used on the `deltaX` and `deltaY` of mouse wheel scroll events")
		},
345
		'editor.multiCursorModifier': {
346
			'type': 'string',
347 348 349 350 351
			'enum': ['ctrlCmd', 'alt'],
			'enumDescriptions': [
				nls.localize('multiCursorModifier.ctrlCmd', "Maps to `Control` on Windows and Linux and to `Command` on OSX."),
				nls.localize('multiCursorModifier.alt', "Maps to `Alt` on Windows and Linux and to `Option` on OSX.")
			],
352
			'default': 'alt',
353 354 355 356 357 358 359
			'description': nls.localize({
				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.'
				]
			}, "The modifier to be used to add multiple cursors with the mouse. `ctrlCmd` maps to `Control` on Windows and Linux and to `Command` on OSX. The Go To Definition and Open Link mouse gestures will adapt such that they do not conflict with the multicursor modifier.")
360
		},
J
Johannes Rieken 已提交
361
		'editor.quickSuggestions': {
362
			'anyOf': [
363 364 365
				{
					type: 'boolean',
				},
366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386
				{
					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 已提交
387
			'default': EDITOR_DEFAULTS.contribInfo.quickSuggestions,
388
			'description': nls.localize('quickSuggestions', "Controls if suggestions should automatically show up while typing")
E
Erich Gamma 已提交
389
		},
J
Johannes Rieken 已提交
390
		'editor.quickSuggestionsDelay': {
E
Erich Gamma 已提交
391
			'type': 'integer',
A
Alex Dima 已提交
392
			'default': EDITOR_DEFAULTS.contribInfo.quickSuggestionsDelay,
E
Erich Gamma 已提交
393 394 395
			'minimum': 0,
			'description': nls.localize('quickSuggestionsDelay', "Controls the delay in ms after which quick suggestions will show up")
		},
J
Johannes Rieken 已提交
396
		'editor.parameterHints': {
J
Joao Moreno 已提交
397
			'type': 'boolean',
A
Alex Dima 已提交
398
			'default': EDITOR_DEFAULTS.contribInfo.parameterHints,
399
			'description': nls.localize('parameterHints', "Enables pop-up that shows parameter documentation and type information as you type")
J
Joao Moreno 已提交
400
		},
J
Johannes Rieken 已提交
401
		'editor.autoClosingBrackets': {
E
Erich Gamma 已提交
402
			'type': 'boolean',
403
			'default': EDITOR_DEFAULTS.autoClosingBrackets,
E
Erich Gamma 已提交
404 405
			'description': nls.localize('autoClosingBrackets', "Controls if the editor should automatically close brackets after opening them")
		},
J
Johannes Rieken 已提交
406
		'editor.formatOnType': {
E
Erich Gamma 已提交
407
			'type': 'boolean',
A
Alex Dima 已提交
408
			'default': EDITOR_DEFAULTS.contribInfo.formatOnType,
E
Erich Gamma 已提交
409 410
			'description': nls.localize('formatOnType', "Controls if the editor should automatically format the line after typing")
		},
411 412
		'editor.formatOnPaste': {
			'type': 'boolean',
A
Alex Dima 已提交
413
			'default': EDITOR_DEFAULTS.contribInfo.formatOnPaste,
414
			'description': nls.localize('formatOnPaste', "Controls if 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.")
415
		},
416 417 418
		'editor.autoIndent': {
			'type': 'boolean',
			'default': EDITOR_DEFAULTS.autoIndent,
G
Guangcong Luo 已提交
419
			'description': nls.localize('autoIndent', "Controls if the editor should automatically adjust the indentation when users type, paste or move lines. Indentation rules of the language must be available.")
420
		},
J
Johannes Rieken 已提交
421
		'editor.suggestOnTriggerCharacters': {
E
Erich Gamma 已提交
422
			'type': 'boolean',
A
Alex Dima 已提交
423
			'default': EDITOR_DEFAULTS.contribInfo.suggestOnTriggerCharacters,
E
Erich Gamma 已提交
424 425
			'description': nls.localize('suggestOnTriggerCharacters', "Controls if suggestions should automatically show up when typing trigger characters")
		},
J
Johannes Rieken 已提交
426
		'editor.acceptSuggestionOnEnter': {
427 428
			'type': 'string',
			'enum': ['on', 'smart', 'off'],
A
Alex Dima 已提交
429
			'default': EDITOR_DEFAULTS.contribInfo.acceptSuggestionOnEnter,
430
			'description': nls.localize('acceptSuggestionOnEnter', "Controls if suggestions should be accepted on 'Enter' - in addition to 'Tab'. Helps to avoid ambiguity between inserting new lines or accepting suggestions. The value 'smart' means only accept a suggestion with Enter when it makes a textual change")
431 432 433
		},
		'editor.acceptSuggestionOnCommitCharacter': {
			'type': 'boolean',
A
Alex Dima 已提交
434
			'default': EDITOR_DEFAULTS.contribInfo.acceptSuggestionOnCommitCharacter,
435
			'description': nls.localize('acceptSuggestionOnCommitCharacter', "Controls if suggestions should be accepted on commit characters. For instance in JavaScript the semi-colon (';') can be a commit character that accepts a suggestion and types that character.")
436
		},
437
		'editor.snippetSuggestions': {
438
			'type': 'string',
439
			'enum': ['top', 'bottom', 'inline', 'none'],
J
Johannes Rieken 已提交
440 441 442 443 444 445
			'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."),
			],
A
Alex Dima 已提交
446
			'default': EDITOR_DEFAULTS.contribInfo.snippetSuggestions,
447
			'description': nls.localize('snippetSuggestions', "Controls whether snippets are shown with other suggestions and how they are sorted.")
448
		},
449 450
		'editor.emptySelectionClipboard': {
			'type': 'boolean',
451
			'default': EDITOR_DEFAULTS.emptySelectionClipboard,
452 453
			'description': nls.localize('emptySelectionClipboard', "Controls whether copying without a selection copies the current line.")
		},
454
		'editor.wordBasedSuggestions': {
455
			'type': 'boolean',
A
Alex Dima 已提交
456
			'default': EDITOR_DEFAULTS.contribInfo.wordBasedSuggestions,
J
Johannes Rieken 已提交
457
			'description': nls.localize('wordBasedSuggestions', "Controls whether completions should be computed based on words in the document.")
458
		},
J
Johannes Rieken 已提交
459
		'editor.suggestFontSize': {
J
Joao Moreno 已提交
460 461 462 463 464
			'type': 'integer',
			'default': 0,
			'minimum': 0,
			'description': nls.localize('suggestFontSize', "Font size for the suggest widget")
		},
J
Johannes Rieken 已提交
465
		'editor.suggestLineHeight': {
J
Joao Moreno 已提交
466 467 468 469 470
			'type': 'integer',
			'default': 0,
			'minimum': 0,
			'description': nls.localize('suggestLineHeight', "Line height for the suggest widget")
		},
J
Johannes Rieken 已提交
471
		'editor.selectionHighlight': {
E
Erich Gamma 已提交
472
			'type': 'boolean',
A
Alex Dima 已提交
473
			'default': EDITOR_DEFAULTS.contribInfo.selectionHighlight,
E
Erich Gamma 已提交
474 475
			'description': nls.localize('selectionHighlight', "Controls whether the editor should highlight similar matches to the selection")
		},
476 477
		'editor.occurrencesHighlight': {
			'type': 'boolean',
A
Alex Dima 已提交
478
			'default': EDITOR_DEFAULTS.contribInfo.occurrencesHighlight,
479 480
			'description': nls.localize('occurrencesHighlight', "Controls whether the editor should highlight semantic symbol occurrences")
		},
J
Johannes Rieken 已提交
481
		'editor.overviewRulerLanes': {
E
Erich Gamma 已提交
482 483 484 485
			'type': 'integer',
			'default': 3,
			'description': nls.localize('overviewRulerLanes', "Controls the number of decorations that can show up at the same position in the overview ruler")
		},
486
		'editor.overviewRulerBorder': {
487
			'type': 'boolean',
A
Alex Dima 已提交
488
			'default': EDITOR_DEFAULTS.viewInfo.overviewRulerBorder,
489
			'description': nls.localize('overviewRulerBorder', "Controls if a border should be drawn around the overview ruler.")
490
		},
J
Johannes Rieken 已提交
491
		'editor.cursorBlinking': {
492
			'type': 'string',
493
			'enum': ['blink', 'smooth', 'phase', 'expand', 'solid'],
494
			'default': editorOptions.blinkingStyleToString(EDITOR_DEFAULTS.viewInfo.cursorBlinking),
495
			'description': nls.localize('cursorBlinking', "Control the cursor animation style, possible values are 'blink', 'smooth', 'phase', 'expand' and 'solid'")
496
		},
497 498
		'editor.mouseWheelZoom': {
			'type': 'boolean',
A
Alex Dima 已提交
499
			'default': EDITOR_DEFAULTS.viewInfo.mouseWheelZoom,
500 501
			'description': nls.localize('mouseWheelZoom', "Zoom the font of the editor when using mouse wheel and holding Ctrl")
		},
J
Johannes Rieken 已提交
502
		'editor.cursorStyle': {
M
markrendle 已提交
503
			'type': 'string',
504
			'enum': ['block', 'block-outline', 'line', 'line-thin', 'underline', 'underline-thin'],
505
			'default': editorOptions.cursorStyleToString(EDITOR_DEFAULTS.viewInfo.cursorStyle),
506
			'description': nls.localize('cursorStyle', "Controls the cursor style, accepted values are 'block', 'block-outline', 'line', 'line-thin', 'underline' and 'underline-thin'")
M
markrendle 已提交
507
		},
J
Johannes Rieken 已提交
508
		'editor.fontLigatures': {
509
			'type': 'boolean',
A
Alex Dima 已提交
510
			'default': EDITOR_DEFAULTS.viewInfo.fontLigatures,
511 512
			'description': nls.localize('fontLigatures', "Enables font ligatures")
		},
J
Johannes Rieken 已提交
513
		'editor.hideCursorInOverviewRuler': {
E
Erich Gamma 已提交
514
			'type': 'boolean',
A
Alex Dima 已提交
515
			'default': EDITOR_DEFAULTS.viewInfo.hideCursorInOverviewRuler,
E
Erich Gamma 已提交
516 517 518
			'description': nls.localize('hideCursorInOverviewRuler', "Controls if the cursor should be hidden in the overview ruler.")
		},
		'editor.renderWhitespace': {
519 520
			'type': 'string',
			'enum': ['none', 'boundary', 'all'],
A
Alex Dima 已提交
521
			default: EDITOR_DEFAULTS.viewInfo.renderWhitespace,
522
			description: nls.localize('renderWhitespace', "Controls how the editor should render whitespace characters, possibilities are 'none', 'boundary', and 'all'. The 'boundary' option does not render single spaces between words.")
E
Erich Gamma 已提交
523
		},
524 525
		'editor.renderControlCharacters': {
			'type': 'boolean',
A
Alex Dima 已提交
526
			default: EDITOR_DEFAULTS.viewInfo.renderControlCharacters,
527 528
			description: nls.localize('renderControlCharacters', "Controls whether the editor should render control characters")
		},
529 530
		'editor.renderIndentGuides': {
			'type': 'boolean',
A
Alex Dima 已提交
531
			default: EDITOR_DEFAULTS.viewInfo.renderIndentGuides,
532 533
			description: nls.localize('renderIndentGuides', "Controls whether the editor should render indent guides")
		},
534
		'editor.renderLineHighlight': {
535 536
			'type': 'string',
			'enum': ['none', 'gutter', 'line', 'all'],
A
Alex Dima 已提交
537
			default: EDITOR_DEFAULTS.viewInfo.renderLineHighlight,
538
			description: nls.localize('renderLineHighlight', "Controls how the editor should render the current line highlight, possibilities are 'none', 'gutter', 'line', and 'all'.")
539
		},
J
Johannes Rieken 已提交
540
		'editor.codeLens': {
E
Erich Gamma 已提交
541
			'type': 'boolean',
A
Alex Dima 已提交
542
			'default': EDITOR_DEFAULTS.contribInfo.codeLens,
543
			'description': nls.localize('codeLens', "Controls if the editor shows code lenses")
E
Erich Gamma 已提交
544
		},
J
Johannes Rieken 已提交
545
		'editor.folding': {
M
Martin Aeschlimann 已提交
546
			'type': 'boolean',
A
Alex Dima 已提交
547
			'default': EDITOR_DEFAULTS.contribInfo.folding,
548
			'description': nls.localize('folding', "Controls whether the editor has code folding enabled")
M
Martin Aeschlimann 已提交
549
		},
550 551 552 553 554
		'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.")
555
		},
556
		'editor.matchBrackets': {
557
			'type': 'boolean',
A
Alex Dima 已提交
558
			'default': EDITOR_DEFAULTS.contribInfo.matchBrackets,
559
			'description': nls.localize('matchBrackets', "Highlight matching brackets when one of them is selected.")
560
		},
I
isidor 已提交
561 562
		'editor.glyphMargin': {
			'type': 'boolean',
A
Alex Dima 已提交
563
			'default': EDITOR_DEFAULTS.viewInfo.glyphMargin,
I
isidor 已提交
564 565
			'description': nls.localize('glyphMargin', "Controls whether the editor should render the vertical glyph margin. Glyph margin is mostly used for debugging.")
		},
J
Johannes Rieken 已提交
566
		'editor.useTabStops': {
567
			'type': 'boolean',
568
			'default': EDITOR_DEFAULTS.useTabStops,
569 570
			'description': nls.localize('useTabStops', "Inserting and deleting whitespace follows tab stops")
		},
J
Johannes Rieken 已提交
571
		'editor.trimAutoWhitespace': {
572
			'type': 'boolean',
573
			'default': EDITOR_MODEL_DEFAULTS.trimAutoWhitespace,
574 575
			'description': nls.localize('trimAutoWhitespace', "Remove trailing auto inserted whitespace")
		},
J
Johannes Rieken 已提交
576
		'editor.stablePeek': {
577
			'type': 'boolean',
578
			'default': false,
579
			'description': nls.localize('stablePeek', "Keep peek editors open even when double clicking their content or when hitting Escape.")
580
		},
581
		'editor.dragAndDrop': {
582
			'type': 'boolean',
583
			'default': EDITOR_DEFAULTS.dragAndDrop,
584
			'description': nls.localize('dragAndDrop', "Controls if the editor should allow to move selections via drag and drop.")
585
		},
586 587 588 589 590 591 592 593 594 595 596
		'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.")
		},
597
		'editor.links': {
598
			'type': 'boolean',
599 600
			'default': EDITOR_DEFAULTS.contribInfo.links,
			'description': nls.localize('links', "Controls whether the editor should detect links and make them clickable")
601
		},
R
rebornix 已提交
602
		'editor.colorDecorators': {
603
			'type': 'boolean',
R
rebornix 已提交
604
			'default': EDITOR_DEFAULTS.contribInfo.colorDecorators,
605
			'description': nls.localize('colorDecorators', "Controls whether the editor should render the inline color decorators and color picker.")
606
		},
607 608 609 610 611
		'editor.lightbulb.enabled': {
			'type': 'boolean',
			'default': EDITOR_DEFAULTS.contribInfo.lightbulbEnabled,
			'description': nls.localize('codeActions', "Enables the code action lightbulb")
		},
J
Johannes Rieken 已提交
612
		'diffEditor.renderSideBySide': {
E
Erich Gamma 已提交
613 614 615 616
			'type': 'boolean',
			'default': true,
			'description': nls.localize('sideBySide', "Controls if the diff editor shows the diff side by side or inline")
		},
J
Johannes Rieken 已提交
617
		'diffEditor.ignoreTrimWhitespace': {
E
Erich Gamma 已提交
618 619 620
			'type': 'boolean',
			'default': true,
			'description': nls.localize('ignoreTrimWhitespace', "Controls if the diff editor shows changes in leading or trailing whitespace as diffs")
621 622 623 624 625
		},
		'diffEditor.renderIndicators': {
			'type': 'boolean',
			'default': true,
			'description': nls.localize('renderIndicators', "Controls if the diff editor shows +/- indicators for added/removed changes")
E
Erich Gamma 已提交
626 627
		}
	}
A
Alex Dima 已提交
628 629 630 631 632
};

if (platform.isLinux) {
	editorConfiguration['properties']['editor.selectionClipboard'] = {
		'type': 'boolean',
A
Alex Dima 已提交
633
		'default': EDITOR_DEFAULTS.contribInfo.selectionClipboard,
A
Alex Dima 已提交
634 635 636 637
		'description': nls.localize('selectionClipboard', "Controls if the Linux primary clipboard should be supported.")
	};
}

638
configurationRegistry.registerConfiguration(editorConfiguration);