From bcf9df598af438912fbc7c08652426fbce17535e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krzysztof=20Cie=C5=9Blak?= Date: Sat, 23 Sep 2017 22:47:42 +0200 Subject: [PATCH 001/158] Add editorFileExtension when clause context --- src/vs/editor/common/editorContextKeys.ts | 1 + src/vs/editor/common/modes/editorModeContext.ts | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/src/vs/editor/common/editorContextKeys.ts b/src/vs/editor/common/editorContextKeys.ts index 8843cf821d4..0aa240df5e4 100644 --- a/src/vs/editor/common/editorContextKeys.ts +++ b/src/vs/editor/common/editorContextKeys.ts @@ -28,6 +28,7 @@ export namespace EditorContextKeys { // -- mode context keys export const languageId = new RawContextKey('editorLangId', undefined); + export const fileExtension = new RawContextKey('editorFileExtension', undefined); export const hasCompletionItemProvider = new RawContextKey('editorHasCompletionItemProvider', undefined); export const hasCodeActionsProvider = new RawContextKey('editorHasCodeActionsProvider', undefined); export const hasCodeLensProvider = new RawContextKey('editorHasCodeLensProvider', undefined); diff --git a/src/vs/editor/common/modes/editorModeContext.ts b/src/vs/editor/common/modes/editorModeContext.ts index a22237cf04e..a52892edccf 100644 --- a/src/vs/editor/common/modes/editorModeContext.ts +++ b/src/vs/editor/common/modes/editorModeContext.ts @@ -16,6 +16,7 @@ export class EditorModeContext extends Disposable { private _editor: ICommonCodeEditor; private _langId: IContextKey; + private _fileExtension: IContextKey; private _hasCompletionItemProvider: IContextKey; private _hasCodeActionsProvider: IContextKey; private _hasCodeLensProvider: IContextKey; @@ -40,6 +41,7 @@ export class EditorModeContext extends Disposable { this._editor = editor; this._langId = EditorContextKeys.languageId.bindTo(contextKeyService); + this._fileExtension = EditorContextKeys.fileExtension.bindTo(contextKeyService); this._hasCompletionItemProvider = EditorContextKeys.hasCompletionItemProvider.bindTo(contextKeyService); this._hasCodeActionsProvider = EditorContextKeys.hasCodeActionsProvider.bindTo(contextKeyService); this._hasCodeLensProvider = EditorContextKeys.hasCodeLensProvider.bindTo(contextKeyService); @@ -87,6 +89,7 @@ export class EditorModeContext extends Disposable { reset() { this._langId.reset(); + this._fileExtension.reset(); this._hasCompletionItemProvider.reset(); this._hasCodeActionsProvider.reset(); this._hasCodeLensProvider.reset(); @@ -111,6 +114,7 @@ export class EditorModeContext extends Disposable { return; } this._langId.set(model.getLanguageIdentifier().language); + this._fileExtension.set(model.uri.path.split('.').pop()); this._hasCompletionItemProvider.set(modes.SuggestRegistry.has(model)); this._hasCodeActionsProvider.set(modes.CodeActionProviderRegistry.has(model)); this._hasCodeLensProvider.set(modes.CodeLensProviderRegistry.has(model)); From c5d19f539c838240e1becaacc1fcb2f9471113b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krzysztof=20Cie=C5=9Blak?= Date: Wed, 27 Sep 2017 17:23:11 +0200 Subject: [PATCH 002/158] Add extension context to ResourceContextKey --- src/vs/workbench/common/resources.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/vs/workbench/common/resources.ts b/src/vs/workbench/common/resources.ts index 34b7d02d846..67857f78e7c 100644 --- a/src/vs/workbench/common/resources.ts +++ b/src/vs/workbench/common/resources.ts @@ -23,11 +23,13 @@ export class ResourceContextKey implements IContextKey { static Filename = new RawContextKey('resourceFilename', undefined); static LangId = new RawContextKey('resourceLangId', undefined); static Resource = new RawContextKey('resource', undefined); + static Extension = new RawContextKey('resourceExtension', undefined); private _resourceKey: IContextKey; private _schemeKey: IContextKey; private _filenameKey: IContextKey; private _langIdKey: IContextKey; + private _extensionKey: IContextKey; constructor( @IContextKeyService contextKeyService: IContextKeyService, @@ -37,6 +39,7 @@ export class ResourceContextKey implements IContextKey { this._filenameKey = ResourceContextKey.Filename.bindTo(contextKeyService); this._langIdKey = ResourceContextKey.LangId.bindTo(contextKeyService); this._resourceKey = ResourceContextKey.Resource.bindTo(contextKeyService); + this._extensionKey = ResourceContextKey.Extension.bindTo(contextKeyService); } set(value: URI) { @@ -44,12 +47,14 @@ export class ResourceContextKey implements IContextKey { this._schemeKey.set(value && value.scheme); this._filenameKey.set(value && basename(value.fsPath)); this._langIdKey.set(value && this._modeService.getModeIdByFilenameOrFirstLine(value.fsPath)); + this._extensionKey.set(value && paths.extname(value.fsPath)); } reset(): void { this._schemeKey.reset(); this._langIdKey.reset(); this._resourceKey.reset(); + this._extensionKey.reset(); } public get(): URI { From e2f198edf12111251ffe94f9ad5490bda2e9928c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krzysztof=20Cie=C5=9Blak?= Date: Wed, 27 Sep 2017 17:28:30 +0200 Subject: [PATCH 003/158] Rename context and small fixes --- src/vs/editor/common/editorContextKeys.ts | 2 +- src/vs/editor/common/modes/editorModeContext.ts | 9 +++++---- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/vs/editor/common/editorContextKeys.ts b/src/vs/editor/common/editorContextKeys.ts index 0aa240df5e4..4283b4e989a 100644 --- a/src/vs/editor/common/editorContextKeys.ts +++ b/src/vs/editor/common/editorContextKeys.ts @@ -28,7 +28,7 @@ export namespace EditorContextKeys { // -- mode context keys export const languageId = new RawContextKey('editorLangId', undefined); - export const fileExtension = new RawContextKey('editorFileExtension', undefined); + export const editorExtension = new RawContextKey('editorExtension', undefined); export const hasCompletionItemProvider = new RawContextKey('editorHasCompletionItemProvider', undefined); export const hasCodeActionsProvider = new RawContextKey('editorHasCodeActionsProvider', undefined); export const hasCodeLensProvider = new RawContextKey('editorHasCodeLensProvider', undefined); diff --git a/src/vs/editor/common/modes/editorModeContext.ts b/src/vs/editor/common/modes/editorModeContext.ts index a52892edccf..b503700f9d7 100644 --- a/src/vs/editor/common/modes/editorModeContext.ts +++ b/src/vs/editor/common/modes/editorModeContext.ts @@ -10,13 +10,14 @@ import * as modes from 'vs/editor/common/modes'; import { ICommonCodeEditor } from 'vs/editor/common/editorCommon'; import { EditorContextKeys } from 'vs/editor/common/editorContextKeys'; import { Schemas } from 'vs/base/common/network'; +import * as paths from 'vs/base/common/paths'; export class EditorModeContext extends Disposable { private _editor: ICommonCodeEditor; private _langId: IContextKey; - private _fileExtension: IContextKey; + private _editorExtension: IContextKey; private _hasCompletionItemProvider: IContextKey; private _hasCodeActionsProvider: IContextKey; private _hasCodeLensProvider: IContextKey; @@ -41,7 +42,7 @@ export class EditorModeContext extends Disposable { this._editor = editor; this._langId = EditorContextKeys.languageId.bindTo(contextKeyService); - this._fileExtension = EditorContextKeys.fileExtension.bindTo(contextKeyService); + this._editorExtension = EditorContextKeys.editorExtension.bindTo(contextKeyService); this._hasCompletionItemProvider = EditorContextKeys.hasCompletionItemProvider.bindTo(contextKeyService); this._hasCodeActionsProvider = EditorContextKeys.hasCodeActionsProvider.bindTo(contextKeyService); this._hasCodeLensProvider = EditorContextKeys.hasCodeLensProvider.bindTo(contextKeyService); @@ -89,7 +90,7 @@ export class EditorModeContext extends Disposable { reset() { this._langId.reset(); - this._fileExtension.reset(); + this._editorExtension.reset(); this._hasCompletionItemProvider.reset(); this._hasCodeActionsProvider.reset(); this._hasCodeLensProvider.reset(); @@ -114,7 +115,7 @@ export class EditorModeContext extends Disposable { return; } this._langId.set(model.getLanguageIdentifier().language); - this._fileExtension.set(model.uri.path.split('.').pop()); + this._editorExtension.set(paths.extname(model.uri.fsPath)); this._hasCompletionItemProvider.set(modes.SuggestRegistry.has(model)); this._hasCodeActionsProvider.set(modes.CodeActionProviderRegistry.has(model)); this._hasCodeLensProvider.set(modes.CodeLensProviderRegistry.has(model)); From 65d45fd985e6b41fcb5900ad4cbbacb637a5e8ac Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Tue, 3 Oct 2017 16:33:51 +0200 Subject: [PATCH 004/158] wip - make IWorkbenchActionRegistry not hold any data but make it just a forwarder --- .../browser/parts/statusbar/statusbarPart.ts | 34 ++--- src/vs/workbench/common/actions.ts | 117 +++++++++--------- .../quickopen/browser/commandsHandler.ts | 40 +----- .../test/browser/actionRegistry.test.ts | 25 +--- 4 files changed, 71 insertions(+), 145 deletions(-) diff --git a/src/vs/workbench/browser/parts/statusbar/statusbarPart.ts b/src/vs/workbench/browser/parts/statusbar/statusbarPart.ts index 72bfb28604c..011fb2a1548 100644 --- a/src/vs/workbench/browser/parts/statusbar/statusbarPart.ts +++ b/src/vs/workbench/browser/parts/statusbar/statusbarPart.ts @@ -17,7 +17,6 @@ import { Registry } from 'vs/platform/registry/common/platform'; import { ICommandService } from 'vs/platform/commands/common/commands'; import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService'; import { Part } from 'vs/workbench/browser/part'; -import { IWorkbenchActionRegistry, Extensions as ActionExtensions } from 'vs/workbench/common/actions'; import { StatusbarAlignment, IStatusbarRegistry, Extensions, IStatusbarItem } from 'vs/workbench/browser/parts/statusbar/statusbar'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; @@ -287,29 +286,6 @@ class StatusBarEntryItem implements IStatusbarItem { private executeCommand(id: string, args?: any[]) { args = args || []; - // Lookup built in commands - const builtInActionDescriptor = Registry.as(ActionExtensions.WorkbenchActions).getWorkbenchAction(id); - if (builtInActionDescriptor) { - const action = this.instantiationService.createInstance(builtInActionDescriptor.syncDescriptor); - - if (action.enabled) { - /* __GDPR__ - "workbenchActionExecuted" : { - "id" : { "classification": "SystemMetaData", "purpose": "FeatureInsight" }, - "from": { "classification": "SystemMetaData", "purpose": "FeatureInsight" } - } - */ - this.telemetryService.publicLog('workbenchActionExecuted', { id: action.id, from: 'status bar' }); - (action.run() || TPromise.as(null)).done(() => { - action.dispose(); - }, (err) => this.messageService.show(Severity.Error, toErrorMessage(err))); - } else { - this.messageService.show(Severity.Warning, nls.localize('canNotRun', "Command '{0}' is currently not enabled and can not be run.", action.label || id)); - } - - return; - } - // Maintain old behaviour of always focusing the editor here const activeEditor = this.editorService.getActiveEditor(); const codeEditor = getCodeEditor(activeEditor); @@ -317,7 +293,13 @@ class StatusBarEntryItem implements IStatusbarItem { codeEditor.focus(); } - // Fallback to the command service for any other case + /* __GDPR__ + "workbenchActionExecuted" : { + "id" : { "classification": "SystemMetaData", "purpose": "FeatureInsight" }, + "from": { "classification": "SystemMetaData", "purpose": "FeatureInsight" } + } + */ + this.telemetryService.publicLog('workbenchActionExecuted', { id, from: 'status bar' }); this.commandService.executeCommand(id, ...args).done(undefined, err => this.messageService.show(Severity.Error, toErrorMessage(err))); } } @@ -355,4 +337,4 @@ registerThemingParticipant((theme: ITheme, collector: ICssStyleCollector) => { if (statusBarProminentItemHoverBackground) { collector.addRule(`.monaco-workbench > .part.statusbar > .statusbar-item a.status-bar-info:hover:not([disabled]):not(.disabled) { background-color: ${statusBarProminentItemHoverBackground}; }`); } -}); \ No newline at end of file +}); diff --git a/src/vs/workbench/common/actions.ts b/src/vs/workbench/common/actions.ts index 1bd3ba72aa6..03f1aab7ce8 100644 --- a/src/vs/workbench/common/actions.ts +++ b/src/vs/workbench/common/actions.ts @@ -5,13 +5,12 @@ 'use strict'; import { TPromise } from 'vs/base/common/winjs.base'; -import collections = require('vs/base/common/collections'); import { Registry } from 'vs/platform/registry/common/platform'; import { IAction } from 'vs/base/common/actions'; -import { KeybindingsRegistry, ICommandAndKeybindingRule } from 'vs/platform/keybinding/common/keybindingsRegistry'; +import { KeybindingsRegistry } from 'vs/platform/keybinding/common/keybindingsRegistry'; import { IPartService } from 'vs/workbench/services/part/common/partService'; -import { ICommandHandler } from 'vs/platform/commands/common/commands'; -import { SyncActionDescriptor } from 'vs/platform/actions/common/actions'; +import { ICommandHandler, CommandsRegistry } from 'vs/platform/commands/common/commands'; +import { SyncActionDescriptor, MenuRegistry, MenuId } from 'vs/platform/actions/common/actions'; import { IMessageService } from 'vs/platform/message/common/message'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; @@ -65,83 +64,87 @@ interface IActionMeta { } class WorkbenchActionRegistry implements IWorkbenchActionRegistry { - private workbenchActions: collections.IStringDictionary; - private mapActionIdToMeta: { [id: string]: IActionMeta; }; - - constructor() { - this.workbenchActions = Object.create(null); - this.mapActionIdToMeta = Object.create(null); - } public registerWorkbenchAction(descriptor: SyncActionDescriptor, alias: string, category?: string): void { - if (!this.workbenchActions[descriptor.id]) { - this.workbenchActions[descriptor.id] = descriptor; - registerWorkbenchCommandFromAction(descriptor); - - const meta: IActionMeta = { alias }; - if (typeof category === 'string') { - meta.category = category; - } - - this.mapActionIdToMeta[descriptor.id] = meta; - } + registerWorkbenchCommandFromAction(descriptor, alias, category); } public unregisterWorkbenchAction(id: string): boolean { - if (!this.workbenchActions[id]) { - return false; - } - - delete this.workbenchActions[id]; - delete this.mapActionIdToMeta[id]; - return true; } public getWorkbenchAction(id: string): SyncActionDescriptor { - return this.workbenchActions[id] || null; + return null; } public getCategory(id: string): string { - return (this.mapActionIdToMeta[id] && this.mapActionIdToMeta[id].category) || null; + const commandAction = MenuRegistry.getCommand(id); + if (!commandAction || !commandAction.category) { + return null; + } + const { category } = commandAction; + if (typeof category === 'string') { + return category; + } else { + return category.value; + } } public getAlias(id: string): string { - return (this.mapActionIdToMeta[id] && this.mapActionIdToMeta[id].alias) || null; + const commandAction = MenuRegistry.getCommand(id); + if (!commandAction) { + return null; + } + const { title } = commandAction; + if (typeof title === 'string') { + return null; + } else { + return title.original; + } } public getWorkbenchActions(): SyncActionDescriptor[] { - return collections.values(this.workbenchActions); - } - - public setWorkbenchActions(actions: SyncActionDescriptor[]): void { - this.workbenchActions = Object.create(null); - this.mapActionIdToMeta = Object.create(null); - - actions.forEach(action => this.registerWorkbenchAction(action, ''), this); + return []; } } Registry.add(Extensions.WorkbenchActions, new WorkbenchActionRegistry()); -function registerWorkbenchCommandFromAction(descriptor: SyncActionDescriptor): void { - const when = descriptor.keybindingContext; - const weight = (typeof descriptor.keybindingWeight === 'undefined' ? KeybindingsRegistry.WEIGHT.workbenchContrib() : descriptor.keybindingWeight); - const keybindings = descriptor.keybindings; +function registerWorkbenchCommandFromAction(descriptor: SyncActionDescriptor, alias: string, category?: string): void { - const desc: ICommandAndKeybindingRule = { - id: descriptor.id, - handler: createCommandHandler(descriptor), - weight: weight, - when: when, - primary: keybindings && keybindings.primary, - secondary: keybindings && keybindings.secondary, - win: keybindings && keybindings.win, - mac: keybindings && keybindings.mac, - linux: keybindings && keybindings.linux - }; + CommandsRegistry.registerCommand(descriptor.id, createCommandHandler(descriptor)); - KeybindingsRegistry.registerCommandAndKeybindingRule(desc); + { + // register keybinding + const when = descriptor.keybindingContext; + const weight = (typeof descriptor.keybindingWeight === 'undefined' ? KeybindingsRegistry.WEIGHT.workbenchContrib() : descriptor.keybindingWeight); + const keybindings = descriptor.keybindings; + KeybindingsRegistry.registerKeybindingRule({ + id: descriptor.id, + weight: weight, + when: when, + primary: keybindings && keybindings.primary, + secondary: keybindings && keybindings.secondary, + win: keybindings && keybindings.win, + mac: keybindings && keybindings.mac, + linux: keybindings && keybindings.linux + }); + } + + { + // register menu item + if (descriptor.label) { + // slightly weird if-check required because of + // https://github.com/Microsoft/vscode/blob/d28ace31aa147596e35adf101a27768a048c79ec/src/vs/workbench/parts/files/browser/fileActions.contribution.ts#L194 + MenuRegistry.appendMenuItem(MenuId.CommandPalette, { + command: { + id: descriptor.id, + title: { value: descriptor.label, original: alias }, + category + } + }); + } + } } function createCommandHandler(descriptor: SyncActionDescriptor): ICommandHandler { @@ -193,4 +196,4 @@ function triggerAndDisposeAction(instantitationService: IInstantiationService, t return TPromise.wrapError(err); } }); -} \ No newline at end of file +} diff --git a/src/vs/workbench/parts/quickopen/browser/commandsHandler.ts b/src/vs/workbench/parts/quickopen/browser/commandsHandler.ts index d366f705447..f5e99434096 100644 --- a/src/vs/workbench/parts/quickopen/browser/commandsHandler.ts +++ b/src/vs/workbench/parts/quickopen/browser/commandsHandler.ts @@ -16,8 +16,6 @@ import { Mode, IEntryRunContext, IAutoFocus, IModel, IQuickNavigateConfiguration import { QuickOpenEntryGroup, IHighlight, QuickOpenModel, QuickOpenEntry } from 'vs/base/parts/quickopen/browser/quickOpenModel'; import { SyncActionDescriptor, IMenuService, MenuId, MenuItemAction } from 'vs/platform/actions/common/actions'; import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; -import { IWorkbenchActionRegistry, Extensions as ActionExtensions } from 'vs/workbench/common/actions'; -import { Registry } from 'vs/platform/registry/common/platform'; import { QuickOpenHandler, IWorkbenchQuickOpenConfiguration } from 'vs/workbench/browser/quickopen'; import { IEditorAction, IEditor, ICommonCodeEditor } from 'vs/editor/common/editorCommon'; import { matchesWords, matchesPrefix, matchesContiguousSubString, or } from 'vs/base/common/filters'; @@ -418,11 +416,6 @@ export class CommandsHandler extends QuickOpenHandler { searchValue = searchValue.trim(); this.lastSearchValue = searchValue; - // Workbench Actions - let workbenchEntries: CommandEntry[] = []; - const workbenchActions = Registry.as(ActionExtensions.WorkbenchActions).getWorkbenchActions(); - workbenchEntries = this.actionDescriptorsToEntries(workbenchActions, searchValue); - // Editor Actions const activeEditor = this.editorService.getActiveEditor(); const activeEditorControl = activeEditor ? activeEditor.getControl() : null; @@ -443,7 +436,7 @@ export class CommandsHandler extends QuickOpenHandler { const commandEntries = this.menuItemActionsToEntries(menuActions, searchValue); // Concat - let entries = [...workbenchEntries, ...editorEntries, ...commandEntries]; + let entries = [...editorEntries, ...commandEntries]; // Remove duplicates entries = arrays.distinct(entries, entry => `${entry.getLabel()}${entry.getGroupLabel()}${entry.getCommandId()}`); @@ -498,35 +491,6 @@ export class CommandsHandler extends QuickOpenHandler { return TPromise.as(new QuickOpenModel(entries)); } - private actionDescriptorsToEntries(actionDescriptors: SyncActionDescriptor[], searchValue: string): CommandEntry[] { - const entries: CommandEntry[] = []; - const registry = Registry.as(ActionExtensions.WorkbenchActions); - - for (let i = 0; i < actionDescriptors.length; i++) { - const actionDescriptor = actionDescriptors[i]; - if (actionDescriptor.label) { - - // Label (with optional category) - let label = actionDescriptor.label; - const category = registry.getCategory(actionDescriptor.id); - if (category) { - label = nls.localize('commandLabel', "{0}: {1}", category, label); - } - - // Alias for non default languages - const alias = (language !== LANGUAGE_DEFAULT) ? registry.getAlias(actionDescriptor.id) : null; - const labelHighlights = wordFilter(searchValue, label); - const aliasHighlights = alias ? wordFilter(searchValue, alias) : null; - - if (labelHighlights || aliasHighlights) { - entries.push(this.instantiationService.createInstance(CommandEntry, actionDescriptor.id, this.keybindingService.lookupKeybinding(actionDescriptor.id), label, alias, { label: labelHighlights, alias: aliasHighlights }, actionDescriptor, (id: string) => this.onBeforeRunCommand(id))); - } - } - } - - return entries; - } - private editorActionsToEntries(actions: IEditorAction[], searchValue: string): EditorActionCommandEntry[] { const entries: EditorActionCommandEntry[] = []; @@ -621,4 +585,4 @@ export class CommandsHandler extends QuickOpenHandler { lastCommandPaletteInput = void 0; // clear last input when user canceled quick open } } -} \ No newline at end of file +} diff --git a/src/vs/workbench/test/browser/actionRegistry.test.ts b/src/vs/workbench/test/browser/actionRegistry.test.ts index b990f175019..97a62c5cc7f 100644 --- a/src/vs/workbench/test/browser/actionRegistry.test.ts +++ b/src/vs/workbench/test/browser/actionRegistry.test.ts @@ -6,10 +6,7 @@ 'use strict'; import * as assert from 'assert'; -import * as Platform from 'vs/platform/registry/common/platform'; -import { SyncActionDescriptor } from 'vs/platform/actions/common/actions'; import { Separator } from 'vs/base/browser/ui/actionbar/actionbar'; -import { Extensions, IWorkbenchActionRegistry } from 'vs/workbench/common/actions'; import { prepareActions } from 'vs/workbench/browser/actions'; import { Action } from 'vs/base/common/actions'; @@ -22,26 +19,6 @@ class MyClass extends Action { suite('Workbench Action Registry', () => { - test('Workbench Action Registration', function () { - let Registry = Platform.Registry.as(Extensions.WorkbenchActions); - - let d = new SyncActionDescriptor(MyClass, 'id', 'name'); - - let oldActions = Registry.getWorkbenchActions().slice(0); - let oldCount = Registry.getWorkbenchActions().length; - - Registry.registerWorkbenchAction(d, 'My Alias', 'category'); - Registry.registerWorkbenchAction(d, null); - - assert.equal(Registry.getWorkbenchActions().length, 1 + oldCount); - assert.strictEqual(d, Registry.getWorkbenchAction('id')); - - assert.deepEqual(Registry.getAlias(d.id), 'My Alias'); - assert.equal(Registry.getCategory(d.id), 'category'); - - (Registry).setWorkbenchActions(oldActions); - }); - test('Workbench Action Bar prepareActions()', function () { let a1 = new Separator(); let a2 = new Separator(); @@ -57,4 +34,4 @@ suite('Workbench Action Registry', () => { assert(actions[1] === a5); assert(actions[2] === a6); }); -}); \ No newline at end of file +}); From e073e848d75642cd370a75dd7c481eaeef318caf Mon Sep 17 00:00:00 2001 From: Julian Andres Klode Date: Tue, 3 Oct 2017 18:42:17 +0200 Subject: [PATCH 005/158] Correctly get apt dirs in debian postinst This previously used some crazy hack to parse the output of `apt-config dump`, instead of using `apt-config shell` like you are supposed to do. --- resources/linux/debian/postinst.template | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/resources/linux/debian/postinst.template b/resources/linux/debian/postinst.template index 6bb1edc7a4d..c4fbfcac16e 100755 --- a/resources/linux/debian/postinst.template +++ b/resources/linux/debian/postinst.template @@ -24,17 +24,11 @@ if [ "@@NAME@@" != "code-oss" ]; then fi # Register apt repository - get_apt_config_value() { - echo $(apt-config dump | grep "$1 " | sed -e "s/$1 \"//" -e "s/\";$//") - } + eval $(apt-config shell APT_SOURCE_PARTS Dir::Etc::sourceparts/d) + CODE_SOURCE_PART=${APT_SOURCE_PARTS}vscode.list - APT_DIR=$(get_apt_config_value Dir) - APT_ETC=$APT_DIR$(get_apt_config_value Dir::Etc) - APT_SOURCE_PARTS=$APT_ETC/$(get_apt_config_value Dir::Etc::sourceparts) - CODE_SOURCE_PART=$APT_SOURCE_PARTS/vscode.list - - APT_TRUSTED_PARTS=$APT_ETC/$(get_apt_config_value Dir::Etc::trustedparts) - CODE_TRUSTED_PART=$APT_TRUSTED_PARTS/microsoft.gpg + eval $(apt-config shell APT_TRUSTED_PARTS Dir::Etc::trustedparts/d) + CODE_TRUSTED_PART=${APT_TRUSTED_PARTS}microsoft.gpg # Sourced from https://packages.microsoft.com/keys/microsoft.asc if [ ! -f $CODE_TRUSTED_PART ]; then From 54a46c8546a8c28752a375eb528ecb98722ec3f7 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Wed, 4 Oct 2017 11:49:45 +0200 Subject: [PATCH 006/158] make the registry be just a forwarder --- src/vs/platform/actions/common/actions.ts | 2 +- src/vs/workbench/common/actions.ts | 212 +++++++----------- .../common/keybindingsEditorModel.ts | 21 +- 3 files changed, 82 insertions(+), 153 deletions(-) diff --git a/src/vs/platform/actions/common/actions.ts b/src/vs/platform/actions/common/actions.ts index 0b5586ace11..0ebbab71551 100644 --- a/src/vs/platform/actions/common/actions.ts +++ b/src/vs/platform/actions/common/actions.ts @@ -87,7 +87,7 @@ export interface IMenuRegistry { getMenuItems(loc: MenuId): IMenuItem[]; } -export const MenuRegistry: IMenuRegistry = new class { +export const MenuRegistry: IMenuRegistry = new class implements IMenuRegistry { private _commands: { [id: string]: ICommandAction } = Object.create(null); diff --git a/src/vs/workbench/common/actions.ts b/src/vs/workbench/common/actions.ts index 03f1aab7ce8..24c2ad3b901 100644 --- a/src/vs/workbench/common/actions.ts +++ b/src/vs/workbench/common/actions.ts @@ -15,6 +15,7 @@ import { IMessageService } from 'vs/platform/message/common/message'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import Severity from 'vs/base/common/severity'; +import { IDisposable, combinedDisposable } from 'vs/base/common/lifecycle'; export const Extensions = { WorkbenchActions: 'workbench.contributions.actions' @@ -30,92 +31,22 @@ export interface IWorkbenchActionRegistry { * Registers a workbench action to the platform. Workbench actions are not * visible by default and can only be invoked through a keybinding if provided. */ - registerWorkbenchAction(descriptor: SyncActionDescriptor, alias: string, category?: string): void; - - /** - * Unregisters a workbench action from the platform. - */ - unregisterWorkbenchAction(id: string): boolean; - - /** - * Returns the workbench action descriptor for the given id or null if none. - */ - getWorkbenchAction(id: string): SyncActionDescriptor; - - /** - * Returns an array of registered workbench actions known to the platform. - */ - getWorkbenchActions(): SyncActionDescriptor[]; - - /** - * Returns the alias associated with the given action or null if none. - */ - getAlias(actionId: string): string; - - /** - * Returns the category for the given action or null if none. - */ - getCategory(actionId: string): string; + registerWorkbenchAction(descriptor: SyncActionDescriptor, alias: string, category?: string): IDisposable; } -interface IActionMeta { - alias: string; - category?: string; -} +Registry.add(Extensions.WorkbenchActions, new class implements IWorkbenchActionRegistry { -class WorkbenchActionRegistry implements IWorkbenchActionRegistry { - - public registerWorkbenchAction(descriptor: SyncActionDescriptor, alias: string, category?: string): void { - registerWorkbenchCommandFromAction(descriptor, alias, category); + registerWorkbenchAction(descriptor: SyncActionDescriptor, alias: string, category?: string): IDisposable { + return this._registerWorkbenchCommandFromAction(descriptor, alias, category); } - public unregisterWorkbenchAction(id: string): boolean { - return true; - } + private _registerWorkbenchCommandFromAction(descriptor: SyncActionDescriptor, alias: string, category?: string): IDisposable { + let registrations: IDisposable[] = []; - public getWorkbenchAction(id: string): SyncActionDescriptor { - return null; - } + // command + registrations.push(CommandsRegistry.registerCommand(descriptor.id, this._createCommandHandler(descriptor))); - public getCategory(id: string): string { - const commandAction = MenuRegistry.getCommand(id); - if (!commandAction || !commandAction.category) { - return null; - } - const { category } = commandAction; - if (typeof category === 'string') { - return category; - } else { - return category.value; - } - } - - public getAlias(id: string): string { - const commandAction = MenuRegistry.getCommand(id); - if (!commandAction) { - return null; - } - const { title } = commandAction; - if (typeof title === 'string') { - return null; - } else { - return title.original; - } - } - - public getWorkbenchActions(): SyncActionDescriptor[] { - return []; - } -} - -Registry.add(Extensions.WorkbenchActions, new WorkbenchActionRegistry()); - -function registerWorkbenchCommandFromAction(descriptor: SyncActionDescriptor, alias: string, category?: string): void { - - CommandsRegistry.registerCommand(descriptor.id, createCommandHandler(descriptor)); - - { - // register keybinding + // keybinding const when = descriptor.keybindingContext; const weight = (typeof descriptor.keybindingWeight === 'undefined' ? KeybindingsRegistry.WEIGHT.workbenchContrib() : descriptor.keybindingWeight); const keybindings = descriptor.keybindings; @@ -129,71 +60,78 @@ function registerWorkbenchCommandFromAction(descriptor: SyncActionDescriptor, al mac: keybindings && keybindings.mac, linux: keybindings && keybindings.linux }); - } - { - // register menu item + // menu item + // TODO@Ben slightly weird if-check required because of + // https://github.com/Microsoft/vscode/blob/d28ace31aa147596e35adf101a27768a048c79ec/src/vs/workbench/parts/files/browser/fileActions.contribution.ts#L194 if (descriptor.label) { - // slightly weird if-check required because of - // https://github.com/Microsoft/vscode/blob/d28ace31aa147596e35adf101a27768a048c79ec/src/vs/workbench/parts/files/browser/fileActions.contribution.ts#L194 - MenuRegistry.appendMenuItem(MenuId.CommandPalette, { - command: { - id: descriptor.id, - title: { value: descriptor.label, original: alias }, - category - } - }); + + const command = { + id: descriptor.id, + title: { value: descriptor.label, original: alias }, + category + }; + + MenuRegistry.addCommand(command); + + registrations.push(MenuRegistry.appendMenuItem(MenuId.CommandPalette, { command })); } - } -} -function createCommandHandler(descriptor: SyncActionDescriptor): ICommandHandler { - return (accessor, args) => { - const messageService = accessor.get(IMessageService); - const instantiationService = accessor.get(IInstantiationService); - const telemetryService = accessor.get(ITelemetryService); - const partService = accessor.get(IPartService); - - TPromise.as(triggerAndDisposeAction(instantiationService, telemetryService, partService, descriptor, args)).done(null, (err) => { - messageService.show(Severity.Error, err); - }); - }; -} - -function triggerAndDisposeAction(instantitationService: IInstantiationService, telemetryService: ITelemetryService, partService: IPartService, descriptor: SyncActionDescriptor, args: any): TPromise { - const actionInstance = instantitationService.createInstance(descriptor.syncDescriptor); - actionInstance.label = descriptor.label || actionInstance.label; - - // don't run the action when not enabled - if (!actionInstance.enabled) { - actionInstance.dispose(); - - return void 0; + // TODO@alex,joh + // support removal of keybinding rule + // support removal of command-ui + return combinedDisposable(registrations); } - const from = args && args.from || 'keybinding'; - if (telemetryService) { - /* __GDPR__ - "workbenchActionExecuted" : { - "id" : { "classification": "SystemMetaData", "purpose": "FeatureInsight" }, - "from": { "classification": "SystemMetaData", "purpose": "FeatureInsight" } - } - */ - telemetryService.publicLog('workbenchActionExecuted', { id: actionInstance.id, from }); + private _createCommandHandler(descriptor: SyncActionDescriptor): ICommandHandler { + return (accessor, args) => { + const messageService = accessor.get(IMessageService); + const instantiationService = accessor.get(IInstantiationService); + const telemetryService = accessor.get(ITelemetryService); + const partService = accessor.get(IPartService); + + TPromise.as(this._triggerAndDisposeAction(instantiationService, telemetryService, partService, descriptor, args)).done(null, (err) => { + messageService.show(Severity.Error, err); + }); + }; } - // run action when workbench is created - return partService.joinCreation().then(() => { - try { - return TPromise.as(actionInstance.run(undefined, { from })).then(() => { - actionInstance.dispose(); - }, (err) => { + private _triggerAndDisposeAction(instantitationService: IInstantiationService, telemetryService: ITelemetryService, partService: IPartService, descriptor: SyncActionDescriptor, args: any): TPromise { + const actionInstance = instantitationService.createInstance(descriptor.syncDescriptor); + actionInstance.label = descriptor.label || actionInstance.label; + + // don't run the action when not enabled + if (!actionInstance.enabled) { + actionInstance.dispose(); + + return void 0; + } + + const from = args && args.from || 'keybinding'; + if (telemetryService) { + /* __GDPR__ + "workbenchActionExecuted" : { + "id" : { "classification": "SystemMetaData", "purpose": "FeatureInsight" }, + "from": { "classification": "SystemMetaData", "purpose": "FeatureInsight" } + } + */ + telemetryService.publicLog('workbenchActionExecuted', { id: actionInstance.id, from }); + } + + // run action when workbench is created + return partService.joinCreation().then(() => { + try { + return TPromise.as(actionInstance.run(undefined, { from })).then(() => { + actionInstance.dispose(); + }, (err) => { + actionInstance.dispose(); + return TPromise.wrapError(err); + }); + } catch (err) { actionInstance.dispose(); return TPromise.wrapError(err); - }); - } catch (err) { - actionInstance.dispose(); - return TPromise.wrapError(err); - } - }); -} + } + }); + } +}); + diff --git a/src/vs/workbench/parts/preferences/common/keybindingsEditorModel.ts b/src/vs/workbench/parts/preferences/common/keybindingsEditorModel.ts index 9fcc3bdf489..8549fbdd25a 100644 --- a/src/vs/workbench/parts/preferences/common/keybindingsEditorModel.ts +++ b/src/vs/workbench/parts/preferences/common/keybindingsEditorModel.ts @@ -13,7 +13,7 @@ import { Registry } from 'vs/platform/registry/common/platform'; import { ResolvedKeybinding, ResolvedKeybindingPart } from 'vs/base/common/keyCodes'; import { AriaLabelProvider, UserSettingsLabelProvider, UILabelProvider, ModifierLabels as ModLabels } from 'vs/base/common/keybindingLabels'; import { CommonEditorRegistry, EditorAction } from 'vs/editor/common/editorCommonExtensions'; -import { MenuRegistry, ILocalizedString, SyncActionDescriptor, ICommandAction } from 'vs/platform/actions/common/actions'; +import { MenuRegistry, ILocalizedString, ICommandAction } from 'vs/platform/actions/common/actions'; import { IWorkbenchActionRegistry, Extensions as ActionExtensions } from 'vs/workbench/common/actions'; import { EditorModel } from 'vs/workbench/common/editor'; import { IExtensionService } from 'vs/platform/extensions/common/extensions'; @@ -200,26 +200,21 @@ export class KeybindingsEditorModel extends EditorModel { } private static toKeybindingEntry(command: string, keybindingItem: ResolvedKeybindingItem, workbenchActionsRegistry: IWorkbenchActionRegistry, editorActions: {}): IKeybindingItem { - const workbenchAction = workbenchActionsRegistry.getWorkbenchAction(command); const menuCommand = MenuRegistry.getCommand(command); const editorAction: EditorAction = editorActions[command]; return { keybinding: keybindingItem.resolvedKeybinding, keybindingItem, command, - commandLabel: KeybindingsEditorModel.getCommandLabel(workbenchAction, menuCommand, editorAction), - commandDefaultLabel: KeybindingsEditorModel.getCommandDefaultLabel(workbenchAction, menuCommand, workbenchActionsRegistry), + commandLabel: KeybindingsEditorModel.getCommandLabel(menuCommand, editorAction), + commandDefaultLabel: KeybindingsEditorModel.getCommandDefaultLabel(menuCommand, workbenchActionsRegistry), when: keybindingItem.when ? keybindingItem.when.serialize() : '', source: keybindingItem.isDefault ? localize('default', "Default") : localize('user', "User") }; } - private static getCommandDefaultLabel(workbenchAction: SyncActionDescriptor, menuCommand: ICommandAction, workbenchActionsRegistry: IWorkbenchActionRegistry): string { + private static getCommandDefaultLabel(menuCommand: ICommandAction, workbenchActionsRegistry: IWorkbenchActionRegistry): string { if (language !== LANGUAGE_DEFAULT) { - if (workbenchAction) { - return workbenchActionsRegistry.getAlias(workbenchAction.id); - } - if (menuCommand && menuCommand.title && (menuCommand.title).original) { return (menuCommand.title).original; } @@ -227,11 +222,7 @@ export class KeybindingsEditorModel extends EditorModel { return null; } - private static getCommandLabel(workbenchAction: SyncActionDescriptor, menuCommand: ICommandAction, editorAction: EditorAction): string { - if (workbenchAction) { - return workbenchAction.label; - } - + private static getCommandLabel(menuCommand: ICommandAction, editorAction: EditorAction): string { if (menuCommand) { return typeof menuCommand.title === 'string' ? menuCommand.title : menuCommand.title.value; } @@ -560,4 +551,4 @@ class KeybindingItemMatches { } return false; } -} \ No newline at end of file +} From ef662a91c982b6eba0191974abe8ecf9f9500c39 Mon Sep 17 00:00:00 2001 From: isidor Date: Wed, 4 Oct 2017 15:00:02 +0200 Subject: [PATCH 007/158] polish empty view --- .../parts/files/browser/views/emptyView.ts | 31 ++++++++++++------- 1 file changed, 20 insertions(+), 11 deletions(-) diff --git a/src/vs/workbench/parts/files/browser/views/emptyView.ts b/src/vs/workbench/parts/files/browser/views/emptyView.ts index ff5173905ab..6a577a40ad3 100644 --- a/src/vs/workbench/parts/files/browser/views/emptyView.ts +++ b/src/vs/workbench/parts/files/browser/views/emptyView.ts @@ -11,7 +11,7 @@ import DOM = require('vs/base/browser/dom'); import { TPromise } from 'vs/base/common/winjs.base'; import { IAction } from 'vs/base/common/actions'; import { Button } from 'vs/base/browser/ui/button/button'; -import { $ } from 'vs/base/browser/builder'; +import { $, Builder } from 'vs/base/browser/builder'; import { IActionItem } from 'vs/base/browser/ui/actionbar/actionbar'; import { ViewsViewletPanel, IViewletViewOptions, IViewOptions } from 'vs/workbench/browser/parts/views/viewsViewlet'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; @@ -28,6 +28,8 @@ export class EmptyView extends ViewsViewletPanel { public static NAME = nls.localize('noWorkspace', "No Folder Opened"); private button: Button; + private messageDiv: Builder; + private titleDiv: Builder; constructor( options: IViewletViewOptions, @@ -38,20 +40,17 @@ export class EmptyView extends ViewsViewletPanel { @IWorkspaceContextService private contextService: IWorkspaceContextService ) { super({ ...(options as IViewOptions), ariaHeaderLabel: nls.localize('explorerSection', "Files Explorer Section") }, keybindingService, contextMenuService); - this.contextService.onDidChangeWorkbenchState(() => this.setButtonLabel()); + this.contextService.onDidChangeWorkbenchState(() => this.setLabels()); } public renderHeader(container: HTMLElement): void { - let titleDiv = $('div.title').appendTo(container); - const name = this.contextService.getWorkbenchState() === WorkbenchState.WORKSPACE ? this.contextService.getWorkspace().name : this.name; - $('span').text(name).appendTo(titleDiv); + this.titleDiv = $('span').text(name).appendTo($('div.title').appendTo(container)); } protected renderBody(container: HTMLElement): void { DOM.addClass(container, 'explorer-empty-view'); - let titleDiv = $('div.section').appendTo(container); - $('p').text(nls.localize('noWorkspaceHelp', "You have not yet opened a folder.")).appendTo(titleDiv); + this.messageDiv = $('p').appendTo($('div.section').appendTo(container)); let section = $('div.section').appendTo(container); @@ -67,12 +66,22 @@ export class EmptyView extends ViewsViewletPanel { errors.onUnexpectedError(err); }); }); - this.setButtonLabel(); + this.setLabels(); } - private setButtonLabel(): void { - if (this.button) { - this.button.label = this.contextService.getWorkbenchState() === WorkbenchState.WORKSPACE ? nls.localize('addFolder', "Add Folder") : nls.localize('openFolder', "Open Folder"); + private setLabels(): void { + if (this.contextService.getWorkbenchState() === WorkbenchState.WORKSPACE) { + this.messageDiv.text(nls.localize('noWorkspaceHelp', "You have not yet added a folder to the workspace.")); + if (this.button) { + this.button.label = nls.localize('addFolder', "Add Folder"); + } + this.titleDiv.text(this.contextService.getWorkspace().name); + } else { + this.messageDiv.text(nls.localize('noFolderHelp', "You have not yet opened a folder.")); + if (this.button) { + this.button.label = nls.localize('openFolder', "Open Folder"); + } + this.titleDiv.text(this.name); } } From 971d7b642f2a33fd0981f093c4484868fe0a6cfa Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Wed, 4 Oct 2017 15:01:15 +0200 Subject: [PATCH 008/158] fix tests --- extensions/vscode-api-tests/src/workspace.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/vscode-api-tests/src/workspace.test.ts b/extensions/vscode-api-tests/src/workspace.test.ts index 77592f788cf..c636a176e25 100644 --- a/extensions/vscode-api-tests/src/workspace.test.ts +++ b/extensions/vscode-api-tests/src/workspace.test.ts @@ -483,7 +483,7 @@ suite('workspace-namespace', () => { assert.equal(res.length, 1); assert.equal(basename(vscode.workspace.asRelativePath(res[0])), 'far.js'); }); - }).timeout(60 * 1000); // Increase timeout for search-based test + }); // TODO@Joh this test fails randomly // test('findFiles, cancellation', () => { From 9b7a6b6fb9f0f57ed5dd19c9626e3416875b7b46 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 4 Oct 2017 15:00:57 +0200 Subject: [PATCH 009/158] fixes #35513 --- extensions/git/src/git.ts | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/extensions/git/src/git.ts b/extensions/git/src/git.ts index e445f643451..13f4935224c 100644 --- a/extensions/git/src/git.ts +++ b/extensions/git/src/git.ts @@ -174,7 +174,13 @@ function cpErrorHandler(cb: (reason?: any) => void): (reason?: any) => void { }; } -async function exec(child: cp.ChildProcess, options: any = {}): Promise { +interface SpawnOptions extends cp.SpawnOptions { + input?: string; + encoding?: string; + log?: boolean; +} + +async function exec(child: cp.ChildProcess, options: SpawnOptions = {}): Promise { if (!child.stdout || !child.stderr) { throw new GitError({ message: 'Failed to get stdout or stderr from git process.' @@ -365,17 +371,17 @@ export class Git { return path.normalize(result.stdout.trim()); } - async exec(cwd: string, args: string[], options: any = {}): Promise { + async exec(cwd: string, args: string[], options: SpawnOptions = {}): Promise { options = assign({ cwd }, options || {}); return await this._exec(args, options); } - stream(cwd: string, args: string[], options: any = {}): cp.ChildProcess { + stream(cwd: string, args: string[], options: SpawnOptions = {}): cp.ChildProcess { options = assign({ cwd }, options || {}); return this.spawn(args, options); } - private async _exec(args: string[], options: any = {}): Promise { + private async _exec(args: string[], options: SpawnOptions = {}): Promise { const child = this.spawn(args, options); if (options.input) { @@ -402,7 +408,7 @@ export class Git { return result; } - spawn(args: string[], options: any = {}): cp.ChildProcess { + spawn(args: string[], options: SpawnOptions = {}): cp.ChildProcess { if (!this.gitPath) { throw new Error('git could not be found in the system.'); } @@ -520,19 +526,19 @@ export class Repository { } // TODO@Joao: rename to exec - async run(args: string[], options: any = {}): Promise { + async run(args: string[], options: SpawnOptions = {}): Promise { return await this.git.exec(this.repositoryRoot, args, options); } - stream(args: string[], options: any = {}): cp.ChildProcess { + stream(args: string[], options: SpawnOptions = {}): cp.ChildProcess { return this.git.stream(this.repositoryRoot, args, options); } - spawn(args: string[], options: any = {}): cp.ChildProcess { + spawn(args: string[], options: SpawnOptions = {}): cp.ChildProcess { return this.git.spawn(args, options); } - async config(scope: string, key: string, value: any, options: any): Promise { + async config(scope: string, key: string, value: any, options: SpawnOptions): Promise { const args = ['config']; if (scope) { @@ -898,7 +904,8 @@ export class Repository { getStatus(limit = 5000): Promise<{ status: IFileStatus[]; didHitLimit: boolean; }> { return new Promise<{ status: IFileStatus[]; didHitLimit: boolean; }>((c, e) => { const parser = new GitStatusParser(); - const child = this.stream(['status', '-z', '-u']); + const env = { GIT_OPTIONAL_LOCKS: '0' }; + const child = this.stream(['status', '-z', '-u'], { env }); const onExit = exitCode => { if (exitCode !== 0) { From aaf3c31b6fbfcf2277d518b382527196a3d12fc7 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Wed, 4 Oct 2017 14:54:33 +0200 Subject: [PATCH 010/158] remove commented code --- test/smoke/src/spectron/application.ts | 20 -------------------- 1 file changed, 20 deletions(-) diff --git a/test/smoke/src/spectron/application.ts b/test/smoke/src/spectron/application.ts index 166e014462c..3003ad88773 100644 --- a/test/smoke/src/spectron/application.ts +++ b/test/smoke/src/spectron/application.ts @@ -158,26 +158,6 @@ export class SpectronApplication { this._workbench = new Workbench(this); } - /* private async setUpUserDataDirectory(): Promise { - const userDataDir = path.join(this._userDir, String(SpectronApplication.count++)); - - return new Promise((c, e) => { - const settingsDir = path.join(userDataDir, 'User'); - mkdirp(path.join(userDataDir, 'User'), (error => { - if (error) { - e(error); - return; - } - try { - fs.writeFileSync(path.join(settingsDir, 'settings.json'), `{\n "telemetry.enableTelemetry": false\n }`); - c(userDataDir); - } catch (error) { - e(error); - } - })); - }); - } */ - private async checkWindowReady(): Promise { await this.webclient.waitUntilWindowLoaded(); // Spectron opens multiple terminals in Windows platform From 1d080314efd2967b5bb3cf48453b89b5d61c8690 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Wed, 4 Oct 2017 15:07:35 +0200 Subject: [PATCH 011/158] Smoke tests: take wait time as argument --- test/smoke/src/main.ts | 3 ++- test/smoke/src/spectron/application.ts | 1 + test/smoke/src/spectron/client.ts | 5 +++-- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/test/smoke/src/main.ts b/test/smoke/src/main.ts index 0c340e52f52..31dbaf71149 100644 --- a/test/smoke/src/main.ts +++ b/test/smoke/src/main.ts @@ -17,7 +17,7 @@ const testDataPath = tmpDir.name; process.once('exit', () => rimraf.sync(testDataPath)); const [, , ...args] = process.argv; -const opts = minimist(args, { string: ['build', 'stable-build', 'screenshots'] }); +const opts = minimist(args, { string: ['build', 'stable-build', 'screenshots', 'wait-time'] }); opts.screenshots = opts.screenshots === '' ? path.join(testDataPath, 'screenshots') : opts.screenshots; @@ -99,6 +99,7 @@ process.env.SMOKETEST_REPO = testRepoLocalDir; process.env.VSCODE_WORKSPACE_PATH = workspacePath; process.env.VSCODE_KEYBINDINGS_PATH = keybindingsPath; process.env.SCREENSHOTS_DIR = opts.screenshots || ''; +process.env.WAIT_TIME = opts['wait-time'] || '20'; if (process.env.VSCODE_DEV === '1') { process.env.VSCODE_EDITION = 'dev'; diff --git a/test/smoke/src/spectron/application.ts b/test/smoke/src/spectron/application.ts index 3003ad88773..77ef6fd4207 100644 --- a/test/smoke/src/spectron/application.ts +++ b/test/smoke/src/spectron/application.ts @@ -20,6 +20,7 @@ export const USER_DIR = process.env.VSCODE_USER_DIR as string; export const EXTENSIONS_DIR = process.env.VSCODE_EXTENSIONS_DIR as string; export const VSCODE_EDITION = process.env.VSCODE_EDITION as string; export const SCREENSHOTS_DIR = process.env.SCREENSHOTS_DIR as string; +export const WAIT_TIME = parseInt(process.env.WAIT_TIME as string); export enum VSCODE_BUILD { DEV, diff --git a/test/smoke/src/spectron/client.ts b/test/smoke/src/spectron/client.ts index 7450ff9375b..66c32d1794d 100644 --- a/test/smoke/src/spectron/client.ts +++ b/test/smoke/src/spectron/client.ts @@ -5,7 +5,7 @@ import { Application } from 'spectron'; import { RawResult, Element } from 'webdriverio'; -import { SpectronApplication } from './application'; +import { SpectronApplication, WAIT_TIME } from './application'; /** * Abstracts the Spectron's WebdriverIO managed client property on the created Application instances. @@ -14,10 +14,11 @@ export class SpectronClient { // waitFor calls should not take more than 200 * 100 = 20 seconds to complete, excluding // the time it takes for the actual retry call to complete - private readonly retryCount = 200; + private readonly retryCount; private readonly retryDuration = 100; // in milliseconds constructor(public spectron: Application, private application: SpectronApplication) { + this.retryCount = (WAIT_TIME * 1000) / this.retryDuration; } public windowByIndex(index: number): Promise { From 6d8cbf8582fc9a95c3b51cc35c5a4be42c2ccd5a Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Wed, 4 Oct 2017 15:10:03 +0200 Subject: [PATCH 012/158] fixes #8826 --- src/vs/platform/editor/common/editor.ts | 8 ++++++ .../browser/parts/editor/textEditor.ts | 4 +-- .../parts/quickopen/quickOpenController.ts | 4 +-- src/vs/workbench/common/editor.ts | 26 ++++++------------- .../common/editor/editorStacksModel.ts | 2 +- .../common/editor/rangeDecorations.ts | 4 +-- .../parts/files/browser/fileActions.ts | 5 ++-- .../files/common/editors/fileEditorTracker.ts | 4 +-- .../parts/markers/browser/markersPanel.ts | 4 +-- .../preferences/browser/preferencesEditor.ts | 10 +++---- .../parts/search/browser/searchActions.ts | 4 +-- .../services/history/browser/history.ts | 8 +++--- 12 files changed, 41 insertions(+), 42 deletions(-) diff --git a/src/vs/platform/editor/common/editor.ts b/src/vs/platform/editor/common/editor.ts index a56c92b823f..be03bb99677 100644 --- a/src/vs/platform/editor/common/editor.ts +++ b/src/vs/platform/editor/common/editor.ts @@ -194,8 +194,16 @@ export enum Verbosity { export interface IEditorInput extends IDisposable { + /** + * Triggered when this input is disposed. + */ onDispose: Event; + /** + * Returns the associated resource of this input. + */ + getResource(): URI; + /** * Returns the display name of this input. */ diff --git a/src/vs/workbench/browser/parts/editor/textEditor.ts b/src/vs/workbench/browser/parts/editor/textEditor.ts index fb907cfd550..b70eced071c 100644 --- a/src/vs/workbench/browser/parts/editor/textEditor.ts +++ b/src/vs/workbench/browser/parts/editor/textEditor.ts @@ -14,7 +14,7 @@ import types = require('vs/base/common/types'); import errors = require('vs/base/common/errors'); import DOM = require('vs/base/browser/dom'); import { CodeEditor } from 'vs/editor/browser/codeEditor'; -import { EditorInput, EditorOptions, toResource } from 'vs/workbench/common/editor'; +import { EditorInput, EditorOptions } from 'vs/workbench/common/editor'; import { BaseEditor } from 'vs/workbench/browser/parts/editor/baseEditor'; import { IEditorViewState, IEditor, isCommonCodeEditor, isCommonDiffEditor } from 'vs/editor/common/editorCommon'; import { Position } from 'vs/platform/editor/common/editor'; @@ -318,7 +318,7 @@ export abstract class BaseTextEditor extends BaseEditor { } if (this.input) { - return toResource(this.input); + return this.input.getResource(); } return null; diff --git a/src/vs/workbench/browser/parts/quickopen/quickOpenController.ts b/src/vs/workbench/browser/parts/quickopen/quickOpenController.ts index 69f2abf2800..27b098e9604 100644 --- a/src/vs/workbench/browser/parts/quickopen/quickOpenController.ts +++ b/src/vs/workbench/browser/parts/quickopen/quickOpenController.ts @@ -31,7 +31,7 @@ import { IResourceInput, IEditorInput } from 'vs/platform/editor/common/editor'; import { IModeService } from 'vs/editor/common/services/modeService'; import { getIconClasses } from 'vs/workbench/browser/labels'; import { IModelService } from 'vs/editor/common/services/modelService'; -import { EditorInput, toResource, IWorkbenchEditorConfiguration } from 'vs/workbench/common/editor'; +import { EditorInput, IWorkbenchEditorConfiguration } from 'vs/workbench/common/editor'; import { Component } from 'vs/workbench/common/component'; import Event, { Emitter } from 'vs/base/common/event'; import { IPartService } from 'vs/workbench/services/part/common/partService'; @@ -1332,7 +1332,7 @@ export class EditorHistoryEntry extends EditorQuickOpenEntry { } function resourceForEditorHistory(input: EditorInput, fileService: IFileService): URI { - const resource = toResource(input); + const resource = input ? input.getResource() : void 0; // For the editor history we only prefer resources that are either untitled or // can be handled by the file service which indicates they are editable resources. diff --git a/src/vs/workbench/common/editor.ts b/src/vs/workbench/common/editor.ts index c0165d7c69c..440ef0a6265 100644 --- a/src/vs/workbench/common/editor.ts +++ b/src/vs/workbench/common/editor.ts @@ -124,6 +124,13 @@ export abstract class EditorInput implements IEditorInput { return this._onDispose.event; } + /** + * Returns the associated resource of this input if any. + */ + public getResource(): URI { + return null; + } + /** * Returns the name of this input that can be shown to the user. Examples include showing the name of the input * above the editor area when the input is shown. @@ -285,11 +292,6 @@ export interface IEncodingSupport { */ export interface IFileEditorInput extends IEditorInput, IEncodingSupport { - /** - * Gets the absolute file resource URI this input is about. - */ - getResource(): URI; - /** * Sets the preferred encodingt to use for this input. */ @@ -829,7 +831,7 @@ export function toResource(editor: IEditorInput, options?: IResourceOptions): UR editor = editor.master; } - const resource = doGetEditorResource(editor); + const resource = editor.getResource(); if (!options || !options.filter) { return resource; // return early if no filter is specified } @@ -859,18 +861,6 @@ export function toResource(editor: IEditorInput, options?: IResourceOptions): UR return null; } -// TODO@Ben every editor should have an associated resource -function doGetEditorResource(editor: IEditorInput): URI { - if (editor instanceof EditorInput && typeof (editor).getResource === 'function') { - const candidate = (editor).getResource(); - if (candidate instanceof URI) { - return candidate; - } - } - - return null; -} - class EditorInputFactoryRegistry implements IEditorInputFactoryRegistry { private instantiationService: IInstantiationService; private fileInputFactory: IFileInputFactory; diff --git a/src/vs/workbench/common/editor/editorStacksModel.ts b/src/vs/workbench/common/editor/editorStacksModel.ts index 7de2455d925..26d0dca609d 100644 --- a/src/vs/workbench/common/editor/editorStacksModel.ts +++ b/src/vs/workbench/common/editor/editorStacksModel.ts @@ -1215,7 +1215,7 @@ export class EditorStacksModel implements IEditorStacksModel { // Close the editor when it is no longer open in any group including diff editors editorsToClose.forEach(editorToClose => { - const resource = toResource(editorToClose); // prefer resource to not close right-hand side editors of a diff editor + const resource = editorToClose ? editorToClose.getResource() : void 0; // prefer resource to not close right-hand side editors of a diff editor if (!this.isOpen(resource || editorToClose)) { editorToClose.close(); } diff --git a/src/vs/workbench/common/editor/rangeDecorations.ts b/src/vs/workbench/common/editor/rangeDecorations.ts index 5074f2d9a1f..e8e821b044f 100644 --- a/src/vs/workbench/common/editor/rangeDecorations.ts +++ b/src/vs/workbench/common/editor/rangeDecorations.ts @@ -8,7 +8,6 @@ import URI from 'vs/base/common/uri'; import Event, { Emitter } from 'vs/base/common/event'; import * as editorCommon from 'vs/editor/common/editorCommon'; import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService'; -import { toResource } from 'vs/workbench/common/editor'; import { IRange } from 'vs/editor/common/core/range'; import { CursorChangeReason, ICursorPositionChangedEvent } from 'vs/editor/common/controller/cursorEvents'; import { ModelDecorationOptions } from 'vs/editor/common/model/textModelWithDecorations'; @@ -55,7 +54,8 @@ export class RangeHighlightDecorations implements IDisposable { } private getEditor(resourceRange: IRangeHighlightDecoration): editorCommon.ICommonCodeEditor { - const resource = toResource(this.editorService.getActiveEditorInput()); + const activeInput = this.editorService.getActiveEditorInput(); + const resource = activeInput && activeInput.getResource(); if (resource) { if (resource.toString() === resourceRange.resource.toString()) { return this.editorService.getActiveEditor().getControl(); diff --git a/src/vs/workbench/parts/files/browser/fileActions.ts b/src/vs/workbench/parts/files/browser/fileActions.ts index fcb3b89e67f..03004325482 100644 --- a/src/vs/workbench/parts/files/browser/fileActions.ts +++ b/src/vs/workbench/parts/files/browser/fileActions.ts @@ -1177,7 +1177,8 @@ export class GlobalCompareResourcesAction extends Action { } public run(): TPromise { - const activeResource = toResource(this.editorService.getActiveEditorInput()); + const activeInput = this.editorService.getActiveEditorInput(); + const activeResource = activeInput ? activeInput.getResource() : void 0; if (activeResource) { // Keep as resource to compare @@ -1195,7 +1196,7 @@ export class GlobalCompareResourcesAction extends Action { let description: string; if (input instanceof EditorInput) { - resource = toResource(input); + resource = input.getResource(); } else { resource = (input as IResourceInput).resource; } diff --git a/src/vs/workbench/parts/files/common/editors/fileEditorTracker.ts b/src/vs/workbench/parts/files/common/editors/fileEditorTracker.ts index d3fc8b88899..c07ed76b795 100644 --- a/src/vs/workbench/parts/files/common/editors/fileEditorTracker.ts +++ b/src/vs/workbench/parts/files/common/editors/fileEditorTracker.ts @@ -240,8 +240,8 @@ export class FileEditorTracker implements IWorkbenchContribution { for (let i = 0; i < editors.length; i++) { const editor = editors[i]; - if (editor && editor.position === stacks.positionOfGroup(group)) { - const editorResource = toResource(editor.input); + if (editor && editor.input && editor.position === stacks.positionOfGroup(group)) { + const editorResource = editor.input.getResource(); if (editorResource && resource.toString() === editorResource.toString()) { const control = editor.getControl(); if (isCommonCodeEditor(control)) { diff --git a/src/vs/workbench/parts/markers/browser/markersPanel.ts b/src/vs/workbench/parts/markers/browser/markersPanel.ts index 927959df287..a4060b88693 100644 --- a/src/vs/workbench/parts/markers/browser/markersPanel.ts +++ b/src/vs/workbench/parts/markers/browser/markersPanel.ts @@ -16,7 +16,6 @@ import { IActionItem } from 'vs/base/browser/ui/actionbar/actionbar'; import { IMarkerService } from 'vs/platform/markers/common/markers'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { IEditorGroupService } from 'vs/workbench/services/group/common/groupService'; -import { toResource } from 'vs/workbench/common/editor'; import { Panel } from 'vs/workbench/browser/panel'; import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService'; import Constants from 'vs/workbench/parts/markers/common/constants'; @@ -285,7 +284,8 @@ export class MarkersPanel extends Panel { } private onEditorsChanged(): void { - this.currentActiveResource = toResource(this.editorService.getActiveEditorInput()); + const activeInput = this.editorService.getActiveEditorInput(); + this.currentActiveResource = activeInput ? activeInput.getResource() : void 0; this.autoReveal(); } diff --git a/src/vs/workbench/parts/preferences/browser/preferencesEditor.ts b/src/vs/workbench/parts/preferences/browser/preferencesEditor.ts index 81d8845fa89..411b295653f 100644 --- a/src/vs/workbench/parts/preferences/browser/preferencesEditor.ts +++ b/src/vs/workbench/parts/preferences/browser/preferencesEditor.ts @@ -12,7 +12,7 @@ import { Dimension, Builder } from 'vs/base/browser/builder'; import { ArrayNavigator, INavigator } from 'vs/base/common/iterator'; import { Disposable, IDisposable, dispose } from 'vs/base/common/lifecycle'; import { KeyMod, KeyCode } from 'vs/base/common/keyCodes'; -import { toResource, SideBySideEditorInput, EditorOptions, EditorInput } from 'vs/workbench/common/editor'; +import { SideBySideEditorInput, EditorOptions, EditorInput } from 'vs/workbench/common/editor'; import { BaseEditor } from 'vs/workbench/browser/parts/editor/baseEditor'; import { ResourceEditorModel } from 'vs/workbench/common/editor/resourceEditorModel'; import { IEditorControl, Position, Verbosity } from 'vs/platform/editor/common/editor'; @@ -226,7 +226,7 @@ export class PreferencesEditor extends BaseEditor { } private updateInput(oldInput: PreferencesEditorInput, newInput: PreferencesEditorInput, options?: EditorOptions): TPromise { - const resource = toResource(newInput.master); + const resource = newInput.master.getResource(); this.settingsTargetsWidget.updateTargets(this.getSettingsConfigurationTargetUri(resource), this.getSettingsConfigurationTarget(resource)); return this.sideBySidePreferencesWidget.setInput(newInput.details, newInput.master, options).then(({ defaultPreferencesRenderer, editablePreferencesRenderer }) => { @@ -267,7 +267,7 @@ export class PreferencesEditor extends BaseEditor { private onWorkspaceFoldersChanged(): void { if (this.input) { - const settingsResource = toResource((this.input).master); + const settingsResource = (this.input).master.getResource(); const targetResource = this.getSettingsConfigurationTargetUri(settingsResource); if (!targetResource) { this.switchSettings(this.preferencesService.userSettingsResource); @@ -277,7 +277,7 @@ export class PreferencesEditor extends BaseEditor { private onWorkbenchStateChanged(): void { if (this.input) { - const editableSettingsResource = toResource((this.input).master); + const editableSettingsResource = (this.input).master.getResource(); const newConfigurationTarget = this.getSettingsConfigurationTarget(editableSettingsResource); if (newConfigurationTarget) { if (newConfigurationTarget !== this.settingsTargetsWidget.configurationTarget) { @@ -528,7 +528,7 @@ class SideBySidePreferencesWidget extends Widget { public setInput(defaultPreferencesEditorInput: DefaultPreferencesEditorInput, editablePreferencesEditorInput: EditorInput, options?: EditorOptions): TPromise<{ defaultPreferencesRenderer: IPreferencesRenderer, editablePreferencesRenderer: IPreferencesRenderer }> { this.getOrCreateEditablePreferencesEditor(editablePreferencesEditorInput); this.dolayout(this.sash.getVerticalSashLeft()); - return TPromise.join([this.updateInput(this.defaultPreferencesEditor, defaultPreferencesEditorInput, DefaultSettingsEditorContribution.ID, toResource(editablePreferencesEditorInput), options), + return TPromise.join([this.updateInput(this.defaultPreferencesEditor, defaultPreferencesEditorInput, DefaultSettingsEditorContribution.ID, editablePreferencesEditorInput.getResource(), options), this.updateInput(this.editablePreferencesEditor, editablePreferencesEditorInput, SettingsEditorContribution.ID, defaultPreferencesEditorInput.getResource(), options)]) .then(([defaultPreferencesRenderer, editablePreferencesRenderer]) => ({ defaultPreferencesRenderer, editablePreferencesRenderer })); } diff --git a/src/vs/workbench/parts/search/browser/searchActions.ts b/src/vs/workbench/parts/search/browser/searchActions.ts index 9e9f3113d47..8c65a7a44b1 100644 --- a/src/vs/workbench/parts/search/browser/searchActions.ts +++ b/src/vs/workbench/parts/search/browser/searchActions.ts @@ -23,7 +23,6 @@ import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/edi import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { ResolvedKeybinding, createKeybinding } from 'vs/base/common/keyCodes'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; -import { toResource } from 'vs/workbench/common/editor'; import { ServicesAccessor, IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IListService } from 'vs/platform/list/browser/listService'; import { explorerItemToFileResource } from 'vs/workbench/parts/files/common/files'; @@ -639,7 +638,8 @@ export class ReplaceAction extends AbstractSearchAndReplaceAction { } private hasToOpenFile(): boolean { - const file = toResource(this.editorService.getActiveEditorInput()); + const activeInput = this.editorService.getActiveEditorInput(); + const file = activeInput ? activeInput.getResource() : void 0; if (file) { return file.toString() === this.element.parent().resource().toString(); } diff --git a/src/vs/workbench/services/history/browser/history.ts b/src/vs/workbench/services/history/browser/history.ts index cc64ff959ed..ff937e3303c 100644 --- a/src/vs/workbench/services/history/browser/history.ts +++ b/src/vs/workbench/services/history/browser/history.ts @@ -10,7 +10,7 @@ import errors = require('vs/base/common/errors'); import URI from 'vs/base/common/uri'; import { IEditor } from 'vs/editor/common/editorCommon'; import { IEditor as IBaseEditor, IEditorInput, ITextEditorOptions, IResourceInput, ITextEditorSelection, Position as GroupPosition } from 'vs/platform/editor/common/editor'; -import { Extensions as EditorExtensions, EditorInput, IEditorCloseEvent, toResource, IEditorGroup, IEditorInputFactoryRegistry } from 'vs/workbench/common/editor'; +import { Extensions as EditorExtensions, EditorInput, IEditorCloseEvent, IEditorGroup, IEditorInputFactoryRegistry } from 'vs/workbench/common/editor'; import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService'; import { IHistoryService } from 'vs/workbench/services/history/common/history'; import { FileChangesEvent, IFileService, FileChangeType } from 'vs/platform/files/common/files'; @@ -245,7 +245,7 @@ export class HistoryService extends BaseHistoryService implements IHistoryServic // Track closing of pinned editor to support to reopen closed editors if (event.pinned) { - const resource = toResource(event.editor); + const resource = event.editor ? event.editor.getResource() : void 0; const supportsReopen = resource && this.fileService.canHandleResource(resource); // we only support file'ish things to reopen if (supportsReopen) { @@ -592,7 +592,7 @@ export class HistoryService extends BaseHistoryService implements IHistoryServic } private preferResourceInput(input: IEditorInput): IEditorInput | IResourceInput { - const resource = toResource(input); + const resource = input ? input.getResource() : void 0; const preferResourceInput = resource && this.fileService.canHandleResource(resource); // file'ish things prefer resources if (preferResourceInput) { return { resource }; @@ -680,7 +680,7 @@ export class HistoryService extends BaseHistoryService implements IHistoryServic } if (arg2 instanceof EditorInput) { - const inputResource = toResource(arg2); + const inputResource = arg2.getResource(); return inputResource && this.fileService.canHandleResource(inputResource) && inputResource.toString() === resource.toString(); } From e4dd8b646d689460a9f09bb0d023371e11283d3a Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Wed, 4 Oct 2017 15:28:06 +0200 Subject: [PATCH 013/158] add native promise polyfill, #35516 --- src/vs/base/common/winjs.polyfill.promise.ts | 77 +++++++++ .../common/winjs.polyfill.promise.test.ts | 152 ++++++++++++++++++ src/vs/editor/editor.main.ts | 7 + 3 files changed, 236 insertions(+) create mode 100644 src/vs/base/common/winjs.polyfill.promise.ts create mode 100644 src/vs/base/test/common/winjs.polyfill.promise.test.ts diff --git a/src/vs/base/common/winjs.polyfill.promise.ts b/src/vs/base/common/winjs.polyfill.promise.ts new file mode 100644 index 00000000000..65d46c7f076 --- /dev/null +++ b/src/vs/base/common/winjs.polyfill.promise.ts @@ -0,0 +1,77 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { Promise as WinJSPromise } from './winjs.base'; + +/** + * A polyfill for the native promises. The implementation is based on + * WinJS promises but tries to gap differences between winjs promises + * and native promises. + */ +export class PolyfillPromise implements Promise { + + static all(thenables: Thenable[]): PolyfillPromise { + return new PolyfillPromise(WinJSPromise.join(thenables).then(null, values => { + // WinJSPromise returns a sparse array whereas + // native promises return the *first* error + for (var key in values) { + if (values.hasOwnProperty(key)) { + return values[key]; + } + } + })); + } + + static race(thenables: Thenable[]): PolyfillPromise { + // WinJSPromise returns `{ key: , value: }` + // from the `any` call and Promise.race just wants the value + return new PolyfillPromise(WinJSPromise.any(thenables).then(entry => entry.value, err => err.value)); + } + + static resolve(value): PolyfillPromise { + return new PolyfillPromise(WinJSPromise.wrap(value)); + } + + static reject(value): PolyfillPromise { + return new PolyfillPromise(WinJSPromise.wrapError(value)); + } + + private _winjsPromise: WinJSPromise; + + constructor(winjsPromise: WinJSPromise); + constructor(callback: (resolve: (value?: T) => void, reject: (err?: any) => void) => any); + constructor(callback: WinJSPromise | ((resolve: (value?: T) => void, reject: (err?: any) => void) => any)) { + + if (WinJSPromise.is(callback)) { + this._winjsPromise = callback; + } else { + this._winjsPromise = new WinJSPromise((resolve, reject) => { + let initializing = true; + callback(function (value) { + if (!initializing) { + resolve(value); + } else { + setImmediate(resolve, value); + } + }, function (err) { + if (!initializing) { + reject(err); + } else { + setImmediate(reject, err); + } + }); + initializing = false; + }); + } + } + + then(onFulfilled?: any, onRejected?: any): PolyfillPromise { + return new PolyfillPromise(this._winjsPromise.then(onFulfilled, onRejected)); + } + + catch(onRejected?: any): PolyfillPromise { + return new PolyfillPromise(this._winjsPromise.then(null, onRejected)); + } +} diff --git a/src/vs/base/test/common/winjs.polyfill.promise.test.ts b/src/vs/base/test/common/winjs.polyfill.promise.test.ts new file mode 100644 index 00000000000..a11908fe9ad --- /dev/null +++ b/src/vs/base/test/common/winjs.polyfill.promise.test.ts @@ -0,0 +1,152 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +'use strict'; + +import * as assert from 'assert'; +import { PolyfillPromise } from 'vs/base/common/winjs.polyfill.promise'; +import { Promise as WinJSPromise } from 'vs/base/common/winjs.base'; + +suite('Polyfill Promise', function () { + + test('sync-resolve, NativePromise', function () { + // native promise behaviour + const actual: string[] = []; + const promise = new Promise(resolve => { + actual.push('inCtor'); + resolve(null); + }).then(() => actual.push('inThen')); + actual.push('afterCtor'); + return promise.then(() => { + assert.deepEqual(actual, ['inCtor', 'afterCtor', 'inThen']); + }); + }); + + test('sync-resolve, WinJSPromise', function () { + + // winjs promise behaviour + const actual: string[] = []; + const promise = new WinJSPromise(resolve => { + actual.push('inCtor'); + resolve(null); + }).then(() => actual.push('inThen')); + actual.push('afterCtor'); + return promise.then(() => { + assert.deepEqual(actual, ['inCtor', 'inThen', 'afterCtor']); + }); + }); + + test('sync-resolve, PolyfillPromise', function () { + + // winjs promise behaviour + const actual: string[] = []; + const promise = new PolyfillPromise(resolve => { + actual.push('inCtor'); + resolve(null); + }).then(() => actual.push('inThen')); + actual.push('afterCtor'); + return promise.then(() => { + assert.deepEqual(actual, ['inCtor', 'afterCtor', 'inThen']); + }); + }); + + test('PolyfillPromise, executor has two params', function () { + return new PolyfillPromise(function () { + assert.equal(arguments.length, 2); + assert.equal(typeof arguments[0], 'function'); + assert.equal(typeof arguments[1], 'function'); + + arguments[0](); + }); + }); + + // run the same tests for the native and polyfill promise + ([Promise, PolyfillPromise]).forEach(PromiseCtor => { + + test(PromiseCtor.name + ', resolved value', function () { + return new PromiseCtor(resolve => resolve(1)).then(value => assert.equal(value, 1)); + }); + + test(PromiseCtor.name + ', rejected value', function () { + return new PromiseCtor((_, reject) => reject(1)).then(null, value => assert.equal(value, 1)); + }); + + test(PromiseCtor.name + ', catch', function () { + return new PromiseCtor((_, reject) => reject(1)).catch(value => assert.equal(value, 1)); + }); + + test(PromiseCtor.name + ', static-resolve', function () { + return PromiseCtor.resolve(42).then(value => assert.equal(value, 42)); + }); + + test(PromiseCtor.name + ', static-reject', function () { + return PromiseCtor.reject(42).then(null, value => assert.equal(value, 42)); + }); + + test(PromiseCtor.name + ', static-all, 1', function () { + return PromiseCtor.all([ + PromiseCtor.resolve(1), + PromiseCtor.resolve(2) + ]).then(values => { + assert.deepEqual(values, [1, 2]); + }); + }); + + test(PromiseCtor.name + ', static-all, 2', function () { + return PromiseCtor.all([ + PromiseCtor.resolve(1), + 3, + PromiseCtor.resolve(2) + ]).then(values => { + assert.deepEqual(values, [1, 3, 2]); + }); + }); + + test(PromiseCtor.name + ', static-all, 3', function () { + return PromiseCtor.all([ + PromiseCtor.resolve(1), + PromiseCtor.reject(13), + PromiseCtor.reject(12), + ]).catch(values => { + assert.deepEqual(values, 13); + }); + }); + + test(PromiseCtor.name + ', static-race, 1', function () { + return PromiseCtor.race([ + PromiseCtor.resolve(1), + PromiseCtor.resolve(2), + ]).then(value => { + assert.deepEqual(value, 1); + }); + }); + + test(PromiseCtor.name + ', static-race, 2', function () { + return PromiseCtor.race([ + PromiseCtor.reject(-1), + PromiseCtor.resolve(2), + ]).catch(value => { + assert.deepEqual(value, -1); + }); + }); + + test(PromiseCtor.name + ', static-race, 3', function () { + return PromiseCtor.race([ + PromiseCtor.resolve(1), + PromiseCtor.reject(2), + ]).then(value => { + assert.deepEqual(value, 1); + }); + }); + + test(PromiseCtor.name + ', throw in ctor', function () { + return new PromiseCtor(() => { + throw new Error('sooo bad'); + }).catch(err => { + assert.equal(err.message, 'sooo bad'); + }); + }); + + }); +}); diff --git a/src/vs/editor/editor.main.ts b/src/vs/editor/editor.main.ts index 2bb862cb86f..48005b9714e 100644 --- a/src/vs/editor/editor.main.ts +++ b/src/vs/editor/editor.main.ts @@ -19,6 +19,13 @@ import { createMonacoEditorAPI } from 'vs/editor/standalone/browser/standaloneEd import { createMonacoLanguagesAPI } from 'vs/editor/standalone/browser/standaloneLanguages'; import { EDITOR_DEFAULTS, WrappingIndent } from 'vs/editor/common/config/editorOptions'; +// When missing, polyfill the native promise +// with our winjs-based polyfill +import { PolyfillPromise } from 'vs/base/common/winjs.polyfill.promise'; +if (typeof global.Promise === 'undefined') { + global.Promise = PolyfillPromise; +} + // Set defaults for standalone editor (EDITOR_DEFAULTS).wrappingIndent = WrappingIndent.None; (EDITOR_DEFAULTS.contribInfo).folding = false; From de4fd8544b5c1ae4a8a20fc77425b15db03694da Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Wed, 4 Oct 2017 15:38:18 +0200 Subject: [PATCH 014/158] use anonymous class --- src/vs/workbench/services/search/node/rawSearchService.ts | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/vs/workbench/services/search/node/rawSearchService.ts b/src/vs/workbench/services/search/node/rawSearchService.ts index 0f100b63bc7..12c6c6e0381 100644 --- a/src/vs/workbench/services/search/node/rawSearchService.ts +++ b/src/vs/workbench/services/search/node/rawSearchService.ts @@ -414,7 +414,7 @@ class Cache { public scorerCache: ScorerCache = Object.create(null); } -class FileMatchItemAccessorClass implements IItemAccessor { +const FileMatchItemAccessor = new class implements IItemAccessor { public getItemLabel(match: IRawFileMatch): string { return match.basename; // e.g. myFile.txt @@ -427,9 +427,7 @@ class FileMatchItemAccessorClass implements IItemAccessor { public getItemPath(match: IRawFileMatch): string { return match.relativePath; // e.g. some/path/to/file/myFile.txt } -} - -const FileMatchItemAccessor = new FileMatchItemAccessorClass(); +}; interface CacheStats { cacheWasResolved: boolean; From 6a6b589eb87046c6d05900dccd38432fed7e26fb Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 4 Oct 2017 15:43:48 +0200 Subject: [PATCH 015/158] fix compile errors --- extensions/git/src/git.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/git/src/git.ts b/extensions/git/src/git.ts index 13f4935224c..bc9ac5398a8 100644 --- a/extensions/git/src/git.ts +++ b/extensions/git/src/git.ts @@ -174,7 +174,7 @@ function cpErrorHandler(cb: (reason?: any) => void): (reason?: any) => void { }; } -interface SpawnOptions extends cp.SpawnOptions { +export interface SpawnOptions extends cp.SpawnOptions { input?: string; encoding?: string; log?: boolean; From eab541f6779397116aa92d3ef3aa0cb625e08cad Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Wed, 4 Oct 2017 16:05:19 +0200 Subject: [PATCH 016/158] fix #34565 --- .../suggest/browser/suggestController.ts | 88 +++++++++++-------- 1 file changed, 50 insertions(+), 38 deletions(-) diff --git a/src/vs/editor/contrib/suggest/browser/suggestController.ts b/src/vs/editor/contrib/suggest/browser/suggestController.ts index 6ffa21fabcb..bfb3d1ba742 100644 --- a/src/vs/editor/contrib/suggest/browser/suggestController.ts +++ b/src/vs/editor/contrib/suggest/browser/suggestController.ts @@ -170,45 +170,55 @@ export class SuggestController implements IEditorContribution { } private _onDidSelectItem(item: ICompletionItem): void { - if (item) { - const { suggestion, position } = item; - const columnDelta = this._editor.getPosition().column - position.column; - - if (Array.isArray(suggestion.additionalTextEdits)) { - this._editor.pushUndoStop(); - this._editor.executeEdits('suggestController.additionalTextEdits', suggestion.additionalTextEdits.map(edit => EditOperation.replace(Range.lift(edit.range), edit.text))); - this._editor.pushUndoStop(); - } - - let { insertText } = suggestion; - if (suggestion.snippetType !== 'textmate') { - insertText = SnippetParser.escape(insertText); - } - - SnippetController2.get(this._editor).insert( - insertText, - suggestion.overwriteBefore + columnDelta, - suggestion.overwriteAfter - ); - - - if (suggestion.command) { - this._commandService.executeCommand(suggestion.command.id, ...suggestion.command.arguments).done(undefined, onUnexpectedError); - } - - this._alertCompletionItem(item); - /* __GDPR__ - "suggestSnippetInsert" : { - "suggestionType" : { "classification": "SystemMetaData", "purpose": "FeatureInsight" }, - "${include}": [ - "${EditorTelemetryData}" - ] - } - */ - this._telemetryService.publicLog('suggestSnippetInsert', { ...this._editor.getTelemetryData(), suggestionType: suggestion.type }); + if (!item) { + this._model.cancel(); + return; } - this._model.cancel(); + const { suggestion, position } = item; + const columnDelta = this._editor.getPosition().column - position.column; + + if (Array.isArray(suggestion.additionalTextEdits)) { + this._editor.pushUndoStop(); + this._editor.executeEdits('suggestController.additionalTextEdits', suggestion.additionalTextEdits.map(edit => EditOperation.replace(Range.lift(edit.range), edit.text))); + this._editor.pushUndoStop(); + } + + let { insertText } = suggestion; + if (suggestion.snippetType !== 'textmate') { + insertText = SnippetParser.escape(insertText); + } + + SnippetController2.get(this._editor).insert( + insertText, + suggestion.overwriteBefore + columnDelta, + suggestion.overwriteAfter + ); + + if (!suggestion.command) { + // done + this._model.cancel(); + + } else if (suggestion.command.id === TriggerSuggestAction.id) { + // retigger + this._model.trigger({ auto: this._model.state === State.Auto }, true); + + } else { + // exec command, done + this._commandService.executeCommand(suggestion.command.id, ...suggestion.command.arguments).done(undefined, onUnexpectedError); + this._model.cancel(); + } + + this._alertCompletionItem(item); + /* __GDPR__ + "suggestSnippetInsert" : { + "suggestionType" : { "classification": "SystemMetaData", "purpose": "FeatureInsight" }, + "${include}": [ + "${EditorTelemetryData}" + ] + } + */ + this._telemetryService.publicLog('suggestSnippetInsert', { ...this._editor.getTelemetryData(), suggestionType: suggestion.type }); } private _alertCompletionItem({ suggestion }: ICompletionItem): void { @@ -288,9 +298,11 @@ export class SuggestController implements IEditorContribution { @editorAction export class TriggerSuggestAction extends EditorAction { + static readonly id = 'editor.action.triggerSuggest'; + constructor() { super({ - id: 'editor.action.triggerSuggest', + id: TriggerSuggestAction.id, label: nls.localize('suggest.trigger.label', "Trigger Suggest"), alias: 'Trigger Suggest', precondition: ContextKeyExpr.and(EditorContextKeys.writable, EditorContextKeys.hasCompletionItemProvider), From 015698ac19c737ae8f3182bf7efb03cce3aada34 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Wed, 4 Oct 2017 16:20:44 +0200 Subject: [PATCH 017/158] don't generically log telemetry from workspace commands --- src/vs/workbench/common/actions.ts | 15 ++------------- 1 file changed, 2 insertions(+), 13 deletions(-) diff --git a/src/vs/workbench/common/actions.ts b/src/vs/workbench/common/actions.ts index 24c2ad3b901..d1b8e840b46 100644 --- a/src/vs/workbench/common/actions.ts +++ b/src/vs/workbench/common/actions.ts @@ -12,7 +12,6 @@ import { IPartService } from 'vs/workbench/services/part/common/partService'; import { ICommandHandler, CommandsRegistry } from 'vs/platform/commands/common/commands'; import { SyncActionDescriptor, MenuRegistry, MenuId } from 'vs/platform/actions/common/actions'; import { IMessageService } from 'vs/platform/message/common/message'; -import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import Severity from 'vs/base/common/severity'; import { IDisposable, combinedDisposable } from 'vs/base/common/lifecycle'; @@ -87,16 +86,15 @@ Registry.add(Extensions.WorkbenchActions, new class implements IWorkbenchActionR return (accessor, args) => { const messageService = accessor.get(IMessageService); const instantiationService = accessor.get(IInstantiationService); - const telemetryService = accessor.get(ITelemetryService); const partService = accessor.get(IPartService); - TPromise.as(this._triggerAndDisposeAction(instantiationService, telemetryService, partService, descriptor, args)).done(null, (err) => { + TPromise.as(this._triggerAndDisposeAction(instantiationService, partService, descriptor, args)).done(null, (err) => { messageService.show(Severity.Error, err); }); }; } - private _triggerAndDisposeAction(instantitationService: IInstantiationService, telemetryService: ITelemetryService, partService: IPartService, descriptor: SyncActionDescriptor, args: any): TPromise { + private _triggerAndDisposeAction(instantitationService: IInstantiationService, partService: IPartService, descriptor: SyncActionDescriptor, args: any): TPromise { const actionInstance = instantitationService.createInstance(descriptor.syncDescriptor); actionInstance.label = descriptor.label || actionInstance.label; @@ -108,15 +106,6 @@ Registry.add(Extensions.WorkbenchActions, new class implements IWorkbenchActionR } const from = args && args.from || 'keybinding'; - if (telemetryService) { - /* __GDPR__ - "workbenchActionExecuted" : { - "id" : { "classification": "SystemMetaData", "purpose": "FeatureInsight" }, - "from": { "classification": "SystemMetaData", "purpose": "FeatureInsight" } - } - */ - telemetryService.publicLog('workbenchActionExecuted', { id: actionInstance.id, from }); - } // run action when workbench is created return partService.joinCreation().then(() => { From d7a466fcee82bd726340f7bd51ae6ac11d1a88aa Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Wed, 4 Oct 2017 16:21:02 +0200 Subject: [PATCH 018/158] make keybinding service log workbenchAction-event --- src/vs/editor/standalone/browser/simpleServices.ts | 3 ++- .../editor/standalone/browser/standaloneServices.ts | 2 +- .../keybinding/common/abstractKeybindingService.ts | 12 +++++++++++- .../keybinding/electron-browser/keybindingService.ts | 6 +++--- 4 files changed, 17 insertions(+), 6 deletions(-) diff --git a/src/vs/editor/standalone/browser/simpleServices.ts b/src/vs/editor/standalone/browser/simpleServices.ts index bad64ca55ae..a6c525bb02a 100644 --- a/src/vs/editor/standalone/browser/simpleServices.ts +++ b/src/vs/editor/standalone/browser/simpleServices.ts @@ -317,10 +317,11 @@ export class StandaloneKeybindingService extends AbstractKeybindingService { constructor( contextKeyService: IContextKeyService, commandService: ICommandService, + telemetryService: ITelemetryService, messageService: IMessageService, domNode: HTMLElement ) { - super(contextKeyService, commandService, messageService); + super(contextKeyService, commandService, telemetryService, messageService); this._cachedResolver = null; this._dynamicKeybindings = []; diff --git a/src/vs/editor/standalone/browser/standaloneServices.ts b/src/vs/editor/standalone/browser/standaloneServices.ts index 17ed8f6e8f1..7fac82dc12b 100644 --- a/src/vs/editor/standalone/browser/standaloneServices.ts +++ b/src/vs/editor/standalone/browser/standaloneServices.ts @@ -176,7 +176,7 @@ export class DynamicStandaloneServices extends Disposable { let commandService = ensure(ICommandService, () => new StandaloneCommandService(this._instantiationService)); - ensure(IKeybindingService, () => this._register(new StandaloneKeybindingService(contextKeyService, commandService, messageService, domElement))); + ensure(IKeybindingService, () => this._register(new StandaloneKeybindingService(contextKeyService, commandService, telemetryService, messageService, domElement))); let contextViewService = ensure(IContextViewService, () => this._register(new ContextViewService(domElement, telemetryService, messageService))); diff --git a/src/vs/platform/keybinding/common/abstractKeybindingService.ts b/src/vs/platform/keybinding/common/abstractKeybindingService.ts index 176a15f5e27..c933039914b 100644 --- a/src/vs/platform/keybinding/common/abstractKeybindingService.ts +++ b/src/vs/platform/keybinding/common/abstractKeybindingService.ts @@ -16,6 +16,7 @@ import { IStatusbarService } from 'vs/platform/statusbar/common/statusbar'; import { IMessageService } from 'vs/platform/message/common/message'; import Event, { Emitter } from 'vs/base/common/event'; import { ResolvedKeybindingItem } from 'vs/platform/keybinding/common/resolvedKeybindingItem'; +import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; interface CurrentChord { keypress: string; @@ -32,13 +33,15 @@ export abstract class AbstractKeybindingService implements IKeybindingService { protected _onDidUpdateKeybindings: Emitter; private _contextKeyService: IContextKeyService; - protected _commandService: ICommandService; private _statusService: IStatusbarService; private _messageService: IMessageService; + protected _commandService: ICommandService; + protected _telemetryService: ITelemetryService; constructor( contextKeyService: IContextKeyService, commandService: ICommandService, + telemetryService: ITelemetryService, messageService: IMessageService, statusService?: IStatusbarService ) { @@ -161,6 +164,13 @@ export abstract class AbstractKeybindingService implements IKeybindingService { this._commandService.executeCommand(resolveResult.commandId, resolveResult.commandArgs || {}).done(undefined, err => { this._messageService.show(Severity.Warning, err); }); + /* __GDPR__ + "workbenchActionExecuted" : { + "id" : { "classification": "SystemMetaData", "purpose": "FeatureInsight" }, + "from": { "classification": "SystemMetaData", "purpose": "FeatureInsight" } + } + */ + this._telemetryService.publicLog('workbenchActionExecuted', { id: resolveResult.commandId, from: 'keybinding' }); } return shouldPreventDefault; diff --git a/src/vs/workbench/services/keybinding/electron-browser/keybindingService.ts b/src/vs/workbench/services/keybinding/electron-browser/keybindingService.ts index b4c10edb678..9634a27da63 100644 --- a/src/vs/workbench/services/keybinding/electron-browser/keybindingService.ts +++ b/src/vs/workbench/services/keybinding/electron-browser/keybindingService.ts @@ -259,13 +259,13 @@ export class WorkbenchKeybindingService extends AbstractKeybindingService { windowElement: Window, @IContextKeyService contextKeyService: IContextKeyService, @ICommandService commandService: ICommandService, - @ITelemetryService private telemetryService: ITelemetryService, + @ITelemetryService telemetryService: ITelemetryService, @IMessageService messageService: IMessageService, @IEnvironmentService environmentService: IEnvironmentService, @IStatusbarService statusBarService: IStatusbarService, @IConfigurationService configurationService: IConfigurationService ) { - super(contextKeyService, commandService, messageService, statusBarService); + super(contextKeyService, commandService, telemetryService, messageService, statusBarService); let dispatchConfig = getDispatchConfig(configurationService); configurationService.onDidUpdateConfiguration((e) => { @@ -415,7 +415,7 @@ export class WorkbenchKeybindingService extends AbstractKeybindingService { "keyCount" : { "classification": "SystemMetaData", "purpose": "FeatureInsight" } } */ - this.telemetryService.publicLog('customKeybindingsChanged', { + this._telemetryService.publicLog('customKeybindingsChanged', { keyCount: cnt }); } From b726d868376f2ace33f0d7b0f15c18bc255e3a70 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Wed, 4 Oct 2017 16:52:42 +0200 Subject: [PATCH 019/158] smoke - fix compile error --- test/smoke/src/spectron/client.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/smoke/src/spectron/client.ts b/test/smoke/src/spectron/client.ts index 66c32d1794d..20c4f463e2b 100644 --- a/test/smoke/src/spectron/client.ts +++ b/test/smoke/src/spectron/client.ts @@ -14,7 +14,7 @@ export class SpectronClient { // waitFor calls should not take more than 200 * 100 = 20 seconds to complete, excluding // the time it takes for the actual retry call to complete - private readonly retryCount; + private retryCount: number; private readonly retryDuration = 100; // in milliseconds constructor(public spectron: Application, private application: SpectronApplication) { From 5945ecb1d3e3fab06a3b217b1e78a5c85fcd00c2 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Wed, 4 Oct 2017 16:53:23 +0200 Subject: [PATCH 020/158] linkedlist - push/unshift --- src/vs/base/common/callbackList.ts | 2 +- src/vs/base/common/linkedList.ts | 21 +++++- src/vs/base/test/common/linkedList.test.ts | 87 +++++++++++++++++----- 3 files changed, 88 insertions(+), 22 deletions(-) diff --git a/src/vs/base/common/callbackList.ts b/src/vs/base/common/callbackList.ts index 96e0781ba87..9538c3f7df6 100644 --- a/src/vs/base/common/callbackList.ts +++ b/src/vs/base/common/callbackList.ts @@ -16,7 +16,7 @@ export default class CallbackList { if (!this._callbacks) { this._callbacks = new LinkedList<[Function, any]>(); } - const remove = this._callbacks.insert([callback, context]); + const remove = this._callbacks.push([callback, context]); if (Array.isArray(bucket)) { bucket.push({ dispose: remove }); } diff --git a/src/vs/base/common/linkedList.ts b/src/vs/base/common/linkedList.ts index e908f3c0e57..a75c81ac4a0 100644 --- a/src/vs/base/common/linkedList.ts +++ b/src/vs/base/common/linkedList.ts @@ -24,16 +24,33 @@ export class LinkedList { return !this._first; } - insert(element: E) { + unshift(element: E) { + return this.insert(element, false); + } + + push(element: E) { + return this.insert(element, true); + } + + private insert(element: E, atTheEnd: boolean) { const newNode = new Node(element); if (!this._first) { this._first = newNode; this._last = newNode; - } else { + + } else if (atTheEnd) { + // push const oldLast = this._last; this._last = newNode; newNode.prev = oldLast; oldLast.next = newNode; + + } else { + // unshift + const oldFirst = this._first; + this._first = newNode; + newNode.next = oldFirst; + oldFirst.prev = newNode; } return () => { diff --git a/src/vs/base/test/common/linkedList.test.ts b/src/vs/base/test/common/linkedList.test.ts index 267eccaa806..726da08601e 100644 --- a/src/vs/base/test/common/linkedList.test.ts +++ b/src/vs/base/test/common/linkedList.test.ts @@ -21,43 +21,43 @@ suite('LinkedList', function () { assert.equal(elements.length, 0); } - test('Insert/Iter', function () { + test('Push/Iter', function () { const list = new LinkedList(); - list.insert(0); - list.insert(1); - list.insert(2); + list.push(0); + list.push(1); + list.push(2); assertElements(list, 0, 1, 2); }); - test('Insert/Remove', function () { + test('Push/Remove', function () { let list = new LinkedList(); - let disp = list.insert(0); - list.insert(1); - list.insert(2); + let disp = list.push(0); + list.push(1); + list.push(2); disp(); assertElements(list, 1, 2); list = new LinkedList(); - list.insert(0); - disp = list.insert(1); - list.insert(2); + list.push(0); + disp = list.push(1); + list.push(2); disp(); assertElements(list, 0, 2); list = new LinkedList(); - list.insert(0); - list.insert(1); - disp = list.insert(2); + list.push(0); + list.push(1); + disp = list.push(2); disp(); assertElements(list, 0, 1); }); - test('Insert/toArray', function () { + test('Push/toArray', function () { let list = new LinkedList(); - list.insert('foo'); - list.insert('bar'); - list.insert('far'); - list.insert('boo'); + list.push('foo'); + list.push('bar'); + list.push('far'); + list.push('boo'); assert.deepEqual( list.toArray(), @@ -69,4 +69,53 @@ suite('LinkedList', function () { ] ); }); + + test('unshift/Iter', function () { + const list = new LinkedList(); + list.unshift(0); + list.unshift(1); + list.unshift(2); + assertElements(list, 2, 1, 0); + }); + + test('unshift/Remove', function () { + let list = new LinkedList(); + let disp = list.unshift(0); + list.unshift(1); + list.unshift(2); + disp(); + assertElements(list, 2, 1); + + list = new LinkedList(); + list.unshift(0); + disp = list.unshift(1); + list.unshift(2); + disp(); + assertElements(list, 2, 0); + + list = new LinkedList(); + list.unshift(0); + list.unshift(1); + disp = list.unshift(2); + disp(); + assertElements(list, 1, 0); + }); + + test('unshift/toArray', function () { + let list = new LinkedList(); + list.unshift('foo'); + list.unshift('bar'); + list.unshift('far'); + list.unshift('boo'); + + assert.deepEqual( + list.toArray(), + [ + 'boo', + 'far', + 'bar', + 'foo', + ] + ); + }); }); From a2efac20cda024c7d57e7595b958e858f8b173b3 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Wed, 4 Oct 2017 17:03:42 +0200 Subject: [PATCH 021/158] simplify command registry --- src/vs/platform/commands/common/commands.ts | 48 +++++++-------------- 1 file changed, 15 insertions(+), 33 deletions(-) diff --git a/src/vs/platform/commands/common/commands.ts b/src/vs/platform/commands/common/commands.ts index 7460bacc31b..bc6522256c0 100644 --- a/src/vs/platform/commands/common/commands.ts +++ b/src/vs/platform/commands/common/commands.ts @@ -10,6 +10,7 @@ import { TypeConstraint, validateConstraints } from 'vs/base/common/types'; import { ServicesAccessor, createDecorator } from 'vs/platform/instantiation/common/instantiation'; import Event from 'vs/base/common/event'; import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; +import { LinkedList } from 'vs/base/common/linkedList'; export const ICommandService = createDecorator('commandService'); @@ -51,16 +52,9 @@ export interface ICommandRegistry { getCommands(): ICommandsMap; } -function isCommand(thing: any): thing is ICommand { - return typeof thing === 'object' - && typeof (thing).handler === 'function' - && (!(thing).precondition || typeof (thing).precondition === 'object') - && (!(thing).description || typeof (thing).description === 'object'); -} - export const CommandsRegistry: ICommandRegistry = new class implements ICommandRegistry { - private _commands = new Map(); + private _commands = new Map>(); registerCommand(idOrCommand: string | ICommand, handler?: ICommandHandler): IDisposable { @@ -90,30 +84,19 @@ export const CommandsRegistry: ICommandRegistry = new class implements ICommandR // find a place to store the command const { id } = idOrCommand; - const commandOrArray = this._commands.get(id); - if (commandOrArray === void 0) { - this._commands.set(id, idOrCommand); - } else if (Array.isArray(commandOrArray)) { - commandOrArray.unshift(idOrCommand); - } else { - this._commands.set(id, [idOrCommand, commandOrArray]); + + let commands = this._commands.get(id); + if (!commands) { + commands = new LinkedList(); + this._commands.set(id, commands); } + let removeFn = commands.unshift(idOrCommand); + return { dispose: () => { - const commandOrArray = this._commands.get(id); - if (Array.isArray(commandOrArray)) { - // remove from array, remove array - // if last element removed - const idx = commandOrArray.indexOf(idOrCommand); - if (idx >= 0) { - commandOrArray.splice(idx, 1); - if (commandOrArray.length === 0) { - this._commands.delete(id); - } - } - } else if (isCommand(commandOrArray)) { - // remove from map + removeFn(); + if (this._commands.get(id).isEmpty()) { this._commands.delete(id); } } @@ -121,12 +104,11 @@ export const CommandsRegistry: ICommandRegistry = new class implements ICommandR } getCommand(id: string): ICommand { - const commandOrArray = this._commands.get(id); - if (Array.isArray(commandOrArray)) { - return commandOrArray[0]; - } else { - return commandOrArray; + const list = this._commands.get(id); + if (!list || list.isEmpty()) { + return undefined; } + return list.iterator().next().value; } getCommands(): ICommandsMap { From 722ad8026a895d424d22036b6bf68439d8da77f8 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Wed, 4 Oct 2017 18:04:10 +0200 Subject: [PATCH 022/158] fix tests --- extensions/vscode-api-tests/src/workspace.test.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/extensions/vscode-api-tests/src/workspace.test.ts b/extensions/vscode-api-tests/src/workspace.test.ts index c636a176e25..d4c4ae7013c 100644 --- a/extensions/vscode-api-tests/src/workspace.test.ts +++ b/extensions/vscode-api-tests/src/workspace.test.ts @@ -97,7 +97,7 @@ suite('workspace-namespace', () => { }); }); - test('openTextDocument, untitled closes on save', function (done) { + test('openTextDocument, untitled closes on save', function () { const path = join(vscode.workspace.rootPath || '', './newfile.txt'); return vscode.workspace.openTextDocument(vscode.Uri.parse('untitled:' + path)).then(doc => { @@ -115,7 +115,7 @@ suite('workspace-namespace', () => { d0.dispose(); - return deleteFile(vscode.Uri.file(join(vscode.workspace.rootPath || '', './newfile.txt'))).then(() => done(null)); + return deleteFile(vscode.Uri.file(join(vscode.workspace.rootPath || '', './newfile.txt'))); }); }); From 798043dc18618f264a4093e1b44894ea4ba4857c Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Wed, 4 Oct 2017 15:35:03 +0200 Subject: [PATCH 023/158] Typing fix for IJSONSchema.dependencies --- src/vs/base/common/jsonSchema.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/base/common/jsonSchema.ts b/src/vs/base/common/jsonSchema.ts index e8426093563..2aa8c50c9f7 100644 --- a/src/vs/base/common/jsonSchema.ts +++ b/src/vs/base/common/jsonSchema.ts @@ -17,7 +17,7 @@ export interface IJSONSchema { additionalProperties?: boolean | IJSONSchema; minProperties?: number; maxProperties?: number; - dependencies?: IJSONSchemaMap | string[]; + dependencies?: IJSONSchemaMap | { [name: string]: string[] }; items?: IJSONSchema | IJSONSchema[]; minItems?: number; maxItems?: number; From e671ee9722f1a2da17157c3f6021225d208ac363 Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Wed, 4 Oct 2017 18:15:42 +0200 Subject: [PATCH 024/158] Improved fix for #23850 --- extensions/cpp/syntaxes/c.json | 22 ++++++++--------- .../test/colorize-results/test-23630_cpp.json | 24 +++++++++---------- 2 files changed, 23 insertions(+), 23 deletions(-) diff --git a/extensions/cpp/syntaxes/c.json b/extensions/cpp/syntaxes/c.json index c81bd51eadc..d02d09bdaeb 100644 --- a/extensions/cpp/syntaxes/c.json +++ b/extensions/cpp/syntaxes/c.json @@ -780,7 +780,7 @@ }, "patterns": [ { - "begin": "\\G", + "begin": "\\G(?=.)(?!//|/\\*(?!.*\\\\\\s*\\n))", "end": "(?=//)|(?=/\\*(?!.*\\\\\\s*\\n))|(? Date: Wed, 4 Oct 2017 18:17:21 +0200 Subject: [PATCH 025/158] update php colorizer tests --- .../colorize-results/issue-28354_php.json | 6 +-- .../php/test/colorize-results/test_php.json | 52 +++++++++---------- 2 files changed, 29 insertions(+), 29 deletions(-) diff --git a/extensions/php/test/colorize-results/issue-28354_php.json b/extensions/php/test/colorize-results/issue-28354_php.json index 10314265464..553ade314b5 100644 --- a/extensions/php/test/colorize-results/issue-28354_php.json +++ b/extensions/php/test/colorize-results/issue-28354_php.json @@ -89,7 +89,7 @@ }, { "c": "foreach", - "t": "text.html.php meta.embedded.block.html source.js meta.embedded.block.php source.php keyword.control.php", + "t": "text.html.php meta.embedded.block.html source.js meta.embedded.block.php source.php keyword.control.foreach.php", "r": { "dark_plus": "keyword.control: #C586C0", "light_plus": "keyword.control: #AF00DB", @@ -210,7 +210,7 @@ }, { "c": "{", - "t": "text.html.php meta.embedded.block.html source.js meta.embedded.block.php source.php punctuation.section.scope.begin.php", + "t": "text.html.php meta.embedded.block.html source.js meta.embedded.block.php source.php punctuation.definition.begin.bracket.curly.php", "r": { "dark_plus": "meta.embedded: #D4D4D4", "light_plus": "meta.embedded: #000000", @@ -430,7 +430,7 @@ }, { "c": "}", - "t": "text.html.php meta.embedded.block.html source.js meta.embedded.block.php source.php punctuation.section.scope.end.php", + "t": "text.html.php meta.embedded.block.html source.js meta.embedded.block.php source.php punctuation.definition.end.bracket.curly.php", "r": { "dark_plus": "meta.embedded: #D4D4D4", "light_plus": "meta.embedded: #000000", diff --git a/extensions/php/test/colorize-results/test_php.json b/extensions/php/test/colorize-results/test_php.json index 5f8cff26aa6..4cb58182b1a 100644 --- a/extensions/php/test/colorize-results/test_php.json +++ b/extensions/php/test/colorize-results/test_php.json @@ -298,7 +298,7 @@ }, { "c": "{", - "t": "text.html.php meta.embedded.block.php source.php punctuation.section.scope.begin.php", + "t": "text.html.php meta.embedded.block.php source.php punctuation.definition.begin.bracket.curly.php", "r": { "dark_plus": "meta.embedded: #D4D4D4", "light_plus": "meta.embedded: #000000", @@ -353,7 +353,7 @@ }, { "c": "}", - "t": "text.html.php meta.embedded.block.php source.php punctuation.section.scope.end.php", + "t": "text.html.php meta.embedded.block.php source.php punctuation.definition.end.bracket.curly.php", "r": { "dark_plus": "meta.embedded: #D4D4D4", "light_plus": "meta.embedded: #000000", @@ -1057,7 +1057,7 @@ }, { "c": "for", - "t": "text.html.php meta.embedded.block.php source.php keyword.control.php", + "t": "text.html.php meta.embedded.block.php source.php keyword.control.for.php", "r": { "dark_plus": "keyword.control: #C586C0", "light_plus": "keyword.control: #AF00DB", @@ -1134,7 +1134,7 @@ }, { "c": "0", - "t": "text.html.php meta.embedded.block.php source.php constant.numeric.php", + "t": "text.html.php meta.embedded.block.php source.php constant.numeric.decimal.php", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -1222,7 +1222,7 @@ }, { "c": "52", - "t": "text.html.php meta.embedded.block.php source.php constant.numeric.php", + "t": "text.html.php meta.embedded.block.php source.php constant.numeric.decimal.php", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -1310,7 +1310,7 @@ }, { "c": "{", - "t": "text.html.php meta.embedded.block.php source.php punctuation.section.scope.begin.php", + "t": "text.html.php meta.embedded.block.php source.php punctuation.definition.begin.bracket.curly.php", "r": { "dark_plus": "meta.embedded: #D4D4D4", "light_plus": "meta.embedded: #000000", @@ -1629,7 +1629,7 @@ }, { "c": "if", - "t": "text.html.php meta.embedded.block.php source.php keyword.control.php", + "t": "text.html.php meta.embedded.block.php source.php keyword.control.if.php", "r": { "dark_plus": "keyword.control: #C586C0", "light_plus": "keyword.control: #AF00DB", @@ -1794,7 +1794,7 @@ }, { "c": "{", - "t": "text.html.php meta.embedded.block.php source.php punctuation.section.scope.begin.php", + "t": "text.html.php meta.embedded.block.php source.php punctuation.definition.begin.bracket.curly.php", "r": { "dark_plus": "meta.embedded: #D4D4D4", "light_plus": "meta.embedded: #000000", @@ -1871,7 +1871,7 @@ }, { "c": "}", - "t": "text.html.php meta.embedded.block.php source.php punctuation.section.scope.end.php", + "t": "text.html.php meta.embedded.block.php source.php punctuation.definition.end.bracket.curly.php", "r": { "dark_plus": "meta.embedded: #D4D4D4", "light_plus": "meta.embedded: #000000", @@ -1893,7 +1893,7 @@ }, { "c": "else", - "t": "text.html.php meta.embedded.block.php source.php keyword.control.php", + "t": "text.html.php meta.embedded.block.php source.php keyword.control.else.php", "r": { "dark_plus": "keyword.control: #C586C0", "light_plus": "keyword.control: #AF00DB", @@ -1915,7 +1915,7 @@ }, { "c": "{", - "t": "text.html.php meta.embedded.block.php source.php punctuation.section.scope.begin.php", + "t": "text.html.php meta.embedded.block.php source.php punctuation.definition.begin.bracket.curly.php", "r": { "dark_plus": "meta.embedded: #D4D4D4", "light_plus": "meta.embedded: #000000", @@ -2245,7 +2245,7 @@ }, { "c": "}", - "t": "text.html.php meta.embedded.block.php source.php punctuation.section.scope.end.php", + "t": "text.html.php meta.embedded.block.php source.php punctuation.definition.end.bracket.curly.php", "r": { "dark_plus": "meta.embedded: #D4D4D4", "light_plus": "meta.embedded: #000000", @@ -2267,7 +2267,7 @@ }, { "c": "}", - "t": "text.html.php meta.embedded.block.php source.php punctuation.section.scope.end.php", + "t": "text.html.php meta.embedded.block.php source.php punctuation.definition.end.bracket.curly.php", "r": { "dark_plus": "meta.embedded: #D4D4D4", "light_plus": "meta.embedded: #000000", @@ -2487,7 +2487,7 @@ }, { "c": "51", - "t": "text.html.php meta.embedded.block.php source.php constant.numeric.php", + "t": "text.html.php meta.embedded.block.php source.php constant.numeric.decimal.php", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -2685,7 +2685,7 @@ }, { "c": "for", - "t": "text.html.php meta.embedded.block.php source.php keyword.control.php", + "t": "text.html.php meta.embedded.block.php source.php keyword.control.for.php", "r": { "dark_plus": "keyword.control: #C586C0", "light_plus": "keyword.control: #AF00DB", @@ -2773,7 +2773,7 @@ }, { "c": "0", - "t": "text.html.php meta.embedded.block.php source.php constant.numeric.php", + "t": "text.html.php meta.embedded.block.php source.php constant.numeric.decimal.php", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -2861,7 +2861,7 @@ }, { "c": "52", - "t": "text.html.php meta.embedded.block.php source.php constant.numeric.php", + "t": "text.html.php meta.embedded.block.php source.php constant.numeric.decimal.php", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -2949,7 +2949,7 @@ }, { "c": "{", - "t": "text.html.php meta.embedded.block.php source.php punctuation.section.scope.begin.php", + "t": "text.html.php meta.embedded.block.php source.php punctuation.definition.begin.bracket.curly.php", "r": { "dark_plus": "meta.embedded: #D4D4D4", "light_plus": "meta.embedded: #000000", @@ -2971,7 +2971,7 @@ }, { "c": "if", - "t": "text.html.php meta.embedded.block.php source.php keyword.control.php", + "t": "text.html.php meta.embedded.block.php source.php keyword.control.if.php", "r": { "dark_plus": "keyword.control: #C586C0", "light_plus": "keyword.control: #AF00DB", @@ -3059,7 +3059,7 @@ }, { "c": "52", - "t": "text.html.php meta.embedded.block.php source.php constant.numeric.php", + "t": "text.html.php meta.embedded.block.php source.php constant.numeric.decimal.php", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -3092,7 +3092,7 @@ }, { "c": "{", - "t": "text.html.php meta.embedded.block.php source.php punctuation.section.scope.begin.php", + "t": "text.html.php meta.embedded.block.php source.php punctuation.definition.begin.bracket.curly.php", "r": { "dark_plus": "meta.embedded: #D4D4D4", "light_plus": "meta.embedded: #000000", @@ -3169,7 +3169,7 @@ }, { "c": "0", - "t": "text.html.php meta.embedded.block.php source.php constant.numeric.php", + "t": "text.html.php meta.embedded.block.php source.php constant.numeric.decimal.php", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -3202,7 +3202,7 @@ }, { "c": "}", - "t": "text.html.php meta.embedded.block.php source.php punctuation.section.scope.end.php", + "t": "text.html.php meta.embedded.block.php source.php punctuation.definition.end.bracket.curly.php", "r": { "dark_plus": "meta.embedded: #D4D4D4", "light_plus": "meta.embedded: #000000", @@ -3444,7 +3444,7 @@ }, { "c": "}", - "t": "text.html.php meta.embedded.block.php source.php punctuation.section.scope.end.php", + "t": "text.html.php meta.embedded.block.php source.php punctuation.definition.end.bracket.curly.php", "r": { "dark_plus": "meta.embedded: #D4D4D4", "light_plus": "meta.embedded: #000000", @@ -3521,7 +3521,7 @@ }, { "c": "{", - "t": "text.html.php meta.embedded.block.php source.php punctuation.section.scope.begin.php", + "t": "text.html.php meta.embedded.block.php source.php punctuation.definition.begin.bracket.curly.php", "r": { "dark_plus": "meta.embedded: #D4D4D4", "light_plus": "meta.embedded: #000000", @@ -3532,7 +3532,7 @@ }, { "c": "}", - "t": "text.html.php meta.embedded.block.php source.php punctuation.section.scope.end.php", + "t": "text.html.php meta.embedded.block.php source.php punctuation.definition.end.bracket.curly.php", "r": { "dark_plus": "meta.embedded: #D4D4D4", "light_plus": "meta.embedded: #000000", From d3e9b801ca010fe12dd7b1a2206154ca947b2a78 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 4 Oct 2017 18:44:56 +0200 Subject: [PATCH 026/158] fixes #35584 --- .../workbench/parts/files/browser/media/explorerviewlet.css | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/parts/files/browser/media/explorerviewlet.css b/src/vs/workbench/parts/files/browser/media/explorerviewlet.css index 13ac78f5640..749714d7782 100644 --- a/src/vs/workbench/parts/files/browser/media/explorerviewlet.css +++ b/src/vs/workbench/parts/files/browser/media/explorerviewlet.css @@ -50,7 +50,7 @@ } .explorer-viewlet .explorer-open-editors .monaco-tree .monaco-tree-row > .content > .monaco-action-bar { - display: none; + visibility: hidden; } .explorer-viewlet .panel-header .count { @@ -109,7 +109,7 @@ .explorer-viewlet .explorer-open-editors .monaco-tree .monaco-tree-row:hover > .content .monaco-action-bar, .explorer-viewlet .explorer-open-editors .monaco-tree.focused .monaco-tree-row.focused > .content .monaco-action-bar, .explorer-viewlet .explorer-open-editors .monaco-tree .monaco-tree-row > .content.dirty > .monaco-action-bar { - display: inherit; + visibility: visible; } .explorer-viewlet .explorer-open-editors .monaco-tree .monaco-tree-row > .content .monaco-action-bar .action-label { From 8996ce59c75602ee751310960105c7f424c09f93 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Wed, 4 Oct 2017 09:53:27 -0700 Subject: [PATCH 027/158] Add snapcraft.yaml to copyright filter --- build/gulpfile.hygiene.js | 1 + 1 file changed, 1 insertion(+) diff --git a/build/gulpfile.hygiene.js b/build/gulpfile.hygiene.js index 9c7345b2e35..ee780903b6b 100644 --- a/build/gulpfile.hygiene.js +++ b/build/gulpfile.hygiene.js @@ -94,6 +94,7 @@ const copyrightFilter = [ '!**/*.opts', '!**/*.disabled', '!build/**/*.init', + '!resources/linux/snap/snapcraft.yaml', '!resources/win32/bin/code.js', '!extensions/markdown/media/tomorrow.css', '!extensions/html/server/src/modes/typescript/*' From b2d79cf79a472405ff24e09ce6504718e70b6e9e Mon Sep 17 00:00:00 2001 From: Rob Lourens Date: Wed, 4 Oct 2017 10:08:35 -0700 Subject: [PATCH 028/158] Bump node-debug2 (loc) --- build/gulpfile.vscode.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/gulpfile.vscode.js b/build/gulpfile.vscode.js index 3600062cd1e..cd494ee886f 100644 --- a/build/gulpfile.vscode.js +++ b/build/gulpfile.vscode.js @@ -46,7 +46,7 @@ const nodeModules = ['electron', 'original-fs'] const builtInExtensions = [ { name: 'ms-vscode.node-debug', version: '1.17.17' }, - { name: 'ms-vscode.node-debug2', version: '1.17.5' } + { name: 'ms-vscode.node-debug2', version: '1.17.6' } ]; const excludedExtensions = [ From 33dac9c9eb6fd8728eeef44dda3a7a17b2d5f182 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Wed, 4 Oct 2017 10:15:41 -0700 Subject: [PATCH 029/158] Move terminal command registration to new file --- .../electron-browser/terminal.contribution.ts | 104 +--------------- .../electron-browser/terminalCommands.ts | 116 ++++++++++++++++++ 2 files changed, 121 insertions(+), 99 deletions(-) create mode 100644 src/vs/workbench/parts/terminal/electron-browser/terminalCommands.ts diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.ts b/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.ts index ceb6cca22b9..d7b5b1f5b25 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.ts +++ b/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.ts @@ -11,20 +11,18 @@ import * as debugActions from 'vs/workbench/parts/debug/browser/debugActions'; import * as nls from 'vs/nls'; import * as panel from 'vs/workbench/browser/panel'; import * as platform from 'vs/base/common/platform'; +import * as terminalCommands from 'vs/workbench/parts/terminal/electron-browser/terminalCommands'; import { Extensions, IConfigurationRegistry } from 'vs/platform/configuration/common/configurationRegistry'; -import { ITerminalService, KEYBINDING_CONTEXT_TERMINAL_FOCUS, KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_INPUT_FOCUSED, KEYBINDING_CONTEXT_TERMINAL_TEXT_SELECTED, TERMINAL_PANEL_ID, TERMINAL_DEFAULT_RIGHT_CLICK_COPY_PASTE, KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_VISIBLE, TerminalCursorStyle } from 'vs/workbench/parts/terminal/common/terminal'; +import { ITerminalService, TERMINAL_PANEL_ID, TERMINAL_DEFAULT_RIGHT_CLICK_COPY_PASTE, TerminalCursorStyle } from 'vs/workbench/parts/terminal/common/terminal'; import { TERMINAL_DEFAULT_SHELL_LINUX, TERMINAL_DEFAULT_SHELL_OSX, TERMINAL_DEFAULT_SHELL_WINDOWS } from 'vs/workbench/parts/terminal/electron-browser/terminal'; import { IWorkbenchActionRegistry, Extensions as ActionExtensions } from 'vs/workbench/common/actions'; -import { KeyCode, KeyMod } from 'vs/base/common/keyCodes'; -import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; -import { KillTerminalAction, CopyTerminalSelectionAction, CreateNewTerminalAction, FocusActiveTerminalAction, FocusNextTerminalAction, FocusPreviousTerminalAction, FocusTerminalAtIndexAction, SelectDefaultShellWindowsTerminalAction, RunSelectedTextInTerminalAction, RunActiveFileInTerminalAction, ScrollDownTerminalAction, ScrollDownPageTerminalAction, ScrollToBottomTerminalAction, ScrollUpTerminalAction, ScrollUpPageTerminalAction, ScrollToTopTerminalAction, TerminalPasteAction, ToggleTerminalAction, ClearTerminalAction, AllowWorkspaceShellTerminalCommand, DisallowWorkspaceShellTerminalCommand, RenameTerminalAction, SelectAllTerminalAction, FocusTerminalFindWidgetAction, HideTerminalFindWidgetAction, ShowNextFindTermTerminalFindWidgetAction, ShowPreviousFindTermTerminalFindWidgetAction, DeleteWordLeftTerminalAction, DeleteWordRightTerminalAction, QuickOpenActionTermContributor, QuickOpenTermAction, TERMINAL_PICKER_PREFIX } from 'vs/workbench/parts/terminal/electron-browser/terminalActions'; +import { KillTerminalAction, CopyTerminalSelectionAction, CreateNewTerminalAction, FocusActiveTerminalAction, FocusNextTerminalAction, FocusPreviousTerminalAction, FocusTerminalAtIndexAction, RunSelectedTextInTerminalAction, RunActiveFileInTerminalAction, ScrollDownTerminalAction, ScrollDownPageTerminalAction, ScrollToBottomTerminalAction, ScrollUpTerminalAction, ScrollUpPageTerminalAction, ScrollToTopTerminalAction, TerminalPasteAction, ToggleTerminalAction, ClearTerminalAction, SelectAllTerminalAction, FocusTerminalFindWidgetAction, HideTerminalFindWidgetAction, ShowNextFindTermTerminalFindWidgetAction, ShowPreviousFindTermTerminalFindWidgetAction, DeleteWordLeftTerminalAction, DeleteWordRightTerminalAction, QuickOpenActionTermContributor, QuickOpenTermAction, TERMINAL_PICKER_PREFIX } from 'vs/workbench/parts/terminal/electron-browser/terminalActions'; import { Registry } from 'vs/platform/registry/common/platform'; import { ShowAllCommandsAction } from 'vs/workbench/parts/quickopen/browser/commandsHandler'; import { SyncActionDescriptor } from 'vs/platform/actions/common/actions'; import { TerminalService } from 'vs/workbench/parts/terminal/electron-browser/terminalService'; import { ToggleTabFocusModeAction } from 'vs/editor/contrib/toggleTabFocusMode/common/toggleTabFocusMode'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; -import { KeybindingsRegistry } from 'vs/platform/keybinding/common/keybindingsRegistry'; import { OpenNextRecentlyUsedEditorInGroupAction, OpenPreviousRecentlyUsedEditorInGroupAction, FocusActiveGroupAction, FocusFirstGroupAction, FocusSecondGroupAction, FocusThirdGroupAction } from 'vs/workbench/browser/parts/editor/editorActions'; import { EDITOR_FONT_DEFAULTS } from 'vs/editor/common/config/editorOptions'; import { registerColors } from './terminalColorRegistry'; @@ -266,99 +264,7 @@ registerSingleton(ITerminalService, TerminalService); ToggleTerminalAction.ID )); -// On mac cmd+` is reserved to cycle between windows, that's why the keybindings use WinCtrl -const category = nls.localize('terminalCategory', "Terminal"); -let actionRegistry = Registry.as(ActionExtensions.WorkbenchActions); -actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(KillTerminalAction, KillTerminalAction.ID, KillTerminalAction.LABEL), 'Terminal: Kill the Active Terminal Instance', category); -actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(CopyTerminalSelectionAction, CopyTerminalSelectionAction.ID, CopyTerminalSelectionAction.LABEL, { - primary: KeyMod.CtrlCmd | KeyCode.KEY_C, - linux: { primary: KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.KEY_C } -}, ContextKeyExpr.and(KEYBINDING_CONTEXT_TERMINAL_TEXT_SELECTED, KEYBINDING_CONTEXT_TERMINAL_FOCUS)), 'Terminal: Copy Selection', category); -actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(CreateNewTerminalAction, CreateNewTerminalAction.ID, CreateNewTerminalAction.LABEL, { - primary: KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.US_BACKTICK, - mac: { primary: KeyMod.WinCtrl | KeyMod.Shift | KeyCode.US_BACKTICK } -}), 'Terminal: Create New Integrated Terminal', category); -actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(FocusActiveTerminalAction, FocusActiveTerminalAction.ID, FocusActiveTerminalAction.LABEL), 'Terminal: Focus Terminal', category); -actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(FocusNextTerminalAction, FocusNextTerminalAction.ID, FocusNextTerminalAction.LABEL), 'Terminal: Focus Next Terminal', category); -actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(FocusPreviousTerminalAction, FocusPreviousTerminalAction.ID, FocusPreviousTerminalAction.LABEL), 'Terminal: Focus Previous Terminal', category); -for (let i = 1; i < 10; i++) { - actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(FocusTerminalAtIndexAction, FocusTerminalAtIndexAction.getId(i), FocusTerminalAtIndexAction.getLabel(i)), 'Terminal: Focus Terminal ' + i, category); -} -actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(TerminalPasteAction, TerminalPasteAction.ID, TerminalPasteAction.LABEL, { - primary: KeyMod.CtrlCmd | KeyCode.KEY_V, - linux: { primary: KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.KEY_V }, - // Don't apply to Mac since cmd+v works - mac: { primary: null } -}, KEYBINDING_CONTEXT_TERMINAL_FOCUS), 'Terminal: Paste into Active Terminal', category); -actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(SelectAllTerminalAction, SelectAllTerminalAction.ID, SelectAllTerminalAction.LABEL, { - // Don't use ctrl+a by default as that would override the common go to start - // of prompt shell binding - primary: null, - // Technically this doesn't need to be here as it will fall back to this - // behavior anyway when handed to xterm.js, having this handled by VS Code - // makes it easier for users to see how it works though. - mac: { primary: KeyMod.CtrlCmd | KeyCode.KEY_A } -}, KEYBINDING_CONTEXT_TERMINAL_FOCUS), 'Terminal: Select All', category); -actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(RunSelectedTextInTerminalAction, RunSelectedTextInTerminalAction.ID, RunSelectedTextInTerminalAction.LABEL), 'Terminal: Run Selected Text In Active Terminal', category); -actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(RunActiveFileInTerminalAction, RunActiveFileInTerminalAction.ID, RunActiveFileInTerminalAction.LABEL), 'Terminal: Run Active File In Active Terminal', category); -actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(ToggleTerminalAction, ToggleTerminalAction.ID, ToggleTerminalAction.LABEL, { - primary: KeyMod.CtrlCmd | KeyCode.US_BACKTICK, - mac: { primary: KeyMod.WinCtrl | KeyCode.US_BACKTICK } -}), 'View: Toggle Integrated Terminal', nls.localize('viewCategory', "View")); -actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(ScrollDownTerminalAction, ScrollDownTerminalAction.ID, ScrollDownTerminalAction.LABEL, { - primary: KeyMod.CtrlCmd | KeyCode.DownArrow, - linux: { primary: KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.DownArrow } -}, KEYBINDING_CONTEXT_TERMINAL_FOCUS), 'Terminal: Scroll Down (Line)', category); -actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(ScrollDownPageTerminalAction, ScrollDownPageTerminalAction.ID, ScrollDownPageTerminalAction.LABEL, { - primary: KeyMod.Shift | KeyCode.PageDown, - mac: { primary: KeyCode.PageDown } -}, KEYBINDING_CONTEXT_TERMINAL_FOCUS), 'Terminal: Scroll Down (Page)', category); -actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(ScrollToBottomTerminalAction, ScrollToBottomTerminalAction.ID, ScrollToBottomTerminalAction.LABEL, { - primary: KeyMod.CtrlCmd | KeyCode.End, - linux: { primary: KeyMod.Shift | KeyCode.End } -}, KEYBINDING_CONTEXT_TERMINAL_FOCUS), 'Terminal: Scroll to Bottom', category); -actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(ScrollUpTerminalAction, ScrollUpTerminalAction.ID, ScrollUpTerminalAction.LABEL, { - primary: KeyMod.CtrlCmd | KeyCode.UpArrow, - linux: { primary: KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.UpArrow }, -}, KEYBINDING_CONTEXT_TERMINAL_FOCUS), 'Terminal: Scroll Up (Line)', category); -actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(ScrollUpPageTerminalAction, ScrollUpPageTerminalAction.ID, ScrollUpPageTerminalAction.LABEL, { - primary: KeyMod.Shift | KeyCode.PageUp, - mac: { primary: KeyCode.PageUp } -}, KEYBINDING_CONTEXT_TERMINAL_FOCUS), 'Terminal: Scroll Up (Page)', category); -actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(ScrollToTopTerminalAction, ScrollToTopTerminalAction.ID, ScrollToTopTerminalAction.LABEL, { - primary: KeyMod.CtrlCmd | KeyCode.Home, - linux: { primary: KeyMod.Shift | KeyCode.Home } -}, KEYBINDING_CONTEXT_TERMINAL_FOCUS), 'Terminal: Scroll to Top', category); -actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(ClearTerminalAction, ClearTerminalAction.ID, ClearTerminalAction.LABEL, { - primary: KeyMod.CtrlCmd | KeyCode.KEY_K, - linux: { primary: null } -}, KEYBINDING_CONTEXT_TERMINAL_FOCUS, KeybindingsRegistry.WEIGHT.workbenchContrib(1)), 'Terminal: Clear', category); -if (platform.isWindows) { - actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(SelectDefaultShellWindowsTerminalAction, SelectDefaultShellWindowsTerminalAction.ID, SelectDefaultShellWindowsTerminalAction.LABEL), 'Terminal: Select Default Shell', category); -} -actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(AllowWorkspaceShellTerminalCommand, AllowWorkspaceShellTerminalCommand.ID, AllowWorkspaceShellTerminalCommand.LABEL), 'Terminal: Allow Workspace Shell Configuration', category); -actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(DisallowWorkspaceShellTerminalCommand, DisallowWorkspaceShellTerminalCommand.ID, DisallowWorkspaceShellTerminalCommand.LABEL), 'Terminal: Disallow Workspace Shell Configuration', category); -actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(RenameTerminalAction, RenameTerminalAction.ID, RenameTerminalAction.LABEL), 'Terminal: Rename', category); -actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(FocusTerminalFindWidgetAction, FocusTerminalFindWidgetAction.ID, FocusTerminalFindWidgetAction.LABEL, { - primary: KeyMod.CtrlCmd | KeyCode.KEY_F -}, KEYBINDING_CONTEXT_TERMINAL_FOCUS), 'Terminal: Focus Find Widget', category); -actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(HideTerminalFindWidgetAction, HideTerminalFindWidgetAction.ID, HideTerminalFindWidgetAction.LABEL, { - primary: KeyCode.Escape, - secondary: [KeyMod.Shift | KeyCode.Escape] -}, ContextKeyExpr.and(KEYBINDING_CONTEXT_TERMINAL_FOCUS, KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_VISIBLE)), 'Terminal: Hide Find Widget', category); -actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(ShowNextFindTermTerminalFindWidgetAction, ShowNextFindTermTerminalFindWidgetAction.ID, ShowNextFindTermTerminalFindWidgetAction.LABEL, { - primary: KeyMod.Alt | KeyCode.DownArrow -}, ContextKeyExpr.and(KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_INPUT_FOCUSED, KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_VISIBLE)), 'Terminal: Show Next Find Term', category); -actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(ShowPreviousFindTermTerminalFindWidgetAction, ShowPreviousFindTermTerminalFindWidgetAction.ID, ShowPreviousFindTermTerminalFindWidgetAction.LABEL, { - primary: KeyMod.Alt | KeyCode.UpArrow -}, ContextKeyExpr.and(KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_INPUT_FOCUSED, KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_VISIBLE)), 'Terminal: Show Previous Find Term', category); -actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(DeleteWordLeftTerminalAction, DeleteWordLeftTerminalAction.ID, DeleteWordLeftTerminalAction.LABEL, { - primary: KeyMod.CtrlCmd | KeyCode.Backspace, - mac: { primary: KeyMod.Alt | KeyCode.Backspace } -}, KEYBINDING_CONTEXT_TERMINAL_FOCUS), 'Terminal: Delete Word Left', category); -actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(DeleteWordRightTerminalAction, DeleteWordRightTerminalAction.ID, DeleteWordRightTerminalAction.LABEL, { - primary: KeyMod.CtrlCmd | KeyCode.Delete, - mac: { primary: KeyMod.Alt | KeyCode.Delete } -}, KEYBINDING_CONTEXT_TERMINAL_FOCUS), 'Terminal: Delete Word Right', category); +terminalCommands.setup(); + registerColors(); diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminalCommands.ts b/src/vs/workbench/parts/terminal/electron-browser/terminalCommands.ts new file mode 100644 index 00000000000..bec1911afd0 --- /dev/null +++ b/src/vs/workbench/parts/terminal/electron-browser/terminalCommands.ts @@ -0,0 +1,116 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import * as nls from 'vs/nls'; +import * as platform from 'vs/base/common/platform'; +import { KEYBINDING_CONTEXT_TERMINAL_FOCUS, KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_INPUT_FOCUSED, KEYBINDING_CONTEXT_TERMINAL_TEXT_SELECTED, KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_VISIBLE } from 'vs/workbench/parts/terminal/common/terminal'; +import { IWorkbenchActionRegistry, Extensions as ActionExtensions } from 'vs/workbench/common/actions'; +import { KeyCode, KeyMod } from 'vs/base/common/keyCodes'; +import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; +import { KillTerminalAction, CopyTerminalSelectionAction, CreateNewTerminalAction, FocusActiveTerminalAction, FocusNextTerminalAction, FocusPreviousTerminalAction, FocusTerminalAtIndexAction, SelectDefaultShellWindowsTerminalAction, RunSelectedTextInTerminalAction, RunActiveFileInTerminalAction, ScrollDownTerminalAction, ScrollDownPageTerminalAction, ScrollToBottomTerminalAction, ScrollUpTerminalAction, ScrollUpPageTerminalAction, ScrollToTopTerminalAction, TerminalPasteAction, ToggleTerminalAction, ClearTerminalAction, AllowWorkspaceShellTerminalCommand, DisallowWorkspaceShellTerminalCommand, RenameTerminalAction, SelectAllTerminalAction, FocusTerminalFindWidgetAction, HideTerminalFindWidgetAction, ShowNextFindTermTerminalFindWidgetAction, ShowPreviousFindTermTerminalFindWidgetAction, DeleteWordLeftTerminalAction, DeleteWordRightTerminalAction } from 'vs/workbench/parts/terminal/electron-browser/terminalActions'; +import { Registry } from 'vs/platform/registry/common/platform'; +import { SyncActionDescriptor } from 'vs/platform/actions/common/actions'; +import { KeybindingsRegistry } from 'vs/platform/keybinding/common/keybindingsRegistry'; + +export function setup(): void { + registerCommands(); +} + +function registerCommands(): void { + // On mac cmd+` is reserved to cycle between windows, that's why the keybindings use WinCtrl + const category = nls.localize('terminalCategory', "Terminal"); + let actionRegistry = Registry.as(ActionExtensions.WorkbenchActions); + actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(KillTerminalAction, KillTerminalAction.ID, KillTerminalAction.LABEL), 'Terminal: Kill the Active Terminal Instance', category); + actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(CopyTerminalSelectionAction, CopyTerminalSelectionAction.ID, CopyTerminalSelectionAction.LABEL, { + primary: KeyMod.CtrlCmd | KeyCode.KEY_C, + linux: { primary: KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.KEY_C } + }, ContextKeyExpr.and(KEYBINDING_CONTEXT_TERMINAL_TEXT_SELECTED, KEYBINDING_CONTEXT_TERMINAL_FOCUS)), 'Terminal: Copy Selection', category); + actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(CreateNewTerminalAction, CreateNewTerminalAction.ID, CreateNewTerminalAction.LABEL, { + primary: KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.US_BACKTICK, + mac: { primary: KeyMod.WinCtrl | KeyMod.Shift | KeyCode.US_BACKTICK } + }), 'Terminal: Create New Integrated Terminal', category); + actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(FocusActiveTerminalAction, FocusActiveTerminalAction.ID, FocusActiveTerminalAction.LABEL), 'Terminal: Focus Terminal', category); + actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(FocusNextTerminalAction, FocusNextTerminalAction.ID, FocusNextTerminalAction.LABEL), 'Terminal: Focus Next Terminal', category); + actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(FocusPreviousTerminalAction, FocusPreviousTerminalAction.ID, FocusPreviousTerminalAction.LABEL), 'Terminal: Focus Previous Terminal', category); + for (let i = 1; i < 10; i++) { + actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(FocusTerminalAtIndexAction, FocusTerminalAtIndexAction.getId(i), FocusTerminalAtIndexAction.getLabel(i)), 'Terminal: Focus Terminal ' + i, category); + } + actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(TerminalPasteAction, TerminalPasteAction.ID, TerminalPasteAction.LABEL, { + primary: KeyMod.CtrlCmd | KeyCode.KEY_V, + linux: { primary: KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.KEY_V }, + // Don't apply to Mac since cmd+v works + mac: { primary: null } + }, KEYBINDING_CONTEXT_TERMINAL_FOCUS), 'Terminal: Paste into Active Terminal', category); + actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(SelectAllTerminalAction, SelectAllTerminalAction.ID, SelectAllTerminalAction.LABEL, { + // Don't use ctrl+a by default as that would override the common go to start + // of prompt shell binding + primary: null, + // Technically this doesn't need to be here as it will fall back to this + // behavior anyway when handed to xterm.js, having this handled by VS Code + // makes it easier for users to see how it works though. + mac: { primary: KeyMod.CtrlCmd | KeyCode.KEY_A } + }, KEYBINDING_CONTEXT_TERMINAL_FOCUS), 'Terminal: Select All', category); + actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(RunSelectedTextInTerminalAction, RunSelectedTextInTerminalAction.ID, RunSelectedTextInTerminalAction.LABEL), 'Terminal: Run Selected Text In Active Terminal', category); + actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(RunActiveFileInTerminalAction, RunActiveFileInTerminalAction.ID, RunActiveFileInTerminalAction.LABEL), 'Terminal: Run Active File In Active Terminal', category); + actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(ToggleTerminalAction, ToggleTerminalAction.ID, ToggleTerminalAction.LABEL, { + primary: KeyMod.CtrlCmd | KeyCode.US_BACKTICK, + mac: { primary: KeyMod.WinCtrl | KeyCode.US_BACKTICK } + }), 'View: Toggle Integrated Terminal', nls.localize('viewCategory', "View")); + actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(ScrollDownTerminalAction, ScrollDownTerminalAction.ID, ScrollDownTerminalAction.LABEL, { + primary: KeyMod.CtrlCmd | KeyCode.DownArrow, + linux: { primary: KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.DownArrow } + }, KEYBINDING_CONTEXT_TERMINAL_FOCUS), 'Terminal: Scroll Down (Line)', category); + actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(ScrollDownPageTerminalAction, ScrollDownPageTerminalAction.ID, ScrollDownPageTerminalAction.LABEL, { + primary: KeyMod.Shift | KeyCode.PageDown, + mac: { primary: KeyCode.PageDown } + }, KEYBINDING_CONTEXT_TERMINAL_FOCUS), 'Terminal: Scroll Down (Page)', category); + actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(ScrollToBottomTerminalAction, ScrollToBottomTerminalAction.ID, ScrollToBottomTerminalAction.LABEL, { + primary: KeyMod.CtrlCmd | KeyCode.End, + linux: { primary: KeyMod.Shift | KeyCode.End } + }, KEYBINDING_CONTEXT_TERMINAL_FOCUS), 'Terminal: Scroll to Bottom', category); + actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(ScrollUpTerminalAction, ScrollUpTerminalAction.ID, ScrollUpTerminalAction.LABEL, { + primary: KeyMod.CtrlCmd | KeyCode.UpArrow, + linux: { primary: KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.UpArrow }, + }, KEYBINDING_CONTEXT_TERMINAL_FOCUS), 'Terminal: Scroll Up (Line)', category); + actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(ScrollUpPageTerminalAction, ScrollUpPageTerminalAction.ID, ScrollUpPageTerminalAction.LABEL, { + primary: KeyMod.Shift | KeyCode.PageUp, + mac: { primary: KeyCode.PageUp } + }, KEYBINDING_CONTEXT_TERMINAL_FOCUS), 'Terminal: Scroll Up (Page)', category); + actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(ScrollToTopTerminalAction, ScrollToTopTerminalAction.ID, ScrollToTopTerminalAction.LABEL, { + primary: KeyMod.CtrlCmd | KeyCode.Home, + linux: { primary: KeyMod.Shift | KeyCode.Home } + }, KEYBINDING_CONTEXT_TERMINAL_FOCUS), 'Terminal: Scroll to Top', category); + actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(ClearTerminalAction, ClearTerminalAction.ID, ClearTerminalAction.LABEL, { + primary: KeyMod.CtrlCmd | KeyCode.KEY_K, + linux: { primary: null } + }, KEYBINDING_CONTEXT_TERMINAL_FOCUS, KeybindingsRegistry.WEIGHT.workbenchContrib(1)), 'Terminal: Clear', category); + if (platform.isWindows) { + actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(SelectDefaultShellWindowsTerminalAction, SelectDefaultShellWindowsTerminalAction.ID, SelectDefaultShellWindowsTerminalAction.LABEL), 'Terminal: Select Default Shell', category); + } + actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(AllowWorkspaceShellTerminalCommand, AllowWorkspaceShellTerminalCommand.ID, AllowWorkspaceShellTerminalCommand.LABEL), 'Terminal: Allow Workspace Shell Configuration', category); + actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(DisallowWorkspaceShellTerminalCommand, DisallowWorkspaceShellTerminalCommand.ID, DisallowWorkspaceShellTerminalCommand.LABEL), 'Terminal: Disallow Workspace Shell Configuration', category); + actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(RenameTerminalAction, RenameTerminalAction.ID, RenameTerminalAction.LABEL), 'Terminal: Rename', category); + actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(FocusTerminalFindWidgetAction, FocusTerminalFindWidgetAction.ID, FocusTerminalFindWidgetAction.LABEL, { + primary: KeyMod.CtrlCmd | KeyCode.KEY_F + }, KEYBINDING_CONTEXT_TERMINAL_FOCUS), 'Terminal: Focus Find Widget', category); + actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(HideTerminalFindWidgetAction, HideTerminalFindWidgetAction.ID, HideTerminalFindWidgetAction.LABEL, { + primary: KeyCode.Escape, + secondary: [KeyMod.Shift | KeyCode.Escape] + }, ContextKeyExpr.and(KEYBINDING_CONTEXT_TERMINAL_FOCUS, KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_VISIBLE)), 'Terminal: Hide Find Widget', category); + actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(ShowNextFindTermTerminalFindWidgetAction, ShowNextFindTermTerminalFindWidgetAction.ID, ShowNextFindTermTerminalFindWidgetAction.LABEL, { + primary: KeyMod.Alt | KeyCode.DownArrow + }, ContextKeyExpr.and(KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_INPUT_FOCUSED, KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_VISIBLE)), 'Terminal: Show Next Find Term', category); + actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(ShowPreviousFindTermTerminalFindWidgetAction, ShowPreviousFindTermTerminalFindWidgetAction.ID, ShowPreviousFindTermTerminalFindWidgetAction.LABEL, { + primary: KeyMod.Alt | KeyCode.UpArrow + }, ContextKeyExpr.and(KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_INPUT_FOCUSED, KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_VISIBLE)), 'Terminal: Show Previous Find Term', category); + actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(DeleteWordLeftTerminalAction, DeleteWordLeftTerminalAction.ID, DeleteWordLeftTerminalAction.LABEL, { + primary: KeyMod.CtrlCmd | KeyCode.Backspace, + mac: { primary: KeyMod.Alt | KeyCode.Backspace } + }, KEYBINDING_CONTEXT_TERMINAL_FOCUS), 'Terminal: Delete Word Left', category); + actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(DeleteWordRightTerminalAction, DeleteWordRightTerminalAction.ID, DeleteWordRightTerminalAction.LABEL, { + primary: KeyMod.CtrlCmd | KeyCode.Delete, + mac: { primary: KeyMod.Alt | KeyCode.Delete } + }, KEYBINDING_CONTEXT_TERMINAL_FOCUS), 'Terminal: Delete Word Right', category); +} \ No newline at end of file From 625ef36a6c571fb75479ef1cee390e662d0aeb3d Mon Sep 17 00:00:00 2001 From: Daniel Ye Date: Tue, 3 Oct 2017 13:59:50 -0700 Subject: [PATCH 030/158] 2017-10-03. Merged in translations from Transifex. --- .../editor/contrib/links/browser/links.i18n.json | 2 +- .../menusExtensionPoint.i18n.json | 1 + .../api/browser/viewsExtensionPoint.i18n.json | 4 +++- .../browser/parts/editor/editorStatus.i18n.json | 5 ++++- .../browser/parts/views/viewsRegistry.i18n.json | 4 +++- .../electron-browser/main.contribution.i18n.json | 1 + .../electron-browser/debugService.i18n.json | 4 ++-- .../extensionTipsService.i18n.json | 2 ++ .../files/browser/files.contribution.i18n.json | 2 ++ .../scm/electron-browser/scmViewlet.i18n.json | 1 + .../electron-browser/task.contribution.i18n.json | 2 ++ .../configuration/node/configuration.i18n.json | 3 ++- .../node/configurationEditingService.i18n.json | 13 +++++++++++++ .../common/config/commonEditorConfig.i18n.json | 1 + .../menusExtensionPoint.i18n.json | 1 + .../api/browser/viewsExtensionPoint.i18n.json | 4 +++- .../browser/actions/workspaceActions.i18n.json | 3 ++- .../activitybar/activitybarActions.i18n.json | 1 + .../browser/parts/editor/editorActions.i18n.json | 1 + .../browser/parts/editor/editorStatus.i18n.json | 7 ++++++- .../browser/parts/views/viewsRegistry.i18n.json | 4 +++- .../workbench/electron-browser/actions.i18n.json | 4 +++- .../electron-browser/main.contribution.i18n.json | 7 ++++++- ...languageConfigurationExtensionPoint.i18n.json | 6 +++++- .../electron-browser/debugService.i18n.json | 2 ++ .../extensions/browser/extensionEditor.i18n.json | 7 +++++++ .../browser/extensionsActions.i18n.json | 1 + .../extensionTipsService.i18n.json | 2 ++ .../files/browser/files.contribution.i18n.json | 4 ++++ .../files/common/dirtyFilesTracker.i18n.json | 1 + .../scm/electron-browser/scmViewlet.i18n.json | 3 +++ .../electron-browser/insertSnippet.i18n.json | 4 +++- .../electron-browser/snippetsService.i18n.json | 1 + .../electron-browser/task.contribution.i18n.json | 16 ++++++++++++++++ .../terminalTaskSystem.i18n.json | 1 + .../parts/tasks/node/taskConfiguration.i18n.json | 1 + .../electron-browser/terminalActions.i18n.json | 3 ++- .../terminalColorRegistry.i18n.json | 1 + .../vs_code_welcome_page.i18n.json | 1 + .../configuration/node/configuration.i18n.json | 8 +++++++- .../node/configurationEditingService.i18n.json | 13 +++++++++++++ .../services/files/node/fileService.i18n.json | 2 ++ .../format/browser/formatActions.i18n.json | 4 ++-- .../gotoError/browser/gotoError.i18n.json | 1 + .../node/extensionManagementService.i18n.json | 1 + .../theme/common/colorExtensionPoint.i18n.json | 1 + .../activitybar/activitybarActions.i18n.json | 1 + .../workbench/electron-browser/actions.i18n.json | 3 ++- .../services/files/node/fileService.i18n.json | 1 + .../menusExtensionPoint.i18n.json | 1 + .../api/browser/viewsExtensionPoint.i18n.json | 4 +++- .../browser/parts/editor/editorStatus.i18n.json | 5 ++++- .../browser/parts/views/viewsRegistry.i18n.json | 4 +++- .../electron-browser/main.contribution.i18n.json | 3 ++- ...languageConfigurationExtensionPoint.i18n.json | 1 + .../electron-browser/debugService.i18n.json | 4 ++-- .../extensionTipsService.i18n.json | 2 ++ .../files/browser/files.contribution.i18n.json | 2 ++ .../scm/electron-browser/scmViewlet.i18n.json | 1 + .../electron-browser/task.contribution.i18n.json | 2 ++ .../configuration/node/configuration.i18n.json | 3 ++- .../node/configurationEditingService.i18n.json | 13 +++++++++++++ .../common/config/commonEditorConfig.i18n.json | 1 + .../menusExtensionPoint.i18n.json | 1 + .../api/browser/viewsExtensionPoint.i18n.json | 4 +++- .../browser/parts/editor/editorStatus.i18n.json | 5 ++++- .../browser/parts/views/viewsRegistry.i18n.json | 4 +++- .../electron-browser/main.contribution.i18n.json | 3 ++- ...languageConfigurationExtensionPoint.i18n.json | 5 ++++- .../electron-browser/debugService.i18n.json | 4 ++-- .../extensionTipsService.i18n.json | 2 ++ .../files/browser/files.contribution.i18n.json | 2 ++ .../scm/electron-browser/scmViewlet.i18n.json | 1 + .../electron-browser/task.contribution.i18n.json | 2 ++ .../configuration/node/configuration.i18n.json | 3 ++- .../node/configurationEditingService.i18n.json | 13 +++++++++++++ i18n/hun/extensions/grunt/out/main.i18n.json | 2 +- i18n/hun/extensions/gulp/out/main.i18n.json | 2 +- i18n/hun/extensions/jake/out/main.i18n.json | 2 +- .../menusExtensionPoint.i18n.json | 3 ++- .../api/browser/viewsExtensionPoint.i18n.json | 4 +++- .../browser/parts/editor/editorStatus.i18n.json | 5 ++++- .../browser/parts/views/viewsRegistry.i18n.json | 4 +++- .../electron-browser/main.contribution.i18n.json | 3 ++- .../electron-browser/debugService.i18n.json | 4 ++-- .../extensionTipsService.i18n.json | 4 +++- .../files/browser/files.contribution.i18n.json | 2 ++ .../scm/electron-browser/scmViewlet.i18n.json | 1 + .../electron-browser/task.contribution.i18n.json | 2 ++ .../configuration/node/configuration.i18n.json | 3 ++- .../node/configurationEditingService.i18n.json | 13 +++++++++++++ .../src/vs/code/electron-main/menus.i18n.json | 6 ++++++ .../src/vs/code/electron-main/windows.i18n.json | 2 ++ .../menusExtensionPoint.i18n.json | 1 + .../api/browser/viewsExtensionPoint.i18n.json | 4 +++- .../browser/actions/workspaceActions.i18n.json | 3 ++- .../activitybar/activitybarActions.i18n.json | 1 + .../browser/parts/editor/editorActions.i18n.json | 1 + .../browser/parts/editor/editorStatus.i18n.json | 7 ++++++- .../browser/parts/views/viewsRegistry.i18n.json | 4 +++- .../workbench/electron-browser/actions.i18n.json | 7 ++++++- .../electron-browser/main.contribution.i18n.json | 6 ++++++ ...languageConfigurationExtensionPoint.i18n.json | 7 ++++++- .../electron-browser/debugService.i18n.json | 2 ++ .../extensions/browser/extensionEditor.i18n.json | 7 +++++++ .../browser/extensionsActions.i18n.json | 1 + .../extensionTipsService.i18n.json | 2 ++ .../files/browser/files.contribution.i18n.json | 4 ++++ .../files/common/dirtyFilesTracker.i18n.json | 1 + .../browser/preferencesEditor.i18n.json | 2 +- .../scm/electron-browser/scmViewlet.i18n.json | 1 + .../electron-browser/insertSnippet.i18n.json | 4 +++- .../electron-browser/snippetsService.i18n.json | 1 + .../electron-browser/task.contribution.i18n.json | 16 ++++++++++++++++ .../terminalTaskSystem.i18n.json | 1 + .../parts/tasks/node/taskConfiguration.i18n.json | 1 + .../electron-browser/terminalActions.i18n.json | 3 ++- .../terminalColorRegistry.i18n.json | 1 + .../vs_code_welcome_page.i18n.json | 1 + .../configuration/node/configuration.i18n.json | 8 +++++++- .../node/configurationEditingService.i18n.json | 13 +++++++++++++ .../services/files/node/fileService.i18n.json | 1 + .../menusExtensionPoint.i18n.json | 1 + .../api/browser/viewsExtensionPoint.i18n.json | 4 +++- .../browser/parts/editor/editorStatus.i18n.json | 5 ++++- .../browser/parts/views/viewsRegistry.i18n.json | 4 +++- .../electron-browser/main.contribution.i18n.json | 1 + .../electron-browser/debugService.i18n.json | 4 ++-- .../extensionTipsService.i18n.json | 2 ++ .../files/browser/files.contribution.i18n.json | 2 ++ .../scm/electron-browser/scmViewlet.i18n.json | 1 + .../electron-browser/task.contribution.i18n.json | 2 ++ .../configuration/node/configuration.i18n.json | 3 ++- .../node/configurationEditingService.i18n.json | 13 +++++++++++++ i18n/kor/extensions/css/package.i18n.json | 3 +++ i18n/kor/extensions/grunt/out/main.i18n.json | 4 +++- i18n/kor/extensions/gulp/out/main.i18n.json | 4 +++- i18n/kor/extensions/jake/out/main.i18n.json | 4 +++- .../extensions/markdown/out/extension.i18n.json | 3 ++- .../src/vs/code/electron-main/menus.i18n.json | 6 ++++++ .../src/vs/code/electron-main/windows.i18n.json | 2 ++ .../common/config/commonEditorConfig.i18n.json | 2 ++ .../common/view/editorColorRegistry.i18n.json | 2 ++ .../gotoError/browser/gotoError.i18n.json | 1 + .../menusExtensionPoint.i18n.json | 2 ++ .../vs/platform/environment/node/argv.i18n.json | 1 + .../node/extensionManagementService.i18n.json | 1 + .../common/extensionsRegistry.i18n.json | 1 + .../theme/common/colorExtensionPoint.i18n.json | 2 ++ .../api/browser/viewsExtensionPoint.i18n.json | 4 +++- .../browser/actions/workspaceActions.i18n.json | 3 ++- .../activitybar/activitybarActions.i18n.json | 1 + .../browser/parts/editor/editorActions.i18n.json | 1 + .../browser/parts/editor/editorStatus.i18n.json | 7 ++++++- .../browser/parts/views/viewsRegistry.i18n.json | 4 +++- .../workbench/electron-browser/actions.i18n.json | 7 ++++++- .../electron-browser/main.contribution.i18n.json | 6 ++++++ ...languageConfigurationExtensionPoint.i18n.json | 7 ++++++- .../electron-browser/debugService.i18n.json | 2 ++ .../extensions/browser/extensionEditor.i18n.json | 7 +++++++ .../browser/extensionsActions.i18n.json | 1 + .../extensionTipsService.i18n.json | 2 ++ .../files/browser/files.contribution.i18n.json | 4 ++++ .../files/common/dirtyFilesTracker.i18n.json | 1 + .../scm/electron-browser/scmViewlet.i18n.json | 3 +++ .../electron-browser/insertSnippet.i18n.json | 4 +++- .../electron-browser/snippetsService.i18n.json | 1 + .../electron-browser/task.contribution.i18n.json | 16 ++++++++++++++++ .../terminalTaskSystem.i18n.json | 1 + .../parts/tasks/node/taskConfiguration.i18n.json | 1 + .../electron-browser/terminalActions.i18n.json | 3 ++- .../terminalColorRegistry.i18n.json | 1 + .../vs_code_welcome_page.i18n.json | 1 + .../configuration/node/configuration.i18n.json | 8 +++++++- .../node/configurationEditingService.i18n.json | 13 +++++++++++++ .../services/files/node/fileService.i18n.json | 2 ++ .../menusExtensionPoint.i18n.json | 1 + .../api/browser/viewsExtensionPoint.i18n.json | 4 +++- .../electron-browser/main.contribution.i18n.json | 1 - .../electron-browser/debugService.i18n.json | 2 -- .../files/browser/files.contribution.i18n.json | 1 + .../scm/electron-browser/scmViewlet.i18n.json | 1 + .../configuration/node/configuration.i18n.json | 3 ++- .../node/configurationEditingService.i18n.json | 2 ++ i18n/rus/extensions/css/package.i18n.json | 3 +++ i18n/rus/extensions/grunt/out/main.i18n.json | 4 +++- i18n/rus/extensions/gulp/out/main.i18n.json | 4 +++- i18n/rus/extensions/jake/out/main.i18n.json | 4 +++- .../extensions/markdown/out/extension.i18n.json | 3 ++- .../src/vs/code/electron-main/menus.i18n.json | 6 ++++++ .../src/vs/code/electron-main/windows.i18n.json | 2 ++ .../common/config/commonEditorConfig.i18n.json | 2 ++ .../common/view/editorColorRegistry.i18n.json | 2 ++ .../gotoError/browser/gotoError.i18n.json | 1 + .../menusExtensionPoint.i18n.json | 2 ++ .../vs/platform/environment/node/argv.i18n.json | 1 + .../node/extensionManagementService.i18n.json | 1 + .../common/extensionsRegistry.i18n.json | 1 + .../theme/common/colorExtensionPoint.i18n.json | 2 ++ .../api/browser/viewsExtensionPoint.i18n.json | 4 +++- .../browser/actions/workspaceActions.i18n.json | 3 ++- .../activitybar/activitybarActions.i18n.json | 1 + .../browser/parts/editor/editorActions.i18n.json | 1 + .../browser/parts/editor/editorStatus.i18n.json | 7 ++++++- .../browser/parts/views/viewsRegistry.i18n.json | 4 +++- .../workbench/electron-browser/actions.i18n.json | 7 ++++++- .../electron-browser/main.contribution.i18n.json | 6 ++++++ ...languageConfigurationExtensionPoint.i18n.json | 7 ++++++- .../electron-browser/debugService.i18n.json | 2 ++ .../extensions/browser/extensionEditor.i18n.json | 7 +++++++ .../browser/extensionsActions.i18n.json | 1 + .../extensionTipsService.i18n.json | 2 ++ .../files/browser/files.contribution.i18n.json | 4 ++++ .../files/common/dirtyFilesTracker.i18n.json | 1 + .../scm/electron-browser/scmViewlet.i18n.json | 3 +++ .../electron-browser/insertSnippet.i18n.json | 4 +++- .../electron-browser/snippetsService.i18n.json | 1 + .../electron-browser/task.contribution.i18n.json | 16 ++++++++++++++++ .../terminalTaskSystem.i18n.json | 1 + .../parts/tasks/node/taskConfiguration.i18n.json | 1 + .../electron-browser/terminalActions.i18n.json | 3 ++- .../terminalColorRegistry.i18n.json | 1 + .../vs_code_welcome_page.i18n.json | 1 + .../configuration/node/configuration.i18n.json | 8 +++++++- .../node/configurationEditingService.i18n.json | 13 +++++++++++++ .../services/files/node/fileService.i18n.json | 2 ++ .../menusExtensionPoint.i18n.json | 1 + .../api/browser/viewsExtensionPoint.i18n.json | 4 ++-- .../browser/parts/views/viewsRegistry.i18n.json | 2 +- .../electron-browser/debugService.i18n.json | 4 ++-- .../extensionTipsService.i18n.json | 1 + 231 files changed, 702 insertions(+), 99 deletions(-) diff --git a/i18n/chs/src/vs/editor/contrib/links/browser/links.i18n.json b/i18n/chs/src/vs/editor/contrib/links/browser/links.i18n.json index cec79732827..c228820d8fc 100644 --- a/i18n/chs/src/vs/editor/contrib/links/browser/links.i18n.json +++ b/i18n/chs/src/vs/editor/contrib/links/browser/links.i18n.json @@ -8,7 +8,7 @@ "links.navigate": "Ctrl + 单击以跟踪链接", "links.command.mac": "Cmd + 单击以执行命令", "links.command": "Ctrl + 单击以执行命令", - "links.navigate.al": "Alt + 单击以访问链接", + "links.navigate.al": "按住 Alt 并单击可访问链接", "links.command.al": "Alt + 单击以执行命令", "invalid.url": "抱歉,无法打开此链接,因为其格式不正确: {0}", "missing.url": "抱歉,无法打开此链接,因为其目标丢失。", diff --git a/i18n/chs/src/vs/platform/actions/electron-browser/menusExtensionPoint.i18n.json b/i18n/chs/src/vs/platform/actions/electron-browser/menusExtensionPoint.i18n.json index 536a7ea7024..aee9d4518e3 100644 --- a/i18n/chs/src/vs/platform/actions/electron-browser/menusExtensionPoint.i18n.json +++ b/i18n/chs/src/vs/platform/actions/electron-browser/menusExtensionPoint.i18n.json @@ -20,6 +20,7 @@ "menus.editorTabContext": "编辑器选项卡上下文菜单", "menus.debugCallstackContext": "调试调用堆栈上下文菜单", "menus.scmTitle": "源代码管理标题菜单", + "menus.scmSourceControl": "源代码管理菜单", "menus.resourceGroupContext": "源代码管理资源组上下文菜单", "menus.resourceStateContext": "源代码管理资源状态上下文菜单", "view.viewTitle": "提供的视图的标题菜单", diff --git a/i18n/chs/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json b/i18n/chs/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json index 7fff225f6c9..49eaa8fd6f3 100644 --- a/i18n/chs/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json +++ b/i18n/chs/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json @@ -13,5 +13,7 @@ "vscode.extension.contributes.views": "向编辑器提供视图", "views.explorer": "资源管理器视图", "views.debug": "调试视图", - "locationId.invalid": "“{0}”为无效视图位置" + "locationId.invalid": "“{0}”为无效视图位置", + "duplicateView1": "无法在位置“{1}”注册多个 ID 同为“{0}”的视图。", + "duplicateView2": "ID 为“{0}”的视图在位置“{1}”已被注册" } \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json b/i18n/chs/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json index 272f5248a2b..67671aeb85c 100644 --- a/i18n/chs/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json +++ b/i18n/chs/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json @@ -11,6 +11,7 @@ "endOfLineLineFeed": "LF", "endOfLineCarriageReturnLineFeed": "CRLF", "tabFocusModeEnabled": "按 Tab 移动焦点", + "screenReaderDetected": "已为屏幕阅读器优化", "screenReaderDetectedExtra": "如果你没有使用屏幕阅读器,请将设置中的“editor.accessibilitySupport”改为“off”。", "disableTabMode": "禁用辅助功能模式", "gotoLine": "转到行", @@ -47,8 +48,10 @@ "guessedEncoding": "通过内容猜测", "pickEncodingForReopen": "选择文件编码以重新打开文件", "pickEncodingForSave": "选择用于保存的文件编码", + "screenReaderDetectedExplanation.title": "已为屏幕阅读器优化", "screenReaderDetectedExplanation.question": "你在使用屏幕阅读器额来操作 VS Code 吗?", "screenReaderDetectedExplanation.answerYes": "是", "screenReaderDetectedExplanation.answerNo": "否", - "screenReaderDetectedExplanation.body1": "VS Code 已为屏幕阅读器的使用进行优化。" + "screenReaderDetectedExplanation.body1": "VS Code 已为屏幕阅读器的使用进行优化。", + "screenReaderDetectedExplanation.body2": "一些编辑器功能将有不同的行为: 例如,文字换行,折叠,自动关闭括号等。" } \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/browser/parts/views/viewsRegistry.i18n.json b/i18n/chs/src/vs/workbench/browser/parts/views/viewsRegistry.i18n.json index 8b6ad71cd4e..85f57daaba0 100644 --- a/i18n/chs/src/vs/workbench/browser/parts/views/viewsRegistry.i18n.json +++ b/i18n/chs/src/vs/workbench/browser/parts/views/viewsRegistry.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "duplicateId": "ID 为“{0}”的视图在位置“{1}”已被注册" +} \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/electron-browser/main.contribution.i18n.json b/i18n/chs/src/vs/workbench/electron-browser/main.contribution.i18n.json index 3fb6c406424..b2ac4ce4c5a 100644 --- a/i18n/chs/src/vs/workbench/electron-browser/main.contribution.i18n.json +++ b/i18n/chs/src/vs/workbench/electron-browser/main.contribution.i18n.json @@ -17,6 +17,7 @@ "tabDescription": "控制编辑器标签的格式。修改这项设置会让文件的路径更容易理解:\n- short: \"parent\"\n- medium: \"workspace/src/parent\"\n- long: \"/home/user/workspace/src/parent\"\n- default: 当与另一选项卡标题相同时为 \".../parent\"。选项卡被禁用时则为相对工作区路径", "editorTabCloseButton": "控制编辑器的选项卡关闭按钮的位置,或当设置为 \"off\" 时禁用关闭它们。", "showIcons": "控制打开的编辑器是否随图标一起显示。这还需启用图标主题。", + "enablePreview": "控制是否将打开的编辑器显示为预览。预览编辑器将会重用至其被保留(例如,通过双击或编辑),且其字体样式将为斜体。", "enablePreviewFromQuickOpen": "控制 Quick Open 中打开的编辑器是否显示为预览。预览编辑器可以重新使用,直到将其保留(例如,通过双击或编辑)。", "editorOpenPositioning": "控制打开编辑器的位置。选择“左侧”或“右侧”以在当前活动位置的左侧或右侧打开编辑器。选择“第一个”或“最后一个”以从当前活动位置独立打开编辑器。", "revealIfOpen": "控制打开时编辑器是否显示在任何可见组中。如果禁用,编辑器会优先在当前活动编辑器组中打开。如果启用,会显示已打开的编辑器而不是在当前活动编辑器组中再次打开。请注意,有些情况下会忽略此设置,例如强制编辑器在特定组中或在当前活动组的边侧打开时。", diff --git a/i18n/chs/src/vs/workbench/parts/debug/electron-browser/debugService.i18n.json b/i18n/chs/src/vs/workbench/parts/debug/electron-browser/debugService.i18n.json index 2ef11d8a1a5..0a2caf6c161 100644 --- a/i18n/chs/src/vs/workbench/parts/debug/electron-browser/debugService.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/debug/electron-browser/debugService.i18n.json @@ -12,8 +12,8 @@ "breakpointRemoved": "已删除断点,行 {0},文件 {1}", "compoundMustHaveConfigurations": "复合项必须拥有 \"configurations\" 属性集,才能启动多个配置。", "configMissing": "\"launch.json\" 中缺少配置“{0}”。", - "debugRequestNotSupported": "不支持配置中的调试请求“{0}”", - "debugRequesMissing": "所选的启动配置缺少调试请求", + "debugRequestNotSupported": "所选的调试配置有一个不支持的属性值“{0}”: “{1}”。", + "debugRequesMissing": "所选的调试配置缺少属性“{0}”。", "debugTypeNotSupported": "配置的类型“{0}”不受支持。", "debugTypeMissing": "所选的启动配置缺少属性 \"type\"。", "preLaunchTaskErrors": "preLaunchTask“{0}”期间检测到多个生成错误。", diff --git a/i18n/chs/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json b/i18n/chs/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json index 1a78dfcd728..f5bafe786b6 100644 --- a/i18n/chs/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json @@ -5,10 +5,12 @@ // Do not edit this file. It is machine generated. { "reallyRecommended2": "建议对这种类型的文件使用“{0}”扩展。", + "reallyRecommendedExtensionPack": "建议对这种类型的文件使用“{0}”扩展包。", "showRecommendations": "显示建议", "neverShowAgain": "不再显示", "close": "关闭", "workspaceRecommended": "此工作区具有扩展建议。", + "ignoreExtensionRecommendations": "你是否要忽略所有推荐的扩展?", "ignoreAll": "是,忽略全部", "no": "否", "cancel": "取消" diff --git a/i18n/chs/src/vs/workbench/parts/files/browser/files.contribution.i18n.json b/i18n/chs/src/vs/workbench/parts/files/browser/files.contribution.i18n.json index 4cf97db7be0..7f0b0600897 100644 --- a/i18n/chs/src/vs/workbench/parts/files/browser/files.contribution.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/files/browser/files.contribution.i18n.json @@ -10,6 +10,7 @@ "textFileEditor": "文本文件编辑器", "binaryFileEditor": "二进制文件编辑器", "filesConfigurationTitle": "文件", + "exclude": "配置 glob 模式以在搜索中排除文件和文件夹。例如,文件资源管理器根据此设置决定文件或文件夹的显示和隐藏。", "files.exclude.boolean": "匹配文件路径所依据的 glob 模式。设置为 true 或 false 可启用或禁用该模式。", "files.exclude.when": "对匹配文件的同级文件的其他检查。使用 $(basename) 作为匹配文件名的变量。", "associations": "配置语言的文件关联(如: \"*.extension\": \"html\")。这些关联的优先级高于已安装语言的默认关联。", @@ -18,6 +19,7 @@ "eol": "默认行尾字符。使用 \\n 表示 LF,\\r\\n 表示 CRLF。", "trimTrailingWhitespace": "启用后,将在保存文件时剪裁尾随空格。", "insertFinalNewline": "启用后,保存文件时在文件末尾插入一个最终新行。", + "trimFinalNewlines": "启用后,保存文件时将删除在最终新行后的所有新行。", "files.autoSave.off": "永不自动保存更新后的文件。", "files.autoSave.afterDelay": "配置 \"files.autoSaveDelay\" 后自动保存更新后的文件。", "files.autoSave.onFocusChange": "编辑器失去焦点时自动保存更新后的文件。", diff --git a/i18n/chs/src/vs/workbench/parts/scm/electron-browser/scmViewlet.i18n.json b/i18n/chs/src/vs/workbench/parts/scm/electron-browser/scmViewlet.i18n.json index efe497c5bbb..b3ba4d06a1b 100644 --- a/i18n/chs/src/vs/workbench/parts/scm/electron-browser/scmViewlet.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/scm/electron-browser/scmViewlet.i18n.json @@ -5,6 +5,7 @@ // Do not edit this file. It is machine generated. { "scm providers": "源代码管理提供程序", + "hideRepository": "隐藏", "commitMessage": "消息(按 {0} 提交)", "installAdditionalSCMProviders": "安装其他 SCM 提供程序...", "no open repo": "没有活动的源代码管理提供程序。", diff --git a/i18n/chs/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json b/i18n/chs/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json index c197662840b..925312c210a 100644 --- a/i18n/chs/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json @@ -31,6 +31,7 @@ "TaskSystem.active": "当前已有任务正在运行。请先终止它,然后再执行另一项任务。", "TaskSystem.restartFailed": "未能终止并重启任务 {0}", "TaskSystem.configurationErrors": "错误: 提供的任务配置具有验证错误,无法使用。请首先改正错误。", + "taskService.ignoreingFolder": "将忽略工作区文件夹 {0} 的任务配置。多文件夹工作区任务支持要求所有文件夹使用任务版本 2.0.0\n", "TaskSystem.invalidTaskJson": "错误: tasks.json 文件的内容具有语法错误。请先更正错误然后再执行任务。\n", "TaskSystem.runningTask": "存在运行中的任务。要终止它吗?", "TaskSystem.terminateTask": "终止任务(&&T)", @@ -42,6 +43,7 @@ "recentlyUsed": "最近使用的任务", "configured": "已配置的任务", "detected": "检测到的任务", + "TaskService.ignoredFolder": "由于使用任务版本 0.1.0,以下工作区文件夹将被忽略:", "TaskService.notAgain": "不再显示", "TaskService.ok": "确定", "TaskService.pickRunTask": "选择要运行的任务", diff --git a/i18n/chs/src/vs/workbench/services/configuration/node/configuration.i18n.json b/i18n/chs/src/vs/workbench/services/configuration/node/configuration.i18n.json index 0c7b1d5f799..2eb80022de4 100644 --- a/i18n/chs/src/vs/workbench/services/configuration/node/configuration.i18n.json +++ b/i18n/chs/src/vs/workbench/services/configuration/node/configuration.i18n.json @@ -19,5 +19,6 @@ "workspaceConfig.name.description": "文件夹的可选名称。", "workspaceConfig.uri.description": "文件夹的 URI", "workspaceConfig.settings.description": "工作区设置", - "workspaceConfig.extensions.description": "工作区扩展" + "workspaceConfig.extensions.description": "工作区扩展", + "unknownWorkspaceProperty": "未知的工作区配置属性" } \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json b/i18n/chs/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json index 2bf3f1664d2..45d1a5bbb9c 100644 --- a/i18n/chs/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json +++ b/i18n/chs/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json @@ -4,13 +4,26 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { + "openTasksConfiguration": "打开任务配置", + "openLaunchConfiguration": "打开启动配置", "close": "关闭", "open": "打开设置", + "saveAndRetry": "保存并重试", "errorUnknownKey": "没有注册配置 {1},因此无法写入 {0}。", "errorInvalidFolderConfiguration": "{0} 不支持文件夹资源域,因此无法写入\"文件夹设置\"。", "errorInvalidUserTarget": "{0} 不支持全局域,因此无法写入\"用户设置\"。", "errorInvalidFolderTarget": "未提供资源,因此无法写入\"文件夹设置\"。", "errorNoWorkspaceOpened": "没有打开任何工作区,因此无法写入 {0}。请先打开一个工作区,然后重试。", + "errorInvalidTaskConfiguration": "无法写入任务文件。请打开**任务**文件并清除错误/警告,然后重试。", + "errorInvalidLaunchConfiguration": "无法写入启动文件。请打开**启动**文件并清除错误/警告,然后重试。", + "errorInvalidConfiguration": "无法写入用户设置。请打开**用户设置**文件并清除错误/警告,然后重试。", + "errorInvalidConfigurationWorkspace": "无法写入工作区设置。请打开**工作区设置**文件并清除错误/警告,然后重试。", + "errorInvalidConfigurationFolder": "无法写入文件夹设置。请打开在 **{0}** 文件夹下的**文件夹设置**文件并清除错误/警告,然后重试。", + "errorTasksConfigurationFileDirty": "文件已变更,因此无法写入设置。请先保存**任务配置**文件,然后重试。", + "errorLaunchConfigurationFileDirty": "文件已变更,因此无法写入设置。请先保存**启动配置**文件,然后重试。", + "errorConfigurationFileDirty": "文件已变更,因此无法写入设置。请先保存**用户设置**文件,然后重试。", + "errorConfigurationFileDirtyWorkspace": "文件已变更,因此无法写入设置。请先保存**工作区设置**文件,然后重试。", + "errorConfigurationFileDirtyFolder": "文件已变更,因此无法写入设置。请先保存在 **{0}** 下的**文件夹设置**文件,然后重试。", "userTarget": "用户设置", "workspaceTarget": "工作区设置", "folderTarget": "文件夹设置" diff --git a/i18n/cht/src/vs/editor/common/config/commonEditorConfig.i18n.json b/i18n/cht/src/vs/editor/common/config/commonEditorConfig.i18n.json index cd1eb975eb3..779201a7986 100644 --- a/i18n/cht/src/vs/editor/common/config/commonEditorConfig.i18n.json +++ b/i18n/cht/src/vs/editor/common/config/commonEditorConfig.i18n.json @@ -11,6 +11,7 @@ "lineHeight": "控制行高。使用 0 會從 fontSize 計算 lineHeight。", "letterSpacing": "控制字元間距 (以像素為單位)", "lineNumbers": "控制行號顯示。可能的值有 'on'、'off' 及 'relative'。'relative' 會從目前的資料指標位置顯示行數。", + "rulers": "在特定的等寬字元數之後轉譯垂直尺規。有多個尺規就使用多個值。若陣列為空,則不繪製任何尺規。", "wordSeparators": "執行文字相關導覽或作業時將作為文字分隔符號的字元", "tabSize": "與 Tab 相等的空格數量。當 `editor.detectIndentation` 已開啟時,會根據檔案內容覆寫此設定。", "tabSize.errorMessage": "必須是 'number'。請注意,值 \"auto\" 已由 `editor.detectIndentation` 設定取代。", diff --git a/i18n/cht/src/vs/platform/actions/electron-browser/menusExtensionPoint.i18n.json b/i18n/cht/src/vs/platform/actions/electron-browser/menusExtensionPoint.i18n.json index ac0be09798b..3484e0af5e7 100644 --- a/i18n/cht/src/vs/platform/actions/electron-browser/menusExtensionPoint.i18n.json +++ b/i18n/cht/src/vs/platform/actions/electron-browser/menusExtensionPoint.i18n.json @@ -20,6 +20,7 @@ "menus.editorTabContext": "編輯器索引標籤操作功能表", "menus.debugCallstackContext": "偵錯呼叫堆疊操作功能表", "menus.scmTitle": "原始檔控制標題功能表", + "menus.scmSourceControl": "原始檔控制功能表", "menus.resourceGroupContext": "原始檔控制資源群組操作功能表", "menus.resourceStateContext": "原始檔控制資源群組狀態操作功能表", "view.viewTitle": "這有助於查看標題功能表", diff --git a/i18n/cht/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json b/i18n/cht/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json index 98b2d3ba1ce..1a48cc1d694 100644 --- a/i18n/cht/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json +++ b/i18n/cht/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json @@ -13,5 +13,7 @@ "vscode.extension.contributes.views": "提供意見給編輯者", "views.explorer": "檔案總管檢視", "views.debug": "偵錯檢視", - "locationId.invalid": "`{0}`不是有效的識別位置" + "locationId.invalid": "`{0}`不是有效的識別位置", + "duplicateView1": "無法在位置 '{1}' 使用相同的識別碼 '{0}' 註冊多個檢視", + "duplicateView2": "識別碼為 '{0}' 的檢視已在位置 '{1}' 註冊" } \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/browser/actions/workspaceActions.i18n.json b/i18n/cht/src/vs/workbench/browser/actions/workspaceActions.i18n.json index de3c6d6122f..18a591310bd 100644 --- a/i18n/cht/src/vs/workbench/browser/actions/workspaceActions.i18n.json +++ b/i18n/cht/src/vs/workbench/browser/actions/workspaceActions.i18n.json @@ -17,5 +17,6 @@ "save": "儲存(&&S)", "saveWorkspace": "儲存工作區", "openWorkspaceAction": "開啟工作區...", - "openWorkspaceConfigFile": "開啟工作區組態檔" + "openWorkspaceConfigFile": "開啟工作區組態檔", + "workspaceFolderPickerPlaceholder": "選取工作區資料夾" } \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/browser/parts/activitybar/activitybarActions.i18n.json b/i18n/cht/src/vs/workbench/browser/parts/activitybar/activitybarActions.i18n.json index 67537d8efa3..28f1a55a24c 100644 --- a/i18n/cht/src/vs/workbench/browser/parts/activitybar/activitybarActions.i18n.json +++ b/i18n/cht/src/vs/workbench/browser/parts/activitybar/activitybarActions.i18n.json @@ -6,6 +6,7 @@ { "badgeTitle": "{0} - {1}", "titleKeybinding": "{0} ({1})", + "removeFromActivityBar": "從活動列隱藏", "keepInActivityBar": "保留在活動列", "additionalViews": "其他檢視", "numberBadge": "{0} ({1})", diff --git a/i18n/cht/src/vs/workbench/browser/parts/editor/editorActions.i18n.json b/i18n/cht/src/vs/workbench/browser/parts/editor/editorActions.i18n.json index 96160a8359a..ee6864d5c65 100644 --- a/i18n/cht/src/vs/workbench/browser/parts/editor/editorActions.i18n.json +++ b/i18n/cht/src/vs/workbench/browser/parts/editor/editorActions.i18n.json @@ -35,6 +35,7 @@ "openPreviousEditorInGroup": "開啟群組中上一個編輯器", "navigateNext": "向前", "navigatePrevious": "向後", + "navigateLast": "移至最後", "reopenClosedEditor": "重新開啟已關閉的編輯器", "clearRecentFiles": "清理最近開啟的", "showEditorsInFirstGroup": "在第一個群組顯示編輯器", diff --git a/i18n/cht/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json b/i18n/cht/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json index 2d954d063e9..e8b2ace0bcf 100644 --- a/i18n/cht/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json +++ b/i18n/cht/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json @@ -11,6 +11,7 @@ "endOfLineLineFeed": "LF", "endOfLineCarriageReturnLineFeed": "CRLF", "tabFocusModeEnabled": "用 Tab 鍵移動焦點", + "screenReaderDetected": "已將螢幕助讀程式最佳化", "screenReaderDetectedExtra": "若您不打算使用螢幕助讀程式,請將設定 `editor.accessibilitySupport` 變更為 \"off\"。", "disableTabMode": "停用協助工具模式", "gotoLine": "移至行", @@ -47,6 +48,10 @@ "guessedEncoding": "已從內容猜測", "pickEncodingForReopen": "選取檔案的編碼以重新開啟檔案", "pickEncodingForSave": "選取用來儲存的檔案編碼", + "screenReaderDetectedExplanation.title": "已將螢幕助讀程式最佳化", + "screenReaderDetectedExplanation.question": "您正使用螢幕助讀程式來操作 VS Code 嗎?", "screenReaderDetectedExplanation.answerYes": "是", - "screenReaderDetectedExplanation.answerNo": "否" + "screenReaderDetectedExplanation.answerNo": "否", + "screenReaderDetectedExplanation.body1": "已將 VS Code 最佳化,現在可搭配螢幕助讀程式使用。", + "screenReaderDetectedExplanation.body2": "某些編輯器功能會具有不同的行為: 例如文字換行、折疊、自動括上括號等。" } \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/browser/parts/views/viewsRegistry.i18n.json b/i18n/cht/src/vs/workbench/browser/parts/views/viewsRegistry.i18n.json index 8b6ad71cd4e..e29734f7644 100644 --- a/i18n/cht/src/vs/workbench/browser/parts/views/viewsRegistry.i18n.json +++ b/i18n/cht/src/vs/workbench/browser/parts/views/viewsRegistry.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "duplicateId": "識別碼為 '{0}' 的檢視已在位置 '{1}' 中註冊" +} \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/electron-browser/actions.i18n.json b/i18n/cht/src/vs/workbench/electron-browser/actions.i18n.json index c45493d845e..c44f42dbd5d 100644 --- a/i18n/cht/src/vs/workbench/electron-browser/actions.i18n.json +++ b/i18n/cht/src/vs/workbench/electron-browser/actions.i18n.json @@ -45,5 +45,7 @@ "decreaseViewSize": "縮小目前的檢視大小", "showPreviousTab": "顯示前一個視窗索引標籤", "showNextWindowTab": "顯示下一個視窗索引標籤", - "mergeAllWindowTabs": "合併所有視窗" + "moveWindowTabToNewWindow": "將視窗索引標籤移至新的視窗", + "mergeAllWindowTabs": "合併所有視窗", + "toggleWindowTabsBar": "切換視窗索引標籤列" } \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/electron-browser/main.contribution.i18n.json b/i18n/cht/src/vs/workbench/electron-browser/main.contribution.i18n.json index fc3ce74f059..8b6818a6c02 100644 --- a/i18n/cht/src/vs/workbench/electron-browser/main.contribution.i18n.json +++ b/i18n/cht/src/vs/workbench/electron-browser/main.contribution.i18n.json @@ -10,9 +10,14 @@ "workspaces": "工作區", "developer": "開發人員", "showEditorTabs": "控制已開啟的編輯器是否應顯示在索引標籤中。", - "workbench.editor.labelFormat.default": "顯示檔案名稱。當啟用頁籤且有兩個相同名稱的檔案在同一個群組時,各檔案的路徑會被加入以分辨區隔。當取消頁籤時,在使用中的編輯器會顯示與工作區根目錄的相對路徑。", + "workbench.editor.labelFormat.default": "顯示檔案的名稱。當啟用索引標籤時,若在一個群組中有兩個檔案使用相同的名稱,就會新增每個檔案路徑具有辨識度的區段。當索引標籤停用時,若編輯器在使用中,則會顯示工作區根目錄的相關路徑。", + "workbench.editor.labelFormat.short": "顯示檔案的名稱,並在名稱後接著該檔案的目錄名稱。", + "workbench.editor.labelFormat.medium": "顯示檔案的名稱,並在名稱後接著該檔案與工作區根目錄有關的路徑。", + "workbench.editor.labelFormat.long": "顯示檔案的名稱,並在名稱後接著該檔案的絕對路徑。", + "tabDescription": "控制編輯器的標籤格式。變更此設定具有多項優點,例如可讓檔案的位置更加清楚:\n-簡短: 'parent'\n-中等: 'workspace/src/parent'\n-完整: '/home/user/workspace/src/parent'\n-預設: '.../parent',當另一個索引標籤共用相同的標題,或若路徑停用,卻共用相關的工作區路徑時", "editorTabCloseButton": "控制編輯器的索引標籤關閉按鈕位置,或在設為 'off' 時將其停用。", "showIcons": "控制開啟的編輯器是否搭配圖示顯示。這需要同時啟用圖示佈景主題。", + "enablePreview": "控制已開啟的編輯器是否顯示為預覽。預覽編輯器會重複使用到被保留 (例如按兩下或進行編輯) 並以斜體字型樣式顯示為止。", "enablePreviewFromQuickOpen": "控制透過 Quick Open 所開啟的編輯器是否顯示為預覽。預覽編輯器會重複使用到被保留 (例如按兩下或進行編輯) 為止。", "editorOpenPositioning": "控制要在何處開啟編輯器。選取 [左] 或 [右] 在目前使用中編輯器的左側或右側開啟編輯器。選取 [先] 或 [後] 從目前使用中編輯器另外開啟編輯器。", "revealIfOpen": "控制編輯器是否要在任何顯示的群組開啟時,在其中顯示。若啟用此選項,已經開啟的編輯器將會繼續顯示,而不會在目前使用中的編輯器群組中再開啟一次。請注意,有一些情況會忽略此設定,例如當強制編輯器在特定群組中開啟,或強制編輯器在目前使用中的群組旁開啟等情況。", diff --git a/i18n/cht/src/vs/workbench/parts/codeEditor/electron-browser/languageConfiguration/languageConfigurationExtensionPoint.i18n.json b/i18n/cht/src/vs/workbench/parts/codeEditor/electron-browser/languageConfiguration/languageConfigurationExtensionPoint.i18n.json index b629fbff31c..06716533a4d 100644 --- a/i18n/cht/src/vs/workbench/parts/codeEditor/electron-browser/languageConfiguration/languageConfigurationExtensionPoint.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/codeEditor/electron-browser/languageConfiguration/languageConfigurationExtensionPoint.i18n.json @@ -37,5 +37,9 @@ "schema.indentationRules.unIndentedLinePattern.pattern": "適用於 unIndentedLinePattern 的 RegExp 模式。", "schema.indentationRules.unIndentedLinePattern.flags": "適用於 unIndentedLinePattern 的 RegExp 旗標。", "schema.indentationRules.unIndentedLinePattern.errorMessage": "必須符合樣式 `/^([gimuy]+)$/`", - "schema.folding": "語言的摺疊設定。" + "schema.folding": "語言的摺疊設定。", + "schema.folding.offSide": "若語言中的區塊由其縮排表示,則該語言會依循越位規則。若已設定,則空白行會屬於後續區塊。", + "schema.folding.markers": "語言的特定摺疊標記,例如 '#region' 和 '#endregion'。會針對所有行的內容測試起始和結尾 regex,而必須有效地設計起始和結尾 regex", + "schema.folding.markers.start": "開始標記的 RegExp 模式。regexp 必須以 '^' 作為開頭。", + "schema.folding.markers.end": "結束標記的 RegExp 模式。regexp 必須以 '^' 作為開頭。" } \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/debug/electron-browser/debugService.i18n.json b/i18n/cht/src/vs/workbench/parts/debug/electron-browser/debugService.i18n.json index 00b0f0731b8..4bdc5fb94f2 100644 --- a/i18n/cht/src/vs/workbench/parts/debug/electron-browser/debugService.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/debug/electron-browser/debugService.i18n.json @@ -12,6 +12,8 @@ "breakpointRemoved": "已移除中斷點,行 {0},檔案 {1}", "compoundMustHaveConfigurations": "複合必須設有 \"configurations\" 屬性,才能啟動多個組態。", "configMissing": "'launch.json' 中遺漏組態 '{0}'。", + "debugRequestNotSupported": "所選的偵錯組態具有不支援的屬性值 '{0}': '{1}'。", + "debugRequesMissing": "所選的偵錯組態遺漏屬性 '{0}'。", "debugTypeNotSupported": "不支援設定的偵錯類型 '{0}'。", "debugTypeMissing": "遺漏所選啟動設定的屬性 'type'。", "preLaunchTaskErrors": "執行 preLaunchTask '{0}' 期間偵測到建置錯誤。", diff --git a/i18n/cht/src/vs/workbench/parts/extensions/browser/extensionEditor.i18n.json b/i18n/cht/src/vs/workbench/parts/extensions/browser/extensionEditor.i18n.json index de1a015d977..9d0f768770d 100644 --- a/i18n/cht/src/vs/workbench/parts/extensions/browser/extensionEditor.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/extensions/browser/extensionEditor.i18n.json @@ -29,6 +29,13 @@ "view id": "識別碼", "view name": "名稱", "view location": "位置", + "colorThemes": "色彩佈景主題 ({0})", + "iconThemes": "圖示佈景主題 ({0}) ", + "colors": "色彩 ({0})", + "colorId": "識別碼", + "defaultDark": "預設深色", + "defaultLight": "預設淺色", + "defaultHC": "預設高對比", "JSON Validation": "JSON 驗證 ({0})", "commands": "命令 ({0})", "command name": "名稱", diff --git a/i18n/cht/src/vs/workbench/parts/extensions/browser/extensionsActions.i18n.json b/i18n/cht/src/vs/workbench/parts/extensions/browser/extensionsActions.i18n.json index 4a4fd03e15a..ea9d6d82631 100644 --- a/i18n/cht/src/vs/workbench/parts/extensions/browser/extensionsActions.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/extensions/browser/extensionsActions.i18n.json @@ -53,6 +53,7 @@ "showAzureExtensionsShort": "Azure 延伸模組", "OpenExtensionsFile.failed": "無法在 '.vscode' 資料夾 ({0}) 中建立 'extensions.json' 檔案。", "configureWorkspaceRecommendedExtensions": "設定建議的延伸模組 (工作區)", + "configureWorkspaceFolderRecommendedExtensions": "設定建議的延伸模組 (工作區資料夾) ", "builtin": "內建", "disableAll": "停用所有已安裝的延伸模組", "disableAllWorkspace": "停用此工作區的所有已安裝延伸模組", diff --git a/i18n/cht/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json b/i18n/cht/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json index eb4b8636d66..3e7df1758c7 100644 --- a/i18n/cht/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json @@ -5,10 +5,12 @@ // Do not edit this file. It is machine generated. { "reallyRecommended2": "建議對此檔案類型使用 '{0}' 延伸模組。", + "reallyRecommendedExtensionPack": "建議對此檔案類型使用 '{0}' 延伸模組套件。", "showRecommendations": "顯示建議", "neverShowAgain": "不要再顯示", "close": "關閉", "workspaceRecommended": "此工作區具有擴充功能建議。", + "ignoreExtensionRecommendations": "是否略過所有的延伸模組建議?", "ignoreAll": "是,略過全部", "no": "否", "cancel": "取消" diff --git a/i18n/cht/src/vs/workbench/parts/files/browser/files.contribution.i18n.json b/i18n/cht/src/vs/workbench/parts/files/browser/files.contribution.i18n.json index fa56ff2830f..fef80808ee4 100644 --- a/i18n/cht/src/vs/workbench/parts/files/browser/files.contribution.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/files/browser/files.contribution.i18n.json @@ -10,12 +10,16 @@ "textFileEditor": "文字檔編輯器", "binaryFileEditor": "二進位檔案編輯器", "filesConfigurationTitle": "檔案", + "exclude": "設定 Glob 模式,以排除檔案及資料夾。例如,檔案總管會根據此項設定,判斷何種檔案和資料夾該顯示或隱藏。", "files.exclude.boolean": "要符合檔案路徑的 Glob 模式。設為 True 或 False 可啟用或停用模式。", "files.exclude.when": "在相符檔案同層級上額外的檢查。請使用 $(basename) 作為相符檔案名稱的變數。", "associations": "將檔案關聯設定為語言 (例如 \"*.extension\": \"html\")。這些語言優先於已安裝語言的預設關聯。", + "encoding": "在讀取和寫入檔案時要使用的預設字元集編碼。此項設定也可根據每個語言加以設定。", + "autoGuessEncoding": "當啟用此功能時,會嘗試在開啟檔案時推測字元集編碼。此項設定也可根據每個語言加以設定。", "eol": "預設結尾斷行字元.LF使用 \\n , CRLF使用\\r\\n ", "trimTrailingWhitespace": "若啟用,將在儲存檔案時修剪尾端空白。", "insertFinalNewline": "啟用時,請在儲存檔案時在其結尾插入最後一個新行。", + "trimFinalNewlines": "若啟用,則會在儲存檔案時,修剪檔案末新行尾的所有新行。", "files.autoSave.off": "已變更的檔案一律不會自動儲存。", "files.autoSave.afterDelay": "已變更的檔案會在設定的 'files.autoSaveDelay' 之後自動儲存。", "files.autoSave.onFocusChange": "已變更的檔案會在編輯器失去焦點時自動儲存。", diff --git a/i18n/cht/src/vs/workbench/parts/files/common/dirtyFilesTracker.i18n.json b/i18n/cht/src/vs/workbench/parts/files/common/dirtyFilesTracker.i18n.json index 953df2579ae..cd31ffc72aa 100644 --- a/i18n/cht/src/vs/workbench/parts/files/common/dirtyFilesTracker.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/files/common/dirtyFilesTracker.i18n.json @@ -4,5 +4,6 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { + "dirtyFile": "1 個未儲存的檔案", "dirtyFiles": "{0} 個未儲存的檔案" } \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/scm/electron-browser/scmViewlet.i18n.json b/i18n/cht/src/vs/workbench/parts/scm/electron-browser/scmViewlet.i18n.json index ac745b8e8e1..e0a612882ae 100644 --- a/i18n/cht/src/vs/workbench/parts/scm/electron-browser/scmViewlet.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/scm/electron-browser/scmViewlet.i18n.json @@ -4,8 +4,11 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { + "scm providers": "原始檔控制提供者", + "hideRepository": "隱藏", "commitMessage": "Message (press {0} to commit)", "installAdditionalSCMProviders": "安裝額外SCM提供者...", + "no open repo": "沒有使用中的原始檔控制提供者。", "source control": "原始檔控制", "viewletTitle": "{0}: {1}" } \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/snippets/electron-browser/insertSnippet.i18n.json b/i18n/cht/src/vs/workbench/parts/snippets/electron-browser/insertSnippet.i18n.json index de9b42f6ace..fb65a26db13 100644 --- a/i18n/cht/src/vs/workbench/parts/snippets/electron-browser/insertSnippet.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/snippets/electron-browser/insertSnippet.i18n.json @@ -4,5 +4,7 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "snippet.suggestions.label": "插入程式碼片段" + "snippet.suggestions.label": "插入程式碼片段", + "sep.userSnippet": "使用者程式碼片段", + "sep.extSnippet": "延伸模組程式碼片段" } \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/snippets/electron-browser/snippetsService.i18n.json b/i18n/cht/src/vs/workbench/parts/snippets/electron-browser/snippetsService.i18n.json index 16e82cf135f..8f1cdc4c641 100644 --- a/i18n/cht/src/vs/workbench/parts/snippets/electron-browser/snippetsService.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/snippets/electron-browser/snippetsService.i18n.json @@ -10,6 +10,7 @@ "vscode.extension.contributes.snippets": "提供程式碼片段。", "vscode.extension.contributes.snippets-language": "要予以提供此程式碼片段的語言識別碼。", "vscode.extension.contributes.snippets-path": "程式碼片段檔案的路徑。此路徑是擴充功能資料夾的相對路徑,而且一般會以 './snippets/' 開頭。", + "badFile": "無法讀取程式碼片段檔案 \"{0}\"。", "badVariableUse": "程式碼片段 \"{0}\" 很可能會混淆 snippet-variables 及 snippet-placeholders。如需詳細資料,請參閱 https://code.visualstudio.com/docs/editor/userdefinedsnippets#_snippet-syntax。", "source.snippet": "使用者程式碼片段", "detail.snippet": "{0} ({1})", diff --git a/i18n/cht/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json b/i18n/cht/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json index 58a261ac640..c9cc1fc25d5 100644 --- a/i18n/cht/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json @@ -13,11 +13,13 @@ "manyMarkers": "99+", "runningTasks": "顯示執行中的工作", "tasks": "工作", + "TaskSystem.noHotSwap": "必須重新載入視窗才可變更執行使用中工作的工作執行引擎", "TaskService.noBuildTask1": "未定義任何建置工作。請使用 'isBuildCommand' 標記 tasks.json 檔案中的工作。", "TaskService.noBuildTask2": "未定義任何組建工作,請在 tasks.json 檔案中將工作標記為 'build' 群組。", "TaskService.noTestTask1": "未定義任何建置工作。請使用 'isTestCommand' 標記 tasks.json 檔案中的工作。", "TaskService.noTestTask2": "未定義任何測試工作,請在 tasks.json 檔案中將工作標記為 'test' 群組。", "TaskServer.noTask": "找不到所要求要執行的工作 {0}。", + "TaskService.associate": "建立關聯", "TaskService.attachProblemMatcher.continueWithout": "在不掃描工作輸出的情況下繼續", "TaskService.attachProblemMatcher.never": "永不掃描工作輸出", "TaskService.attachProblemMatcher.learnMoreAbout": "深入了解掃描工作輸出", @@ -29,6 +31,7 @@ "TaskSystem.active": "已有工作在執行。請先終止該工作,然後再執行其他工作。", "TaskSystem.restartFailed": "無法終止再重新啟動工作 {0}", "TaskSystem.configurationErrors": "錯誤: 提供的工作組態具有驗證錯誤而無法使用。請先更正這些錯誤。", + "taskService.ignoreingFolder": "略過工作區資料夾 {0} 的工作組態。所有的資料夾都必須使用工作版本 2.0.0 才可使用多資料夾工作區工作支援\n", "TaskSystem.invalidTaskJson": "錯誤: tasks.json 檔案的內容具有語法錯誤。請更正錯誤,再執行工作\n", "TaskSystem.runningTask": "有一個工作正在執行。要終止工作嗎?", "TaskSystem.terminateTask": "終止工作(&&T)", @@ -40,20 +43,33 @@ "recentlyUsed": "最近使用的工作", "configured": "設定的工作", "detected": "偵測到的工作", + "TaskService.ignoredFolder": "下列工作區資料夾因為使用工作版本 0.1.0,所以已略過:", "TaskService.notAgain": "不要再顯示", "TaskService.ok": "確定", + "TaskService.pickRunTask": "請選取要執行的工作", + "TaslService.noEntryToRun": "找不到任何要執行的工作。請設定工作...", "TaskService.fetchingBuildTasks": "正在擷取組建工作...", "TaskService.pickBuildTask": "請選取要執行的組建工作", + "TaskService.noBuildTask": "找不到任何要執行的組建工作。請設定工作...", "TaskService.fetchingTestTasks": "正在擷取測試工作...", "TaskService.pickTestTask": "請選取要執行的測試工作", + "TaskService.noTestTaskTerminal": "找不到任何要執行的測試工作。請設定工作...", "TaskService.tastToTerminate": "請選取要終止的工作", + "TaskService.noTaskRunning": "目前未執行任何工作", "TerminateAction.noProcess": "啟動的處理序已不存在。如果工作繁衍的背景工作結束,VS Code 可能會產生孤立的處理序。", "TerminateAction.failed": "無法終止執行中的工作", "TaskService.tastToRestart": "請選取要重新啟動的工作", + "TaskService.noTaskToRestart": "沒有要重新啟動的工作", + "TaskService.template": "選取工作範本", + "TaskService.createJsonFile": "從範本建立 tasks.json 檔案", + "TaskService.openJsonFile": "開啟 tasks.json 檔案", + "TaskService.pickTask": "選取要設定的工作", + "TaskService.defaultBuildTaskExists": "已經將 {0} 標記為預設組建工作", "TaskService.pickDefaultBuildTask": "請選取要用作預設組建工作的工作", "TaskService.defaultTestTaskExists": "已經將 {0} 標記為預設測試工作。", "TaskService.pickDefaultTestTask": "請選取要用作預設測試工作的工作", "TaskService.pickShowTask": "選取要顯示輸出的工作", + "TaskService.noTaskIsRunning": "未執行任何工作", "ShowLogAction.label": "顯示工作記錄檔", "RunTaskAction.label": "執行工作", "RestartTaskAction.label": "重新開始執行工作", diff --git a/i18n/cht/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.i18n.json b/i18n/cht/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.i18n.json index 871f4fbea5a..a45b9045bdb 100644 --- a/i18n/cht/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.i18n.json @@ -5,6 +5,7 @@ // Do not edit this file. It is machine generated. { "TerminalTaskSystem.unknownError": "執行工作時發生不明錯誤。如需詳細資訊,請參閱工作輸出記錄檔。", + "dependencyFailed": "無法解決在工作區資料夾 '{1}' 中的相依工作 '{0}'", "TerminalTaskSystem.terminalName": "工作 - {0}", "reuseTerminal": "工作將被重新啟用.按任意鍵關閉.", "TerminalTaskSystem": "無法在 UNC 磁碟機上執行殼層命令。", diff --git a/i18n/cht/src/vs/workbench/parts/tasks/node/taskConfiguration.i18n.json b/i18n/cht/src/vs/workbench/parts/tasks/node/taskConfiguration.i18n.json index 4ce804042be..61b47eff6f8 100644 --- a/i18n/cht/src/vs/workbench/parts/tasks/node/taskConfiguration.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/tasks/node/taskConfiguration.i18n.json @@ -12,6 +12,7 @@ "ConfigurationParser.invalidVaraibleReference": "錯誤: problemMatcher 參考無效: {0}\n", "ConfigurationParser.noTaskType": "錯誤: 工作組態必須具有型別屬性。將會忽略該組態。\n{0}\n", "ConfigurationParser.noTypeDefinition": "錯誤: 沒有已註冊工作類型 '{0}'。您是否忘記安裝提供相應工作提供者的延伸模組?", + "ConfigurationParser.missingRequiredProperty": "錯誤: 工作組態 '{0}' 缺少要求的屬性 '{1}'。會略過工作組態。", "ConfigurationParser.notCustom": "錯誤: 未將工作宣告為自訂工作。將會忽略該組態。\n{0}\n", "ConfigurationParser.noTaskName": "錯誤: 工作必須提供 taskName 屬性。即將忽略此工作。\n{0}\n", "taskConfiguration.shellArgs": "警告: 工作 '{0}' 是殼層命令,但命令名稱或其中一個引數有的未逸出的空格。若要確保命令列正確引述,請將引數合併到命令中。", diff --git a/i18n/cht/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json b/i18n/cht/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json index 4cc323017ff..db8c0bb2809 100644 --- a/i18n/cht/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json @@ -38,5 +38,6 @@ "workbench.action.terminal.focusFindWidget": "焦點尋找小工具", "workbench.action.terminal.hideFindWidget": "隱藏尋找小工具", "nextTerminalFindTerm": "顯示下一個尋找字詞", - "previousTerminalFindTerm": "顯示上一個尋找字詞" + "previousTerminalFindTerm": "顯示上一個尋找字詞", + "quickOpenTerm": "切換使用中的終端機 " } \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/terminal/electron-browser/terminalColorRegistry.i18n.json b/i18n/cht/src/vs/workbench/parts/terminal/electron-browser/terminalColorRegistry.i18n.json index f80c288cbec..3c4cccada80 100644 --- a/i18n/cht/src/vs/workbench/parts/terminal/electron-browser/terminalColorRegistry.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/terminal/electron-browser/terminalColorRegistry.i18n.json @@ -8,5 +8,6 @@ "terminal.foreground": "終端機的前景色彩。", "terminalCursor.foreground": "終端機游標的前景色彩。", "terminalCursor.background": "終端機游標的背景色彩。允許區塊游標重疊於自訂字元色彩。", + "terminal.selectionBackground": "終端機的選取項目背景色彩。", "terminal.ansiColor": "終端機中的 '{0}' ANSI 色彩。" } \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json b/i18n/cht/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json index 69805b63ee1..db1fb1ca656 100644 --- a/i18n/cht/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json @@ -10,6 +10,7 @@ "welcomePage.newFile": "新增檔案", "welcomePage.openFolder": "開啟資料夾...", "welcomePage.cloneGitRepository": "複製 Git 存放庫...", + "welcomePage.addWorkspaceFolder": "新增工作區資料夾...", "welcomePage.recent": "最近使用", "welcomePage.moreRecent": "更多...", "welcomePage.noRecentFolders": "沒有最近使用的資料夾", diff --git a/i18n/cht/src/vs/workbench/services/configuration/node/configuration.i18n.json b/i18n/cht/src/vs/workbench/services/configuration/node/configuration.i18n.json index b9826aee605..2bc73e75628 100644 --- a/i18n/cht/src/vs/workbench/services/configuration/node/configuration.i18n.json +++ b/i18n/cht/src/vs/workbench/services/configuration/node/configuration.i18n.json @@ -13,6 +13,12 @@ "invalid.title": "'configuration.title' 必須是字串", "vscode.extension.contributes.defaultConfiguration": "依語言貢獻預設編輯器組態設定。", "invalid.properties": "'configuration.properties' 必須是物件", + "invalid.allOf": "'configuration.allOf' 已取代而不應再使用。請改為將多個組態區段作為陣列,傳遞至「組態」貢獻點。", + "workspaceConfig.folders.description": "要載入工作區之資料夾的清單。", "workspaceConfig.path.description": "檔案路徑,例如 `/root/folderA` 或 `./folderA` 即為會對工作區檔案位置解析的相關路徑。", - "workspaceConfig.settings.description": "工作區設定" + "workspaceConfig.name.description": "資料夾的選用名稱。", + "workspaceConfig.uri.description": "資料夾的 URI", + "workspaceConfig.settings.description": "工作區設定", + "workspaceConfig.extensions.description": "工作區延伸模組", + "unknownWorkspaceProperty": "未知的工作區組態屬性" } \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json b/i18n/cht/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json index d447bb3b585..2775ad9c28f 100644 --- a/i18n/cht/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json +++ b/i18n/cht/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json @@ -4,13 +4,26 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { + "openTasksConfiguration": "開啟工作組態", + "openLaunchConfiguration": "開啟啟動組態", "close": "關閉", "open": "開啟設定", + "saveAndRetry": "儲存並重試", "errorUnknownKey": "因為 {1} 非已註冊的組態,所以無法寫入至 {0}。", "errorInvalidFolderConfiguration": "因為 {0} 不支援資料夾資源範圍,所以無法寫入至資料夾設定。", "errorInvalidUserTarget": "因為 {0} 不支援全域範圍,所以無法寫入至使用者設定。", "errorInvalidFolderTarget": "因為未提供資源,所以無法寫入至資料夾設定。", "errorNoWorkspaceOpened": "因為未開啟工作區,所以無法寫入至 {0}。請先開啟工作區,再試一次。", + "errorInvalidTaskConfiguration": "無法寫入工作檔案。請開啟 **工作** 檔案以修正其中的錯誤/警告,然後重試一次。", + "errorInvalidLaunchConfiguration": "無法寫入啟動檔案。請開啟 **啟動** 檔案以修正其中的錯誤/警告,然後重試一次。", + "errorInvalidConfiguration": "無法寫入使用者設定。請開啟 **使用者設定** 檔案以修正其中的錯誤/警告,然後重試一次。", + "errorInvalidConfigurationWorkspace": "無法寫入工作區設定。請開啟 **工作區設定** 檔案以修正其中的錯誤/警告,然後重試一次。", + "errorInvalidConfigurationFolder": "無法寫入資料夾設定。請開啟 **{0}** 資料夾下的 **資料夾設定** 檔案以修正其中的錯誤/警告,然後重試一次。", + "errorTasksConfigurationFileDirty": "因為檔案已變更,所以無法寫入工作檔案。請儲存 **工作組態** 檔案,然後重試一次。", + "errorLaunchConfigurationFileDirty": "因為檔案已變更,所以無法寫入啟動檔案。請儲存 **啟動組態** 檔案,然後重試一次。", + "errorConfigurationFileDirty": "因為檔案已變更,所以無法寫入使用者設定。請儲存 **使用者設定** 檔案,然後重試一次。", + "errorConfigurationFileDirtyWorkspace": "因為檔案已變更,所以無法寫入工作區設定。請儲存 **工作區設定** 檔案,然後重試一次。", + "errorConfigurationFileDirtyFolder": "因為檔案已變更,所以無法寫入資料夾設定。請儲存 **{0}** 資料夾下的 **資料夾設定** 檔案,然後重試一次。", "userTarget": "使用者設定", "workspaceTarget": "工作區設定", "folderTarget": "資料夾設定" diff --git a/i18n/cht/src/vs/workbench/services/files/node/fileService.i18n.json b/i18n/cht/src/vs/workbench/services/files/node/fileService.i18n.json index e5385600913..745c027703e 100644 --- a/i18n/cht/src/vs/workbench/services/files/node/fileService.i18n.json +++ b/i18n/cht/src/vs/workbench/services/files/node/fileService.i18n.json @@ -5,10 +5,12 @@ // Do not edit this file. It is machine generated. { "fileInvalidPath": "檔案資源 ({0}) 無效", + "fileIsDirectoryError": "檔案是目錄", "fileNotModifiedError": "未修改檔案的時間", "fileTooLargeError": "檔案太大無法開啟", "fileBinaryError": "檔案似乎是二進位檔,因此無法當做文字開啟", "fileNotFoundError": "找不到檔案 ({0})", + "fileExists": "要建立的檔案已存在 ({0})", "fileMoveConflict": "無法移動/複製。目的地已存在檔案。", "unableToMoveCopyError": "無法移動/複製。檔案會取代其所在的資料夾。", "foldersCopyError": "資料夾不能複製到工作區。請選取個別檔案進行複製。", diff --git a/i18n/deu/src/vs/editor/contrib/format/browser/formatActions.i18n.json b/i18n/deu/src/vs/editor/contrib/format/browser/formatActions.i18n.json index 52715dd20db..653f3d96284 100644 --- a/i18n/deu/src/vs/editor/contrib/format/browser/formatActions.i18n.json +++ b/i18n/deu/src/vs/editor/contrib/format/browser/formatActions.i18n.json @@ -8,6 +8,6 @@ "hintn1": "{0} Formatierungen in Zeile {1} vorgenommen", "hint1n": "1 Formatierung zwischen Zeilen {0} und {1} vorgenommen", "hintnn": "{0} Formatierungen zwischen Zeilen {1} und {2} vorgenommen", - "formatDocument.label": "Format Document", - "formatSelection.label": "Format Selection" + "formatDocument.label": "Dokument formatieren", + "formatSelection.label": "Auswahl formatieren" } \ No newline at end of file diff --git a/i18n/deu/src/vs/editor/contrib/gotoError/browser/gotoError.i18n.json b/i18n/deu/src/vs/editor/contrib/gotoError/browser/gotoError.i18n.json index 4be670f8913..02553773e89 100644 --- a/i18n/deu/src/vs/editor/contrib/gotoError/browser/gotoError.i18n.json +++ b/i18n/deu/src/vs/editor/contrib/gotoError/browser/gotoError.i18n.json @@ -9,5 +9,6 @@ "markerAction.previous.label": "Gehe zum vorherigen Fehler oder zur vorherigen Warnung", "editorMarkerNavigationError": "Editormarkierung: Farbe bei Fehler des Navigationswidgets.", "editorMarkerNavigationWarning": "Editormarkierung: Farbe bei Warnung des Navigationswidgets.", + "editorMarkerNavigationInfo": "Editormarkierung: Farbe bei Warnung des Navigationswidgets.", "editorMarkerNavigationBackground": "Editormarkierung: Hintergrund des Navigationswidgets." } \ No newline at end of file diff --git a/i18n/deu/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json b/i18n/deu/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json index c43709d2e6c..521e20ed207 100644 --- a/i18n/deu/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json +++ b/i18n/deu/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json @@ -6,6 +6,7 @@ { "invalidManifest": "Die Erweiterung ist ungültig: \"package.json\" ist keine JSON-Datei.", "restartCodeLocal": "Bitte starten Sie Code vor der Neuinstallation von {0} neu.", + "restartCodeGallery": "Bitte vor der Neuinstallation VSCode neu starten.", "uninstallDependeciesConfirmation": "Möchten Sie nur \"{0}\" oder auch die zugehörigen Abhängigkeiten deinstallieren?", "uninstallOnly": "Nur", "uninstallAll": "Alle", diff --git a/i18n/deu/src/vs/platform/theme/common/colorExtensionPoint.i18n.json b/i18n/deu/src/vs/platform/theme/common/colorExtensionPoint.i18n.json index c0e8f5d0d59..27b155956bb 100644 --- a/i18n/deu/src/vs/platform/theme/common/colorExtensionPoint.i18n.json +++ b/i18n/deu/src/vs/platform/theme/common/colorExtensionPoint.i18n.json @@ -15,5 +15,6 @@ "invalid.default.colorType": "{0} muss entweder eine Farbe als Hex-Code (#RRGGBB[AA] oder #RGB[A]) sein oder der Bezeichner einer verwendbaren Farbe, der eine Standardeinstellung bereitstellt.", "invalid.id": "\"configuration.colors.id\" muss definiert und nicht leer sein", "invalid.id.format": "\"configuration.colors.id\" muss auf das Wort[.word]* folgen", + "invalid.description": "\"configuration.colors.description\" muss definiert und darf nicht leer sein", "invalid.defaults": "\"configuration.colors.defaults\" muss definiert sein, und \"light\", \"dark\" und \"highContrast\" enthalten" } \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/browser/parts/activitybar/activitybarActions.i18n.json b/i18n/deu/src/vs/workbench/browser/parts/activitybar/activitybarActions.i18n.json index 4437919e515..9ce0dd879da 100644 --- a/i18n/deu/src/vs/workbench/browser/parts/activitybar/activitybarActions.i18n.json +++ b/i18n/deu/src/vs/workbench/browser/parts/activitybar/activitybarActions.i18n.json @@ -6,6 +6,7 @@ { "badgeTitle": "{0} - {1}", "titleKeybinding": "{0} ({1})", + "removeFromActivityBar": "Auf Aktivitätsleiste ausblenden", "keepInActivityBar": "In Aktivitätsleiste behalten", "additionalViews": "Zusätzliche Ansichten", "numberBadge": "{0} ({1})", diff --git a/i18n/deu/src/vs/workbench/electron-browser/actions.i18n.json b/i18n/deu/src/vs/workbench/electron-browser/actions.i18n.json index fc58109765a..93902d627de 100644 --- a/i18n/deu/src/vs/workbench/electron-browser/actions.i18n.json +++ b/i18n/deu/src/vs/workbench/electron-browser/actions.i18n.json @@ -42,5 +42,6 @@ "navigateUp": "Zur Ansicht darüber navigieren", "navigateDown": "Zur Ansicht darunter navigieren", "increaseViewSize": "Aktuelle Ansicht vergrößern", - "decreaseViewSize": "Aktuelle Ansicht verkleinern" + "decreaseViewSize": "Aktuelle Ansicht verkleinern", + "mergeAllWindowTabs": "Alle Fenster zusammenführen" } \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/services/files/node/fileService.i18n.json b/i18n/deu/src/vs/workbench/services/files/node/fileService.i18n.json index e44865e5a0f..31c6c3ed3e6 100644 --- a/i18n/deu/src/vs/workbench/services/files/node/fileService.i18n.json +++ b/i18n/deu/src/vs/workbench/services/files/node/fileService.i18n.json @@ -5,6 +5,7 @@ // Do not edit this file. It is machine generated. { "fileInvalidPath": "Ungültige Dateiressource ({0})", + "fileIsDirectoryError": "Die Datei ist ein Verzeichnis", "fileNotModifiedError": "Datei nicht geändert seit", "fileTooLargeError": "Die Datei ist zu groß, um sie zu öffnen.", "fileBinaryError": "Die Datei scheint eine Binärdatei zu sein und kann nicht als Text geöffnet werden.", diff --git a/i18n/esn/src/vs/platform/actions/electron-browser/menusExtensionPoint.i18n.json b/i18n/esn/src/vs/platform/actions/electron-browser/menusExtensionPoint.i18n.json index c9693e97782..fc4e80ef3e4 100644 --- a/i18n/esn/src/vs/platform/actions/electron-browser/menusExtensionPoint.i18n.json +++ b/i18n/esn/src/vs/platform/actions/electron-browser/menusExtensionPoint.i18n.json @@ -20,6 +20,7 @@ "menus.editorTabContext": "El menú contextual de pestañas del editor", "menus.debugCallstackContext": "El menú contextual de la pila de llamadas de depuración", "menus.scmTitle": "El menú del título Control de código fuente", + "menus.scmSourceControl": "El menú de Control de código fuente", "menus.resourceGroupContext": "El menú contextual del grupo de recursos de Control de código fuente", "menus.resourceStateContext": "El menú contextual de estado de recursos de Control de código fuente", "view.viewTitle": "El menú de título de vista contribuida", diff --git a/i18n/esn/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json b/i18n/esn/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json index e0975190eb1..71dc1648d7c 100644 --- a/i18n/esn/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json +++ b/i18n/esn/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json @@ -13,5 +13,7 @@ "vscode.extension.contributes.views": "Aporta vistas al editor", "views.explorer": "Vista del explorador", "views.debug": "Vista de depuración", - "locationId.invalid": "`{0}` no es una ubicación de vista válida" + "locationId.invalid": "`{0}` no es una ubicación de vista válida", + "duplicateView1": "No se pueden registrar múltiples vistas con el mismo identificador '{0}' en la ubicación '{1}'", + "duplicateView2": "Una vista con el identificador '{0}' ya está registrada en la ubicación '{1}'" } \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json b/i18n/esn/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json index 53cb8c300f6..d3bb899fc07 100644 --- a/i18n/esn/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json +++ b/i18n/esn/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json @@ -11,6 +11,7 @@ "endOfLineLineFeed": "LF", "endOfLineCarriageReturnLineFeed": "CRLF", "tabFocusModeEnabled": "Tabulación Mueve el Foco", + "screenReaderDetected": "Lector de pantalla optimizado", "screenReaderDetectedExtra": "Si no va a usar un lector de pantalla, cambie el valor de configuración \"editor.accessibilitySupport\" a \"desactivado\".", "disableTabMode": "Deshabilitar modo de accesibilidad", "gotoLine": "Ir a la línea", @@ -47,8 +48,10 @@ "guessedEncoding": "Adivinado por el contenido", "pickEncodingForReopen": "Seleccionar codificación de archivo para reabrir archivo", "pickEncodingForSave": "Seleccionar codificación de archivo para guardar", + "screenReaderDetectedExplanation.title": "Lector de pantalla optimizado", "screenReaderDetectedExplanation.question": "¿Está usando un lector de pantalla con VS Code?", "screenReaderDetectedExplanation.answerYes": "Sí", "screenReaderDetectedExplanation.answerNo": "No", - "screenReaderDetectedExplanation.body1": "VS Code se ha optimizado para ser utilizado con un lector de pantalla" + "screenReaderDetectedExplanation.body1": "VS Code se ha optimizado para ser utilizado con un lector de pantalla", + "screenReaderDetectedExplanation.body2": "Algunas características del editor tendrán comportamientos diferentes: por ejemplo, los ajustes de línea, plegamiento, cierre automático de llaves, etc." } \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/browser/parts/views/viewsRegistry.i18n.json b/i18n/esn/src/vs/workbench/browser/parts/views/viewsRegistry.i18n.json index 8b6ad71cd4e..f22e31a7e45 100644 --- a/i18n/esn/src/vs/workbench/browser/parts/views/viewsRegistry.i18n.json +++ b/i18n/esn/src/vs/workbench/browser/parts/views/viewsRegistry.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "duplicateId": "Ya existe una vista registrada con el identificador '{0}' en la ubicación '{1}'" +} \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/electron-browser/main.contribution.i18n.json b/i18n/esn/src/vs/workbench/electron-browser/main.contribution.i18n.json index c05c6ca726c..4655a5812be 100644 --- a/i18n/esn/src/vs/workbench/electron-browser/main.contribution.i18n.json +++ b/i18n/esn/src/vs/workbench/electron-browser/main.contribution.i18n.json @@ -10,13 +10,14 @@ "workspaces": "Áreas de trabajo", "developer": "Desarrollador", "showEditorTabs": "Controla si los editores abiertos se deben mostrar o no en pestañas.", - "workbench.editor.labelFormat.default": "Mostrar el nombre del archivo. Cuando las pestañas están habilitadas y dos archivos tienen el mismo nombre en un grupo, se agregan las secciones distintivas de la ruta de acceso de cada archivo. Cuando las pestañas están deshabilitadas, se muestra la ruta de acceso relativa a la raíz del espacio de trabajo si el editor está activo.", + "workbench.editor.labelFormat.default": "Mostrar el nombre del archivo. Cuando las pestañas están habilitadas y dos archivos tienen el mismo nombre en un grupo, se agregan las secciones distintivas de la ruta de acceso de cada archivo. Cuando las pestañas están deshabilitadas, se muestra la ruta de acceso relativa a la raíz del área de trabajo si el editor está activo.", "workbench.editor.labelFormat.short": "Mostrar el nombre del archivo seguido de su nombre de directorio.", "workbench.editor.labelFormat.medium": "Mostrar el nombre del archivo seguido de la ruta de acceso relativo a la raíz del espacio de trabajo.", "workbench.editor.labelFormat.long": "Mostrar el nombre del archivo seguido de la ruta de acceso absoluta.", "tabDescription": "Controla el formato de la etiqueta para un editor. Modificar este ajuste puede hacer, por ejemplo, que sea más fácil entender la ubicación de un archivo: - corta: 'parent' - media: 'workspace/src/parent' - larga: '/home/user/workspace/src/parect' - por defecto: '.../parent', cuando otra pestaña comparte el mismo título, o la ruta de acceso relativa del espacio de trabajo si las pestañas están deshabilitadas", "editorTabCloseButton": "Controla la posición de los botones de cierre de pestañas del editor o los deshabilita si se establece en \"off\".", "showIcons": "Controla si los editores abiertos deben mostrarse o no con un icono. Requiere que también se habilite un tema de icono.", + "enablePreview": "Controla si los editores abiertos se muestran en vista previa. Los editores en vista previa se reutilizan hasta que se guardan (por ejemplo, mediante doble clic o editándolos) y se muestran en cursiva.", "enablePreviewFromQuickOpen": "Controla si los editores abiertos mediante Quick Open se muestran en modo de vista previa. Los editores en modo de vista previa se reutilizan hasta que se conservan (por ejemplo, mediante doble clic o editándolos).", "editorOpenPositioning": "Controla dónde se abren los editores. Seleccione 'izquierda' o 'derecha' para abrir los editores situados a la izquierda o la derecha del que está actualmente activo. Seleccione 'primero' o 'último' para abrir los editores con independencia del que esté actualmente activo.", "revealIfOpen": "Controla si un editor se muestra en alguno de los grupos visibles cuando se abre. Si se deshabilita esta opción, un editor preferirá abrirse en el grupo de editores activo en ese momento. Si se habilita, un editor ya abierto se mostrará en lugar de volver a abrirse en el grupo de editores activo. Tenga en cuenta que hay casos en los que esta opción se omite; por ejemplo, cuando se fuerza la apertura de un editor en un grupo específico o junto al grupo activo actual.", diff --git a/i18n/esn/src/vs/workbench/parts/codeEditor/electron-browser/languageConfiguration/languageConfigurationExtensionPoint.i18n.json b/i18n/esn/src/vs/workbench/parts/codeEditor/electron-browser/languageConfiguration/languageConfigurationExtensionPoint.i18n.json index 87eaa41a91c..ebf04db12c2 100644 --- a/i18n/esn/src/vs/workbench/parts/codeEditor/electron-browser/languageConfiguration/languageConfigurationExtensionPoint.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/codeEditor/electron-browser/languageConfiguration/languageConfigurationExtensionPoint.i18n.json @@ -39,6 +39,7 @@ "schema.indentationRules.unIndentedLinePattern.errorMessage": "Debe coincidir con el patrón `/^([gimuy]+)$/`.", "schema.folding": "Configuración del plegamiento de idioma.", "schema.folding.offSide": "Un idioma se adhiere a la regla del fuera de juego si los bloques en ese idioma se expresan por su sangría. Si se establece, las líneas vacías pertenecen al bloque posterior.", + "schema.folding.markers": "Marcadores de plegado específicos de un idioma, como \"'#region\" o \"#endregion\". Se probarán los valores regex en relación con el contenido de todas las líneas, y deben estar diseñados de manera eficiente.", "schema.folding.markers.start": "El patrón de expresión regular para el marcador de inicio. La expresión regular debe comenzar con '^'.", "schema.folding.markers.end": "El patrón de expresión regular para el marcador de fin. La expresión regular debe comenzar con '^'." } \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/debug/electron-browser/debugService.i18n.json b/i18n/esn/src/vs/workbench/parts/debug/electron-browser/debugService.i18n.json index 376b321d29b..39eca78322f 100644 --- a/i18n/esn/src/vs/workbench/parts/debug/electron-browser/debugService.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/debug/electron-browser/debugService.i18n.json @@ -12,8 +12,8 @@ "breakpointRemoved": "Punto de interrupción quitado, línea {0}, archivo {1}", "compoundMustHaveConfigurations": "El compuesto debe tener configurado el atributo \"configurations\" a fin de iniciar varias configuraciones.", "configMissing": "La configuración \"{0}\" falta en \"launch.json\".", - "debugRequestNotSupported": "La solicitud de depuración configurada '{0}' no es compatible", - "debugRequesMissing": "Falta la solicitud de depuración en la configuración de inicio seleccionada", + "debugRequestNotSupported": "La configuración de depuración seleccionada tiene un valor de atributo '{0}': '{1}' no compatible.", + "debugRequesMissing": "El atributo '{0}' está ausente en la configuración de depuración elegida.", "debugTypeNotSupported": "El tipo de depuración '{0}' configurado no es compatible.", "debugTypeMissing": "Falta la propiedad \"type\" en la configuración de inicio seleccionada.", "preLaunchTaskErrors": "Errores de compilación durante la tarea preLaunchTask '{0}'.", diff --git a/i18n/esn/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json b/i18n/esn/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json index c7638aea114..854b93846ec 100644 --- a/i18n/esn/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json @@ -5,10 +5,12 @@ // Do not edit this file. It is machine generated. { "reallyRecommended2": "Para este tipo de archivo, se recomineda la extensión '{0}'.", + "reallyRecommendedExtensionPack": "Para este tipo de fichero, se recomienda el paquete de extensión '{0}'.", "showRecommendations": "Mostrar recomendaciones", "neverShowAgain": "No volver a mostrar", "close": "Cerrar", "workspaceRecommended": "Esta área de trabajo tiene recomendaciones de extensión.", + "ignoreExtensionRecommendations": "¿Desea ignorar todas las recomendaciones de la extensión?", "ignoreAll": "Sí, despreciar todas.", "no": "No", "cancel": "Cancelar" diff --git a/i18n/esn/src/vs/workbench/parts/files/browser/files.contribution.i18n.json b/i18n/esn/src/vs/workbench/parts/files/browser/files.contribution.i18n.json index 5d7195fc652..d4d0e949460 100644 --- a/i18n/esn/src/vs/workbench/parts/files/browser/files.contribution.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/files/browser/files.contribution.i18n.json @@ -10,6 +10,7 @@ "textFileEditor": "Editor de archivos de texto", "binaryFileEditor": "Editor de archivos binarios", "filesConfigurationTitle": "Archivos", + "exclude": "Configurar los patrones globales para excluir archivos y carpetas. Por ejemplo, el explorador de archivos decide que archivos y carpetas mostrar u ocultar según esta configuración.", "files.exclude.boolean": "El patrón global con el que se harán coincidir las rutas de acceso de los archivos. Establézcalo en true o false para habilitarlo o deshabilitarlo.", "files.exclude.when": "Comprobación adicional de los elementos del mismo nivel de un archivo coincidente. Use $(nombreBase) como variable para el nombre de archivo que coincide.", "associations": "Configure asociaciones de archivo para los lenguajes (por ejemplo, \"*.extension\": \"html\"). Estas asociaciones tienen prioridad sobre las asociaciones predeterminadas de los lenguajes instalados.", @@ -18,6 +19,7 @@ "eol": "Carácter predeterminado de final de línea. Utilice \\n para LF y \\r\\n para CRLF.", "trimTrailingWhitespace": "Si se habilita, se recortará el espacio final cuando se guarde un archivo.", "insertFinalNewline": "Si se habilita, inserte una nueva línea final al final del archivo cuando lo guarde.", + "trimFinalNewlines": "Cuando se habilita, recorta todas las nuevas líneas después de la última nueva línea al final del archivo al guardarlo", "files.autoSave.off": "Un archivo con modificaciones no se guarda nunca automáticamente.", "files.autoSave.afterDelay": "Un archivo con modificaciones se guarda automáticamente tras la propiedad \"files.autoSaveDelay\" configurada.", "files.autoSave.onFocusChange": "Un archivo con modificaciones se guarda automáticamente cuando el editor deja de fijarse en él.", diff --git a/i18n/esn/src/vs/workbench/parts/scm/electron-browser/scmViewlet.i18n.json b/i18n/esn/src/vs/workbench/parts/scm/electron-browser/scmViewlet.i18n.json index 5c65b30517e..6b08e43a291 100644 --- a/i18n/esn/src/vs/workbench/parts/scm/electron-browser/scmViewlet.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/scm/electron-browser/scmViewlet.i18n.json @@ -5,6 +5,7 @@ // Do not edit this file. It is machine generated. { "scm providers": "Proveedores de Control de Código fuente", + "hideRepository": "Ocultar", "commitMessage": "Message (press {0} to commit)", "installAdditionalSCMProviders": "Instalar proveedores adicionales de SCM...", "no open repo": "No hay proveedores de control de código fuente activos.", diff --git a/i18n/esn/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json b/i18n/esn/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json index bc178db6915..ad64a450cf5 100644 --- a/i18n/esn/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json @@ -31,6 +31,7 @@ "TaskSystem.active": "Ya hay una tarea en ejecución. Finalícela antes de ejecutar otra tarea.", "TaskSystem.restartFailed": "No se pudo terminar y reiniciar la tarea {0}", "TaskSystem.configurationErrors": "Error: La configuración de la tarea proporcionada tiene errores de validación y no se puede usar. Corrija los errores primero.", + "taskService.ignoreingFolder": "Ignorando las configuraciones de tarea para la carpeta del area de trabajo {0}. El soporte de tarea de area de trabajo multi carpeta requiere que todas las carpetas usen la versión de tarea 2.0.0 ", "TaskSystem.invalidTaskJson": "Error: El contenido del archivo tasks.json tiene errores de sintaxis. Corríjalos antes de ejecutar una tarea.", "TaskSystem.runningTask": "Hay una tarea en ejecución. ¿Quiere finalizarla?", "TaskSystem.terminateTask": "&&Finalizar tarea", @@ -42,6 +43,7 @@ "recentlyUsed": "Tareas usadas recientemente", "configured": "tareas configuradas", "detected": "tareas detectadas", + "TaskService.ignoredFolder": "Las siguientes carpetas del espacio de trabajo se omiten ya que utilizan la versión 0.1.0 de tarea: ", "TaskService.notAgain": "No volver a mostrar", "TaskService.ok": "Aceptar", "TaskService.pickRunTask": "Seleccione la tarea a ejecutar", diff --git a/i18n/esn/src/vs/workbench/services/configuration/node/configuration.i18n.json b/i18n/esn/src/vs/workbench/services/configuration/node/configuration.i18n.json index a038f4e9746..7393d607455 100644 --- a/i18n/esn/src/vs/workbench/services/configuration/node/configuration.i18n.json +++ b/i18n/esn/src/vs/workbench/services/configuration/node/configuration.i18n.json @@ -19,5 +19,6 @@ "workspaceConfig.name.description": "Un nombre opcional para la carpeta. ", "workspaceConfig.uri.description": "URI de la carpeta", "workspaceConfig.settings.description": "Configuración de área de trabajo", - "workspaceConfig.extensions.description": "Extensiones del área de trabajo" + "workspaceConfig.extensions.description": "Extensiones del área de trabajo", + "unknownWorkspaceProperty": "Propiedad de configuración de espacio de trabajo desconocida" } \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json b/i18n/esn/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json index 7e1865b18d8..c76e49703cc 100644 --- a/i18n/esn/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json +++ b/i18n/esn/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json @@ -4,13 +4,26 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { + "openTasksConfiguration": "Abrir configuración de tareas", + "openLaunchConfiguration": "Abrir configuración de inicio", "close": "Cerrar", "open": "Abrir configuración", + "saveAndRetry": "Guardar y reintentar", "errorUnknownKey": "No se puede escribir en {0} porque {1} no es una configuración registrada.", "errorInvalidFolderConfiguration": "No se puede escribir en Configuración de carpeta porque {0} no admite el ámbito del recurso de carpeta.", "errorInvalidUserTarget": "No se puede escribir en Configuración de usuario porque {0} no admite el ámbito global.", "errorInvalidFolderTarget": "No se puede escribir en Configuración de carpeta porque no se ha proporcionado ningún recurso.", "errorNoWorkspaceOpened": "No se puede escribir en {0} porque no hay ninguna área de trabajo abierta. Abra un área de trabajo y vuelva a intentarlo.", + "errorInvalidTaskConfiguration": "No se puede escribir en el archivo de tareas. Por favor, abra el archivo de ** Tareas ** para corregir los errores/advertencias en él e inténtelo de nuevo.", + "errorInvalidLaunchConfiguration": "No se puede escribir en el archivo de inicio. Por favor, abra el archivo de ** Inicio** para corregir los errores/advertencias en él e inténtelo de nuevo.", + "errorInvalidConfiguration": "No se puede escribir en la configuración de usuario. Por favor, abra el archivo de **Configuración de usuario** para corregir los errores/advertencias en él e inténtelo de nuevo.", + "errorInvalidConfigurationWorkspace": "No se puede escribir en la configuración del área de trabajo. Por favor, abra el archivo de **Configuración de área de trabajo** para corregir los errores/advertencias en él e inténtelo de nuevo.", + "errorInvalidConfigurationFolder": "No se puede escribir en la configuración de carpeta. Por favor, abra el archivo de **Configuración de carpeta** para corregir los errores/advertencias en él e inténtelo de nuevo.", + "errorTasksConfigurationFileDirty": "No se puede escribir en el archivo de tareas porque el archivo se ha modificado. Por favor, guarde el archivo de **Configuración de Tareas** e inténtelo de nuevo.", + "errorLaunchConfigurationFileDirty": "No se puede escribir en el archivo de inicio porque el archivo se ha modificado. Por favor, guarde el archivo de **Configuración de inicio** e inténtelo de nuevo.", + "errorConfigurationFileDirty": "No se puede escribir en la configuración de usuario porque el archivo se ha modificado. Por favor, guarde el archivo de **Configuración de usuario** e inténtelo de nuevo.", + "errorConfigurationFileDirtyWorkspace": "No se puede escribir en la configuración del área de trabajo porque el archivo se ha modificado. Por favor, guarde el archivo de **Configuración del área de trabajo** e inténtelo de nuevo.", + "errorConfigurationFileDirtyFolder": "No se puede escribir en la configuración de carpeta porque el archivo se ha modificado. Por favor, guarde el archivo de **Configuración de carpeta** en la carpeta ** {0} ** e inténtelo de nuevo.", "userTarget": "Configuración de usuario", "workspaceTarget": "Configuración de área de trabajo", "folderTarget": "Configuración de carpeta" diff --git a/i18n/fra/src/vs/editor/common/config/commonEditorConfig.i18n.json b/i18n/fra/src/vs/editor/common/config/commonEditorConfig.i18n.json index 2b660d7b467..482947dff9a 100644 --- a/i18n/fra/src/vs/editor/common/config/commonEditorConfig.i18n.json +++ b/i18n/fra/src/vs/editor/common/config/commonEditorConfig.i18n.json @@ -11,6 +11,7 @@ "lineHeight": "Contrôle la hauteur de ligne. Utilisez 0 pour calculer lineHeight à partir de fontSize.", "letterSpacing": "Définit l'espacement des caractères en pixels.", "lineNumbers": "Contrôle l'affichage des numéros de ligne. Les valeurs possibles sont 'activé', 'désactivé' et 'relatif'. La valeur 'relatif' indique le numéro de ligne à partir de la position actuelle du curseur.", + "rulers": "Afficher les règles verticales après un certain nombre de caractères à espacement fixe. Utiliser plusieurs valeurs pour plusieurs règles. Aucune règle n'est dessinée si le tableau est vide", "wordSeparators": "Caractères utilisés comme séparateurs de mots durant la navigation ou les opérations basées sur les mots", "tabSize": "Nombre d'espaces correspondant à une tabulation. Ce paramètre est remplacé en fonction du contenu du fichier quand 'editor.detectIndentation' est activé.", "tabSize.errorMessage": "'number' attendu. Notez que la valeur \"auto\" a été remplacée par le paramètre 'editor.detectIndentation'.", diff --git a/i18n/fra/src/vs/platform/actions/electron-browser/menusExtensionPoint.i18n.json b/i18n/fra/src/vs/platform/actions/electron-browser/menusExtensionPoint.i18n.json index ca7209bfd1d..ed0024d2710 100644 --- a/i18n/fra/src/vs/platform/actions/electron-browser/menusExtensionPoint.i18n.json +++ b/i18n/fra/src/vs/platform/actions/electron-browser/menusExtensionPoint.i18n.json @@ -20,6 +20,7 @@ "menus.editorTabContext": "Menu contextuel des onglets de l'éditeur", "menus.debugCallstackContext": "Menu contextuel de la pile d'appels de débogage", "menus.scmTitle": "Menu du titre du contrôle de code source", + "menus.scmSourceControl": "Le menu de contrôle de code source", "menus.resourceGroupContext": "Menu contextuel du groupe de ressources du contrôle de code source", "menus.resourceStateContext": "Menu contextuel de l'état des ressources du contrôle de code source", "view.viewTitle": "Menu de titre de la vue ajoutée", diff --git a/i18n/fra/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json b/i18n/fra/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json index f29fc92b3e6..74930c2a09d 100644 --- a/i18n/fra/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json +++ b/i18n/fra/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json @@ -13,5 +13,7 @@ "vscode.extension.contributes.views": "Ajoute des vues à l'éditeur", "views.explorer": "Mode Explorateur", "views.debug": "Debug View", - "locationId.invalid": "'{0}' n'est pas un emplacement de vue valide" + "locationId.invalid": "'{0}' n'est pas un emplacement de vue valide", + "duplicateView1": "Impossible d’enregistrer des vues multiples avec le même id '{0}'» dans l’emplacement '{1}'", + "duplicateView2": "Une vue avec l’id `{0}` est déjà enregistrée à l’emplacement `{1}`" } \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json b/i18n/fra/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json index 4137209b78b..dc585654a46 100644 --- a/i18n/fra/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json +++ b/i18n/fra/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json @@ -11,6 +11,7 @@ "endOfLineLineFeed": "LF", "endOfLineCarriageReturnLineFeed": "CRLF", "tabFocusModeEnabled": "La touche Tab déplace le focus", + "screenReaderDetected": "Optimisé pour un lecteur d’écran ", "screenReaderDetectedExtra": "Si vous n'utilisez pas de lecteur d'écran, définissez le paramètre 'editor.accessibilitySupport' sur \"désactivé\".", "disableTabMode": "Désactiver le mode d'accessibilité", "gotoLine": "Atteindre la ligne", @@ -47,8 +48,10 @@ "guessedEncoding": "Deviné à partir du contenu", "pickEncodingForReopen": "Sélectionner l'encodage du fichier pour rouvrir le fichier", "pickEncodingForSave": "Sélectionner l'encodage du fichier à utiliser pour l'enregistrement", + "screenReaderDetectedExplanation.title": "Optimisé pour un lecteur d’écran ", "screenReaderDetectedExplanation.question": "Est-ce que vous utilisez un lecteur d’écran pour faire fonctionner VS Code ?", "screenReaderDetectedExplanation.answerYes": "Oui", "screenReaderDetectedExplanation.answerNo": "Non", - "screenReaderDetectedExplanation.body1": "VS Code est maintenant optimisé pour une utilisation avec un lecteur d’écran." + "screenReaderDetectedExplanation.body1": "VS Code est maintenant optimisé pour une utilisation avec un lecteur d’écran.", + "screenReaderDetectedExplanation.body2": "Certaines fonctionnalités de l’éditeur auront des comportements différents : par exemple l'encapsulation, le repliage, l'auto-fermeture des parenthèses, etc..." } \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/browser/parts/views/viewsRegistry.i18n.json b/i18n/fra/src/vs/workbench/browser/parts/views/viewsRegistry.i18n.json index 8b6ad71cd4e..e7ba8e9e54b 100644 --- a/i18n/fra/src/vs/workbench/browser/parts/views/viewsRegistry.i18n.json +++ b/i18n/fra/src/vs/workbench/browser/parts/views/viewsRegistry.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "duplicateId": "Une vue avec l’id `{0}` est déjà enregistrée à l’emplacement `{1}`" +} \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/electron-browser/main.contribution.i18n.json b/i18n/fra/src/vs/workbench/electron-browser/main.contribution.i18n.json index 8d36e6182fd..de18c2da7d0 100644 --- a/i18n/fra/src/vs/workbench/electron-browser/main.contribution.i18n.json +++ b/i18n/fra/src/vs/workbench/electron-browser/main.contribution.i18n.json @@ -10,13 +10,14 @@ "workspaces": "Espaces de travail", "developer": "Développeur", "showEditorTabs": "Contrôle si les éditeurs ouverts doivent s'afficher ou non sous des onglets.", - "workbench.editor.labelFormat.default": "Indiquer le nom du fichier. Lorsque les onglets sont activés et deux fichiers portent le même nom dans un groupe, les sections distinctes du chemin de chaque fichier sont ajoutées. Lorsque les onglets sont désactivées, le chemin relatif à la racine de l’espace de travail est affiché si l’éditeur est actif.", + "workbench.editor.labelFormat.default": "Affiche le nom du fichier. Lorsque les onglets sont activés et deux fichiers portent le même nom dans un groupe les sections distinctes du chemin de chaque fichier sont ajoutées. Lorsque les onglets sont désactivées, le chemin relatif à la racine d’espace de travail est affiché si l’éditeur est actif.", "workbench.editor.labelFormat.short": "Indiquer le nom du fichier suivi de son nom de répertoire.", "workbench.editor.labelFormat.medium": "Indiquer le nom du fichier suivi de son chemin d’accès relatif à la racine de l’espace de travail.", "workbench.editor.labelFormat.long": "Indiquer le nom du fichier suivi de son chemin d’accès absolu.", "tabDescription": "Contrôle le format de l’étiquette d’un éditeur. La modification de ce paramètre peut par exemple rendre plus facile la compréhension de l’emplacement d’un fichier :\n- short: 'parent'\n- medium: 'workspace/src/parent'\n- long: '/home/user/workspace/src/parent'\n- default: '.../parent', quand un autre onglet partage le même titre, ou la chemin d’accès relatif à l'espace de travail si les onglets sont désactivés", "editorTabCloseButton": "Contrôle la position des boutons de fermeture des onglets de l'éditeur, ou les désactive quand le paramètre a la valeur 'off'.", "showIcons": "Contrôle si les éditeurs ouverts doivent s'afficher ou non avec une icône. Cela implique notamment l'activation d'un thème d'icône.", + "enablePreview": "Contrôle si les éditeurs ouverts s'affichent en mode aperçu. Les éditeurs en mode aperçu sont réutilisés jusqu'à ce qu'ils soient conservés (par exemple, après un double-clic ou une modification) et apparaissent avec un style de police en italique.", "enablePreviewFromQuickOpen": "Contrôle si les éditeurs de Quick Open s'affichent en mode aperçu. Les éditeurs en mode aperçu sont réutilisés jusqu'à ce qu'ils soient conservés (par exemple, après un double-clic ou une modification).", "editorOpenPositioning": "Contrôle l'emplacement de l'ouverture des éditeurs. Sélectionnez 'left' ou 'right' pour ouvrir les éditeurs à gauche ou à droite de l'éditeur actuellement actif. Sélectionnez 'first' ou 'last' pour ouvrir les éditeurs indépendamment de l'éditeur actuellement actif.", "revealIfOpen": "Contrôle si un éditeur est affiché dans l'un des groupes visibles, s'il est ouvert. Si cette option est désactivée, l'éditeur s'ouvre de préférence dans le groupe d'éditeurs actif. Si cette option est activée, tout éditeur déjà ouvert est affiché au lieu d'être rouvert dans le groupe d'éditeurs actif. Notez que dans certains cas, ce paramètre est ignoré, par exemple quand vous forcez un éditeur à s'ouvrir dans un groupe spécifique ou à côté du groupe actif.", diff --git a/i18n/fra/src/vs/workbench/parts/codeEditor/electron-browser/languageConfiguration/languageConfigurationExtensionPoint.i18n.json b/i18n/fra/src/vs/workbench/parts/codeEditor/electron-browser/languageConfiguration/languageConfigurationExtensionPoint.i18n.json index f97dc7aa91f..07ecb08aee3 100644 --- a/i18n/fra/src/vs/workbench/parts/codeEditor/electron-browser/languageConfiguration/languageConfigurationExtensionPoint.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/codeEditor/electron-browser/languageConfiguration/languageConfigurationExtensionPoint.i18n.json @@ -38,5 +38,8 @@ "schema.indentationRules.unIndentedLinePattern.flags": "Indicateurs RegExp pour unIndentedLinePattern.", "schema.indentationRules.unIndentedLinePattern.errorMessage": "Doit valider l'expression régulière `/^([gimuy]+)$/`.", "schema.folding": "Paramètres de repliage de la langue.", - "schema.folding.offSide": "Un langage adhère à la règle du hors-champ si les blocs dans ce langage sont exprimées par leur indentation. Si spécifié, les lignes vides appartiennent au bloc suivant." + "schema.folding.offSide": "Un langage adhère à la règle du hors-champ si les blocs dans ce langage sont exprimées par leur indentation. Si spécifié, les lignes vides appartiennent au bloc suivant.", + "schema.folding.markers": "Les marqueurs de langage spécifiques de repliage tels que '#region' et '#endregion'. Les regex de début et la fin seront testés sur le contenu de toutes les lignes et doivent être conçues de manière efficace.", + "schema.folding.markers.start": "Le modèle de RegExp pour le marqueur de début. L’expression régulière doit commencer par '^'.", + "schema.folding.markers.end": "Le modèle de RegExp pour le marqueur de fin. L’expression régulière doit commencer par '^'." } \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/debug/electron-browser/debugService.i18n.json b/i18n/fra/src/vs/workbench/parts/debug/electron-browser/debugService.i18n.json index ff99f2314ff..d8dbd301b65 100644 --- a/i18n/fra/src/vs/workbench/parts/debug/electron-browser/debugService.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/debug/electron-browser/debugService.i18n.json @@ -12,8 +12,8 @@ "breakpointRemoved": "Point d'arrêt supprimé, ligne {0}, fichier {1}", "compoundMustHaveConfigurations": "L'attribut \"configurations\" du composé doit être défini pour permettre le démarrage de plusieurs configurations.", "configMissing": "Il manque la configuration '{0}' dans 'launch.json'.", - "debugRequestNotSupported": "La requête de débogage configurée '{0}' n'est pas prise en charge.", - "debugRequesMissing": "La requête de débogage est manquante pour la configuration de lancement choisie.", + "debugRequestNotSupported": "La configuration de débogage choisie a une valeur d’attribut non prise en charge `{0}` : `{1}`.", + "debugRequesMissing": "L’attribut `{0}` est introuvable dans la configuration de débogage choisie.", "debugTypeNotSupported": "Le type de débogage '{0}' configuré n'est pas pris en charge.", "debugTypeMissing": "Propriété 'type' manquante pour la configuration de lancement choisie.", "preLaunchTaskErrors": "Des erreurs de build ont été détectées durant le preLaunchTask '{0}'.", diff --git a/i18n/fra/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json b/i18n/fra/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json index d292ed93d68..8383b67bbc5 100644 --- a/i18n/fra/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json @@ -5,10 +5,12 @@ // Do not edit this file. It is machine generated. { "reallyRecommended2": "L'extension '{0}' est recommandée pour ce type de fichier.", + "reallyRecommendedExtensionPack": "Le pack d’extensions '{0}' est recommandé pour ce type de fichier.", "showRecommendations": "Afficher les recommandations", "neverShowAgain": "Ne plus afficher", "close": "Fermer", "workspaceRecommended": "Cet espace de travail a des recommandations d'extension.", + "ignoreExtensionRecommendations": "Voulez-vous ignorer toutes les recommandations d’extensions ?", "ignoreAll": "Oui, ignorer tout", "no": "Non", "cancel": "Annuler" diff --git a/i18n/fra/src/vs/workbench/parts/files/browser/files.contribution.i18n.json b/i18n/fra/src/vs/workbench/parts/files/browser/files.contribution.i18n.json index ecb4466a57e..066934ce4c8 100644 --- a/i18n/fra/src/vs/workbench/parts/files/browser/files.contribution.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/files/browser/files.contribution.i18n.json @@ -10,6 +10,7 @@ "textFileEditor": "Éditeur de fichier texte", "binaryFileEditor": "Éditeur de fichier binaire", "filesConfigurationTitle": "Fichiers", + "exclude": "Configurer des modèles glob pour exclure des fichiers et dossiers. Par exemple, l’explorateur de fichiers décide quels fichiers et dossiers afficher ou masquer en fonction de ce paramètre.", "files.exclude.boolean": "Modèle Glob auquel les chemins de fichiers doivent correspondre. Affectez la valeur true ou false pour activer ou désactiver le modèle.", "files.exclude.when": "Vérification supplémentaire des frères d'un fichier correspondant. Utilisez $(basename) comme variable pour le nom de fichier correspondant.", "associations": "Configurez les associations entre les fichiers et les langages (par exemple, \"*.extension\": \"html\"). Celles-ci ont priorité sur les associations par défaut des langages installés.", @@ -18,6 +19,7 @@ "eol": "Caractère de fin de ligne par défaut. Utilisez \\n pour LF et \\r\\n pour CRLF.", "trimTrailingWhitespace": "Si l'option est activée, l'espace blanc de fin est supprimé au moment de l'enregistrement d'un fichier.", "insertFinalNewline": "Quand l'option est activée, une nouvelle ligne finale est insérée à la fin du fichier au moment de son enregistrement.", + "trimFinalNewlines": "Si l'option est activée, va supprimer toutes les nouvelles lignes après la dernière ligne à la fin du fichier lors de l’enregistrement.", "files.autoSave.off": "Un fichier dont l'intégrité est compromise n'est jamais enregistré automatiquement.", "files.autoSave.afterDelay": "Un fichier dont l'intégrité est compromise est automatiquement enregistré après la configuration de 'files.autoSaveDelay'.", "files.autoSave.onFocusChange": "Un fichier dont l'intégrité est compromise est automatiquement enregistré quand l'éditeur perd le focus.", diff --git a/i18n/fra/src/vs/workbench/parts/scm/electron-browser/scmViewlet.i18n.json b/i18n/fra/src/vs/workbench/parts/scm/electron-browser/scmViewlet.i18n.json index f2a4104bb7f..81a1f808023 100644 --- a/i18n/fra/src/vs/workbench/parts/scm/electron-browser/scmViewlet.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/scm/electron-browser/scmViewlet.i18n.json @@ -5,6 +5,7 @@ // Do not edit this file. It is machine generated. { "scm providers": "Fournisseurs de contrôle de code source", + "hideRepository": "Masquer", "commitMessage": "Message (press {0} to commit)", "installAdditionalSCMProviders": "Installer des fournisseurs SCM supplémentaires...", "no open repo": "Il n’y a aucun fournisseur de contrôle de code source actif.", diff --git a/i18n/fra/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json b/i18n/fra/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json index f305685a88c..0f3f74aef8d 100644 --- a/i18n/fra/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json @@ -31,6 +31,7 @@ "TaskSystem.active": "Une tâche est déjà en cours d'exécution. Terminez-la avant d'exécuter une autre tâche.", "TaskSystem.restartFailed": "Échec de la fin de l'exécution de la tâche {0}", "TaskSystem.configurationErrors": "Erreur : la configuration de tâche fournie comporte des erreurs de validation et ne peut pas être utilisée. Corrigez d'abord les erreurs.", + "taskService.ignoreingFolder": "Les configurations de tâche seront ignorées pour le dossier de l’espace de travail {0}. Le support de la tâche d'espace de travail multi-dossier requiert que tous les dossiers utilisent task version 2.0.0\n", "TaskSystem.invalidTaskJson": "Erreur : le fichier tasks.json contient des erreurs de syntaxe. Corrigez-les avant d'exécuter une tâche.\n", "TaskSystem.runningTask": "Une tâche est en cours d'exécution. Voulez-vous la terminer ?", "TaskSystem.terminateTask": "&&Terminer la tâche", @@ -42,6 +43,7 @@ "recentlyUsed": "tâches récemment utilisées", "configured": "tâches configurées", "detected": "tâches détectées", + "TaskService.ignoredFolder": "Les dossiers d’espace de travail suivants sont ignorés car ils utilisent task version 0.1.0 : ", "TaskService.notAgain": "Ne plus afficher", "TaskService.ok": "OK", "TaskService.pickRunTask": "Sélectionner la tâche à exécuter", diff --git a/i18n/fra/src/vs/workbench/services/configuration/node/configuration.i18n.json b/i18n/fra/src/vs/workbench/services/configuration/node/configuration.i18n.json index 08d373ab90a..10bbc7a9e96 100644 --- a/i18n/fra/src/vs/workbench/services/configuration/node/configuration.i18n.json +++ b/i18n/fra/src/vs/workbench/services/configuration/node/configuration.i18n.json @@ -19,5 +19,6 @@ "workspaceConfig.name.description": "Un nom facultatif pour le dossier. ", "workspaceConfig.uri.description": "URI du dossier", "workspaceConfig.settings.description": "Paramètres de l’espace de travail", - "workspaceConfig.extensions.description": "Extensions de l’espace de travail" + "workspaceConfig.extensions.description": "Extensions de l’espace de travail", + "unknownWorkspaceProperty": "Propriété de configuration d’espace de travail inconnue" } \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json b/i18n/fra/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json index 0800ae0f420..8001c71bfc7 100644 --- a/i18n/fra/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json +++ b/i18n/fra/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json @@ -4,13 +4,26 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { + "openTasksConfiguration": "Ouvrir la configuration des tâches", + "openLaunchConfiguration": "Ouvrir la configuration du lancement", "close": "Fermer", "open": "Ouvrir les paramètres", + "saveAndRetry": "Enregistrer et Réessayer", "errorUnknownKey": "Impossible d’écrire dans {0} car {1} n’est pas une configuration recommandée.", "errorInvalidFolderConfiguration": "Impossible d’écrire dans les paramètres de dossier parce que {0} ne supporte pas la portée de ressource de dossier.", "errorInvalidUserTarget": "Impossible d’écrire dans les paramètres utilisateur parce que {0} ne supporte pas de portée globale.", "errorInvalidFolderTarget": "Impossible d’écrire dans les paramètres de dossier car aucune ressource n’est fournie.", "errorNoWorkspaceOpened": "Impossible d’écrire dans {0} car aucun espace de travail n’est ouvert. Veuillez ouvrir un espace de travail et essayer à nouveau.", + "errorInvalidTaskConfiguration": "Impossible d’écrire dans le fichier de tâches. Veuillez s’il vous plaît ouvrir le fichier **Tasks** pour corriger les erreurs/avertissements à l'intérieur et essayez à nouveau.", + "errorInvalidLaunchConfiguration": "Impossible d’écrire dans le fichier de lancement. Veuillez s’il vous plaît ouvrir le fichier **Launch** pour corriger les erreurs/avertissements à l'intérieur et essayez à nouveau.", + "errorInvalidConfiguration": "Impossible d’écrire dans les paramètres de l’utilisateur. Veuillez s’il vous plaît ouvrir le fichier **User Settings** pour corriger les erreurs/avertissements à l'intérieur et essayez à nouveau.", + "errorInvalidConfigurationWorkspace": "Impossible d’écrire dans les paramètres de l’espace de travail. Veuillez s’il vous plaît ouvrir le fichier **Workspace Settings** pour corriger les erreurs/avertissements dans le fichier et réessayez.", + "errorInvalidConfigurationFolder": "Impossible d’écrire dans les paramètres de dossier. Veuillez s’il vous plaît ouvrir le fichier **Folder Settings** sous le dossier **{0}** pour corriger les erreurs/avertissements à l'intérieur et essayez à nouveau.", + "errorTasksConfigurationFileDirty": "Impossible d’écrire dans le fichier de tâches car le fichier est en attente de sauvegarde. Veuillez s’il vous plaît enregistrer le fichier **Tasks Configuration** et essayez à nouveau.", + "errorLaunchConfigurationFileDirty": "Impossible d’écrire dans le fichier de lancement, car le fichier est en attente de sauvegarde. Veuillez s’il vous plaît enregistrer le fichier **Launch Configuration** et essayez à nouveau.", + "errorConfigurationFileDirty": "Impossible d’écrire dans les paramètres de l’utilisateur, car le fichier est en attente de sauvegarde. Veuillez s’il vous plaît enregistrer le fichier **User Settings** et essayez à nouveau.", + "errorConfigurationFileDirtyWorkspace": "Impossible d’écrire dans les paramètres de l’espace de travail, car le fichier est en attente de sauvegarde. Veuillez s’il vous plaît enregistrer le fichier **Workspace Settings** et essayez à nouveau.", + "errorConfigurationFileDirtyFolder": "Impossible d’écrire dans les paramètres de dossier parce que le fichier est attente de sauvegarde. Veuillez s’il vous plaît enregistrer le fichier **Folder Settings** sous le dossier **{0}** et essayez à nouveau.", "userTarget": "Paramètres utilisateur", "workspaceTarget": "Paramètres de l'espace de travail", "folderTarget": "Paramètres de dossier" diff --git a/i18n/hun/extensions/grunt/out/main.i18n.json b/i18n/hun/extensions/grunt/out/main.i18n.json index bddcecac9cc..343486514df 100644 --- a/i18n/hun/extensions/grunt/out/main.i18n.json +++ b/i18n/hun/extensions/grunt/out/main.i18n.json @@ -4,5 +4,5 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "execFailed": "A Grunt automatikus felderítése a mappához nem sikerült a következő hiba miatt: {0}" + "execFailed": "A Grunt automatikus felderítése a(z) {0} mappához nem sikerült a következő hiba miatt: {1}" } \ No newline at end of file diff --git a/i18n/hun/extensions/gulp/out/main.i18n.json b/i18n/hun/extensions/gulp/out/main.i18n.json index 2c833fdc8cb..9a22c2ad9b3 100644 --- a/i18n/hun/extensions/gulp/out/main.i18n.json +++ b/i18n/hun/extensions/gulp/out/main.i18n.json @@ -4,5 +4,5 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "execFailed": "A gulp automatikus felderítése a mappához nem sikerült a következő hiba miatt: {0}" + "execFailed": "A gulp automatikus felderítése a(z) {0} mappához nem sikerült a következő hiba miatt: {1}" } \ No newline at end of file diff --git a/i18n/hun/extensions/jake/out/main.i18n.json b/i18n/hun/extensions/jake/out/main.i18n.json index 0a05c39367e..3dd479da8bb 100644 --- a/i18n/hun/extensions/jake/out/main.i18n.json +++ b/i18n/hun/extensions/jake/out/main.i18n.json @@ -4,5 +4,5 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "execFailed": "A Jake automatikus felderítése a mappához nem sikerült a következő hiba miatt: {0}" + "execFailed": "A Jake automatikus felderítése a(z) {0} mappához nem sikerült a következő hiba miatt: {1}" } \ No newline at end of file diff --git a/i18n/hun/src/vs/platform/actions/electron-browser/menusExtensionPoint.i18n.json b/i18n/hun/src/vs/platform/actions/electron-browser/menusExtensionPoint.i18n.json index a2afa5b9e5e..27181140f4b 100644 --- a/i18n/hun/src/vs/platform/actions/electron-browser/menusExtensionPoint.i18n.json +++ b/i18n/hun/src/vs/platform/actions/electron-browser/menusExtensionPoint.i18n.json @@ -19,7 +19,8 @@ "menus.explorerContext": "A fájlkezelő helyi menüje", "menus.editorTabContext": "A szerkesztőablak füleinek helyi menüje", "menus.debugCallstackContext": "A hibakeresési hívási verem helyi menüje", - "menus.scmTitle": "A verziókezelő címsora menüje", + "menus.scmTitle": "A verziókezelő címsorának menüje", + "menus.scmSourceControl": "A verziókezelő menüje", "menus.resourceGroupContext": "A verziókezelő erőforráscsoportja helyi menüje", "menus.resourceStateContext": "A verziókzeleő erőforrásállapot helyi menüje", "view.viewTitle": "A szolgáltatott nézet címsorának menüje", diff --git a/i18n/hun/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json b/i18n/hun/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json index b7933d496e4..3b99b32d619 100644 --- a/i18n/hun/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json +++ b/i18n/hun/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json @@ -13,5 +13,7 @@ "vscode.extension.contributes.views": "Nézeteket szolgáltat a szerkesztőhöz", "views.explorer": "Fájlkezelő-nézet", "views.debug": "Hibakeresési nézet", - "locationId.invalid": "A(z) `{0}` nem érvényes nézethelyszín" + "locationId.invalid": "A(z) `{0}` nem érvényes nézethelyszín", + "duplicateView1": "Nem regisztrálható több nézet `{0}` azonosítóval a következő helyen: `{1}`", + "duplicateView2": "Már van `{0}` azonosítójú nézet regisztrálva a következő helyen: `{1}`" } \ No newline at end of file diff --git a/i18n/hun/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json b/i18n/hun/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json index b1e20b8dd6d..7f3902b99cf 100644 --- a/i18n/hun/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json +++ b/i18n/hun/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json @@ -11,6 +11,7 @@ "endOfLineLineFeed": "LF", "endOfLineCarriageReturnLineFeed": "CRLF", "tabFocusModeEnabled": "Tab fókuszt vált", + "screenReaderDetected": "Képernyőolvasóra optimalizálva", "screenReaderDetectedExtra": "Ha nem használ képernyőolvasót, állítsa az `editor.accessibilitySupport` értékét \"off\"-ra.", "disableTabMode": "Kisegítő mód letiltása", "gotoLine": "Sor megkeresése", @@ -47,8 +48,10 @@ "guessedEncoding": "Kitalálva a tartalomból", "pickEncodingForReopen": "Válassza ki a kódolást a fájl újranyitásához", "pickEncodingForSave": "Válassza ki a mentéshez használandó kódolást", + "screenReaderDetectedExplanation.title": "Képernyőolvasóra optimalizálva", "screenReaderDetectedExplanation.question": "Képernyőolvasót használ a VS Code vezérléséhez?", "screenReaderDetectedExplanation.answerYes": "Igen", "screenReaderDetectedExplanation.answerNo": "Nem", - "screenReaderDetectedExplanation.body1": "A VS Code most már optimalizálva van képernyőolvasóval való használathoz." + "screenReaderDetectedExplanation.body1": "A VS Code most már optimalizálva van képernyőolvasóval való használathoz.", + "screenReaderDetectedExplanation.body2": "Néhány funkció másképp működik. Például a sortörés, kódrészletek bezárása, automatikus záró zárójelek beszúrása stb." } \ No newline at end of file diff --git a/i18n/hun/src/vs/workbench/browser/parts/views/viewsRegistry.i18n.json b/i18n/hun/src/vs/workbench/browser/parts/views/viewsRegistry.i18n.json index 8b6ad71cd4e..52cc050953f 100644 --- a/i18n/hun/src/vs/workbench/browser/parts/views/viewsRegistry.i18n.json +++ b/i18n/hun/src/vs/workbench/browser/parts/views/viewsRegistry.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "duplicateId": "Már van `{0}` azonosítójú nézet regisztrálva a következő helyen: `{1}`" +} \ No newline at end of file diff --git a/i18n/hun/src/vs/workbench/electron-browser/main.contribution.i18n.json b/i18n/hun/src/vs/workbench/electron-browser/main.contribution.i18n.json index 05979d2697e..730c270e5d5 100644 --- a/i18n/hun/src/vs/workbench/electron-browser/main.contribution.i18n.json +++ b/i18n/hun/src/vs/workbench/electron-browser/main.contribution.i18n.json @@ -10,13 +10,14 @@ "workspaces": "Munkaterületek", "developer": "Fejlesztői", "showEditorTabs": "Meghatározza, hogy a megnyitott szerkesztőablakok telején megjelenjenek-e a fülek", - "workbench.editor.labelFormat.default": "Fájl nevének megjelenítése. Ha a fülek engedélyezve vannak, és két egyező nevű fájl van egy csoportban, az elérési útjuk eltérő része lesz hozzájuk fűzve. Ha a fülek le vannak tiltva, a fájl munkaterület gyökérkönyvtárához képest relatív elérési útja jelenik meg, ha a szerkesztőablak aktív.", + "workbench.editor.labelFormat.default": "Fájl nevének megjelenítése. Ha a fülek engedélyezve vannak, és két egyező nevű fájl van egy csoportban, az elérési útjuk eltérő része lesz hozzáfűzve a névhez. Ha a fülek le vannak tiltva, a fájl munkaterület gyökérkönyvtárához képest relatív elérési útja jelenik meg, ha a szerkesztőablak aktív.", "workbench.editor.labelFormat.short": "A fájl nevének megjelenítése a könyvtár nevével együtt.", "workbench.editor.labelFormat.medium": "Fájl nevének megjelenítése a fájl munkaterület gyökérkönyvtárához képest relatív elérési útjával együtt.", "workbench.editor.labelFormat.long": "Fájl nevének megjelenítése a fájl abszolút elérési útjával együtt.", "tabDescription": "Meghatározza a szerkesztőablakok címkéje formáját. A beállítás módosítása könnyebbé teheti a fájl helyének kiderítését:\n- short: 'parent'\n- medium: 'workspace/src/parent'\n- long: '/home/user/workspace/src/parent'\n- default: '.../parent', ha egy másik fülnek ugyanaz a címe, vagy a relatív elérési út, ha a fülek le vannak tiltva", "editorTabCloseButton": "Meghatározza a szerkesztőablakok fülein található bezárógomb pozícióját vagy eltávolítja őket, ha a beállítás értéke 'off'.", "showIcons": "Meghatározza, hogy a megnyitott szerkesztőablakok ikonnal együtt jelenjenek-e meg. A működéshez szükséges egy ikontéma engedélyezése is.", + "enablePreview": "Meghatározza, hogy a megnyitott szerkesztőablakok előnézetként jelenjenek-e meg. Az előnézetként használt szerkesztőablakok újra vannak hasznosítva, amíg meg nem tartja őket a felhasználó (pl. dupla kattintás vagy szerkesztés esetén), és dőlt betűvel jelenik meg a címsoruk.", "enablePreviewFromQuickOpen": "Meghatározza, hogy a gyors megnyitás során megnyitott szerkesztőablakok előnézetként jelenjenek-e meg. Az előnézetként használt szerkesztőablakok újra vannak hasznosítva, amíg meg nem tartja őket a felhasználó (pl. dupla kattintás vagy szerkesztés esetén).", "editorOpenPositioning": "Meghatározza, hogy hol nyíljanak meg a szerkesztőablakok. A 'left' vagy 'right' használata esetén az aktív szerkesztőablaktól jobbra vagy balra nyílnak meg az újak. A 'first' vagy 'last' esetén a szerkesztőablakok a jelenleg aktív ablaktól függetlenül nyílnak meg.", "revealIfOpen": "Meghatározza, hogy egy szerkesztőablak fel legyen-e fedve, ha már meg van nyitva a látható csoportok bármelyiképben. Ha le van tiltva, akkor egy új szerkesztőablak nyílik az aktív szerkesztőablak-csoportban. Ha engedélyezve van, akkor a már megnyitott szerkesztőablak lesz felfedve egy új megnyitása helyett. Megjegyzés: vannak esetek, amikor ez a beállítás figyelmen kívül van hagyva, pl. ha egy adott szerkesztőablak egy konkrét csoportban vagy a jelenleg aktív csoport mellett van menyitva.", diff --git a/i18n/hun/src/vs/workbench/parts/debug/electron-browser/debugService.i18n.json b/i18n/hun/src/vs/workbench/parts/debug/electron-browser/debugService.i18n.json index 30c54c1d5f0..3945df51449 100644 --- a/i18n/hun/src/vs/workbench/parts/debug/electron-browser/debugService.i18n.json +++ b/i18n/hun/src/vs/workbench/parts/debug/electron-browser/debugService.i18n.json @@ -12,8 +12,8 @@ "breakpointRemoved": "Töréspont eltávoíltva, {0}. sor, fájl: {1}", "compoundMustHaveConfigurations": "A kombinációk \"configurations\" tulajdonságát be kell állítani több konfiguráció elindításához.", "configMissing": "A(z) '{0}' konfiguráció hiányzik a 'launch.json'-ból.", - "debugRequestNotSupported": "A beállított hibakeresési kérés ('{0}') nem támogatott", - "debugRequesMissing": "A hibakeresési kéréshez hiányzik a kiválasztott indítási konfiguráció.", + "debugRequestNotSupported": "A kiválasztott hibakeresési konfigurációban a(z) `{0}` attribútum értéke nem támogatott: '{1}'.", + "debugRequesMissing": "A(z) '{0}' attribútum hiányzik a kiválasztott hibakeresési konfigurációból.", "debugTypeNotSupported": "A megadott hibakeresési típus ('{0}') nem támogatott.", "debugTypeMissing": "A kiválasztott indítási konfigurációnak hiányzik a 'type' tulajdonsága.", "preLaunchTaskErrors": "Buildelési hibák léptek fel a(z) '{0}' preLaunchTask futása közben.", diff --git a/i18n/hun/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json b/i18n/hun/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json index 88c6b00012c..712a56778ee 100644 --- a/i18n/hun/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json +++ b/i18n/hun/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json @@ -4,11 +4,13 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "reallyRecommended2": "Ehhez a fájltípushoz a(z) '{0}' kiegészítő ajánlott", + "reallyRecommended2": "Ehhez a fájltípushoz ajánlott a(z) '{0}' kiegészítő.", + "reallyRecommendedExtensionPack": "Ehhez a fájltípushoz ajánlott a(z) '{0}' kiegészítőcsomag.", "showRecommendations": "Ajánlatok megjelenítése", "neverShowAgain": "Ne jelenítse meg újra", "close": "Bezárás", "workspaceRecommended": "A munkaterülethez vannak javasolt kiegészítők", + "ignoreExtensionRecommendations": "Figyelmen kívül akarja hagyni az összes javasolt kiegészítőt?", "ignoreAll": "Igen, az összes figyelmen kívül hagyása", "no": "Nem", "cancel": "Mégse" diff --git a/i18n/hun/src/vs/workbench/parts/files/browser/files.contribution.i18n.json b/i18n/hun/src/vs/workbench/parts/files/browser/files.contribution.i18n.json index 11cd26076be..4cea0462d06 100644 --- a/i18n/hun/src/vs/workbench/parts/files/browser/files.contribution.i18n.json +++ b/i18n/hun/src/vs/workbench/parts/files/browser/files.contribution.i18n.json @@ -10,6 +10,7 @@ "textFileEditor": "Szövegfájlszerkesztő", "binaryFileEditor": "Bináris fájlszerkesztő", "filesConfigurationTitle": "Fájlok", + "exclude": "Globális minták konfigurálása fájlok és mappák kizárásához. A fájlkezelő például ezen beállítás alapján dönti el, hogy mely fájlokat és mappákat jelenítsen meg vagy rejtsen el.", "files.exclude.boolean": "A globális minta, amire illesztve lesznek a fájlok elérési útjai. A minta engedélyezéséhez vagy letiltásához állítsa igaz vagy hamis értékre.", "files.exclude.when": "További ellenőrzés elvégzése egy egyező fájl testvérein. Az egyező fájlnévhez használja a $(basename) változót.", "associations": "Rendeljen nyelveket a fájlokhoz (pl: \"*.kiterjesztés\": \"html\"). Ezek a hozzárendelések elsőbbséget élveznek a telepített nyelvek által definiált alapértelmezett beállításokkal szemben.", @@ -18,6 +19,7 @@ "eol": "Az alapértelmezett sorvégjel. LF-hez használjon \\n-t, CRLF-hez pedig \\r\\n-t.", "trimTrailingWhitespace": "Ha engedélyezve van, a fájl mentésekor levágja a sor végén található szóközöket.", "insertFinalNewline": "Ha engedélyezve van, mentéskor beszúr egy záró újsort a fájl végére.", + "trimFinalNewlines": "Ha engedélyezve van, mentéskor levágja a fájl végérő az összes újsort az utolsó újsor után.", "files.autoSave.off": "A módosított fájlok soha nincsenek automatikusan mentve.", "files.autoSave.afterDelay": "A módosított fájlok automatikusan mentésre kerülnek a 'files.autoSaveDelay' beállításban meghatározott időközönként.", "files.autoSave.onFocusChange": "A módosított fájlok automatikusan mentésre kerülnek, ha a szerkesztőablak elveszíti a fókuszt.", diff --git a/i18n/hun/src/vs/workbench/parts/scm/electron-browser/scmViewlet.i18n.json b/i18n/hun/src/vs/workbench/parts/scm/electron-browser/scmViewlet.i18n.json index ba0f414b2c2..023886324b7 100644 --- a/i18n/hun/src/vs/workbench/parts/scm/electron-browser/scmViewlet.i18n.json +++ b/i18n/hun/src/vs/workbench/parts/scm/electron-browser/scmViewlet.i18n.json @@ -5,6 +5,7 @@ // Do not edit this file. It is machine generated. { "scm providers": "Verziókezelő rendszerek", + "hideRepository": "Elrejtés", "commitMessage": "Üzenet (nyomja meg a következőt a commithoz: {0})", "installAdditionalSCMProviders": "További verziókezelő rendszerek telepítése...", "no open repo": "Nincs aktív verziókezelő rendszer.", diff --git a/i18n/hun/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json b/i18n/hun/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json index 435a5a7596e..26736788a2f 100644 --- a/i18n/hun/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json +++ b/i18n/hun/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json @@ -31,6 +31,7 @@ "TaskSystem.active": "Már fut egy feladat. Szakítsa meg, mielőtt egy másik feladatot futtatna.", "TaskSystem.restartFailed": "Nem sikerült a(z) {0} feladat befejezése és újraindítása.", "TaskSystem.configurationErrors": "Hiba: a megadott feladatkonfigurációban validációs hibák vannak, és nem használható. Először javítsa ezeket a hibákat!", + "taskService.ignoreingFolder": "Feladatkonfiguráció figyelmen kívül hagyva a munkaterület {0} nevű mappája esetében. Több mappás munkaterületen a feladatok támogatásához az összes mappának a 2.0-s verziójú feladatkonfigurációt kell használni.\n", "TaskSystem.invalidTaskJson": "Hiba. A tasks.json fájlban szintaktikai hibák találhatók. Javítsa ezeket a hibákat feladatvégrehajtás előtt.\n", "TaskSystem.runningTask": "Már fut egy feladat. Szeretné megszakítani?", "TaskSystem.terminateTask": "Felada&&t megszakítása", @@ -42,6 +43,7 @@ "recentlyUsed": "legutóbb futtatott feladatok", "configured": "konfigurált feladatok", "detected": "talált feladatok", + "TaskService.ignoredFolder": "A következő munkaterületi mappák figyelmen kívül vannak hagyva, mert 0.1.0-s verziójú feladatkonfigurációt használnak:", "TaskService.notAgain": "Ne jelenítse meg újra", "TaskService.ok": "OK", "TaskService.pickRunTask": "Válassza ki a futtatandó feladatot!", diff --git a/i18n/hun/src/vs/workbench/services/configuration/node/configuration.i18n.json b/i18n/hun/src/vs/workbench/services/configuration/node/configuration.i18n.json index d2fb97d94c4..209303272b7 100644 --- a/i18n/hun/src/vs/workbench/services/configuration/node/configuration.i18n.json +++ b/i18n/hun/src/vs/workbench/services/configuration/node/configuration.i18n.json @@ -19,5 +19,6 @@ "workspaceConfig.name.description": "A mappa neve. Nem kötelező megadni.", "workspaceConfig.uri.description": "A mappa URI-ja", "workspaceConfig.settings.description": "Munkaterület-beállítások", - "workspaceConfig.extensions.description": "Munkaterület-kiegészítők" + "workspaceConfig.extensions.description": "Munkaterület-kiegészítők", + "unknownWorkspaceProperty": "Ismeretlen munkaterület-konfigurációs tulajdonság" } \ No newline at end of file diff --git a/i18n/hun/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json b/i18n/hun/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json index 66f548427d8..950d9971c46 100644 --- a/i18n/hun/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json +++ b/i18n/hun/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json @@ -4,13 +4,26 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { + "openTasksConfiguration": "Feladatkonfiguráció megnyitása", + "openLaunchConfiguration": "Indítási konfiguráció megnyitása", "close": "Bezárás", "open": "Beállítások megnyitása", + "saveAndRetry": "Mentés és újrapróbálkozás", "errorUnknownKey": "Nem sikerült írni a következőbe: {0}. A(z) {1} nem regisztrált beállítás.", "errorInvalidFolderConfiguration": "Nem sikerült írni a mappa beállításaiba, mert a(z) {0} nem támogatott mappa típusú erőforrások hatókörében.", "errorInvalidUserTarget": "Nem sikerült írni a felhasználói beállításokba, mert a(z) {0} nem támogatott globális hatókörben.", "errorInvalidFolderTarget": "Nem sikerült írni a mappa beállításaiba, mert nincs erőforrás megadva.", "errorNoWorkspaceOpened": "Nem sikerült írni a következőbe: {0}. Nincs munkaterület megnyitva. Nyisson meg egy munkaterületet, majd próbálja újra!", + "errorInvalidTaskConfiguration": "Nem sikerült írni a feladatkonfigurációs fájlba. Nyissa meg az **Feladatkonfigurációs** fájlt, javítsa a hibákat és figyelmeztetéseket a fájlban, majd próbálja újra!", + "errorInvalidLaunchConfiguration": "Nem sikerült írni az indítási fájlba. Nyissa meg az **Indítási** fájlt, javítsa a hibákat és figyelmeztetéseket a fájlban, majd próbálja újra!", + "errorInvalidConfiguration": "Nem sikerült írni a felhasználói beállításokba. Nyissa meg a **Felhasználói beállításokat**, javítsa a hibákat és figyelmeztetéseket a fájlban, majd próbálja újra!", + "errorInvalidConfigurationWorkspace": "Nem sikerült írni a munkaterület beállításaiba. Nyissa meg a **Munkaterület beállításait**, javítsa a hibákat és figyelmeztetéseket a fájlban, majd próbálja újra!", + "errorInvalidConfigurationFolder": "Nem sikerült írni a mappa beállításaiba. Nyissa meg a **Mappa beállításait**, javítsa a hibákat és figyelmeztetéseket a fájlban, majd próbálja újra!", + "errorTasksConfigurationFileDirty": "Nem sikerült írni a feladatkonfigurációs fájlba, mert a fájl módosítva lett. Mentse a **Feladatkonfigurációs** fájlt, majd próbálja újra!", + "errorLaunchConfigurationFileDirty": "Nem sikerült írni az indítási fájlba, mert a fájl módosítva lett. Mentse az **Indítási konfiguráció** fájlt, majd próbálja újra!", + "errorConfigurationFileDirty": "Nem sikerült írni a felhasználói beállításokba, mert a fájl módosítva lett. Mentse a **Felhasználói beállítások** fájlt, majd próbálja újra!", + "errorConfigurationFileDirtyWorkspace": "Nem sikerült írni a munkaterületi beállításokba, mert a fájl módosítva lett. Mentse a **Munkaterület beállításai** fájlt, majd próbálja újra!", + "errorConfigurationFileDirtyFolder": "Nem sikerült írni a mappa beállításaiba, mert a fájl módosítva lett. Mentse a **Mappa beállításai** fájlt a(z) **{0}** mappában, majd próbálja újra!", "userTarget": "Felhasználói beállítások", "workspaceTarget": "Munkaterület-beállítások", "folderTarget": "Mappabeálíltások" diff --git a/i18n/ita/src/vs/code/electron-main/menus.i18n.json b/i18n/ita/src/vs/code/electron-main/menus.i18n.json index d950c064592..17fd875af6f 100644 --- a/i18n/ita/src/vs/code/electron-main/menus.i18n.json +++ b/i18n/ita/src/vs/code/electron-main/menus.i18n.json @@ -151,6 +151,10 @@ "mZoom": "Zoom", "mBringToFront": "Porta tutto in primo piano", "miSwitchWindow": "Cambia &&finestra...", + "mShowPreviousTab": "Visualizza scheda precedente", + "mShowNextTab": "Visualizza scheda successiva", + "mMoveTabToNewWindow": "Sposta scheda in una nuova finestra", + "mMergeAllWindows": "Unisci tutte le finestre", "miToggleDevTools": "&&Attiva/Disattiva strumenti di sviluppo", "miAccessibilityOptions": "&&Opzioni accessibilità", "miReportIssues": "&&Segnala problemi", @@ -171,6 +175,8 @@ "miRunningTask": "Mostra attività in esec&&uzione...", "miRestartTask": "Ria&&vvia attività in esecuzione...", "miTerminateTask": "&&Termina attività...", + "miConfigureTask": "&&Configura attività...", + "miConfigureBuildTask": "Configura atti&&vità di compilazione predefinita...", "accessibilityOptionsWindowTitle": "Opzioni accessibilità", "miRestartToUpdate": "Riavvia per aggiornare...", "miCheckingForUpdates": "Verifica della disponibilità di aggiornamenti...", diff --git a/i18n/ita/src/vs/code/electron-main/windows.i18n.json b/i18n/ita/src/vs/code/electron-main/windows.i18n.json index 0976da778ff..e284e7c2ab5 100644 --- a/i18n/ita/src/vs/code/electron-main/windows.i18n.json +++ b/i18n/ita/src/vs/code/electron-main/windows.i18n.json @@ -17,6 +17,8 @@ "open": "Apri", "openFolder": "Apri cartella", "openFile": "Apri file", + "workspaceOpenedMessage": "Non è possibile salvare l'area di lavoro '{0}'", + "workspaceOpenedDetail": "L'area di lavoro è già aperta in un'altra finestra. Chiudere tale finestra prima di riprovare.", "openWorkspace": "&&Apri", "openWorkspaceTitle": "Apri area di lavoro", "save": "&&Salva", diff --git a/i18n/ita/src/vs/platform/actions/electron-browser/menusExtensionPoint.i18n.json b/i18n/ita/src/vs/platform/actions/electron-browser/menusExtensionPoint.i18n.json index 98ae85b3833..32a58ae4a61 100644 --- a/i18n/ita/src/vs/platform/actions/electron-browser/menusExtensionPoint.i18n.json +++ b/i18n/ita/src/vs/platform/actions/electron-browser/menusExtensionPoint.i18n.json @@ -20,6 +20,7 @@ "menus.editorTabContext": "Menu di scelta rapida delle schede dell'editor", "menus.debugCallstackContext": "Menu di scelta rapida dello stack di chiamate di debug", "menus.scmTitle": "Menu del titolo del controllo del codice sorgente", + "menus.scmSourceControl": "Menu del controllo del codice sorgente", "menus.resourceGroupContext": "Menu di scelta rapida del gruppo di risorse del controllo del codice sorgente", "menus.resourceStateContext": "Menu di scelta rapida dello stato delle risorse del controllo del codice sorgente", "view.viewTitle": "Menu del titolo della visualizzazione contribuita", diff --git a/i18n/ita/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json b/i18n/ita/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json index 79ac78f96ad..ebd673947fb 100644 --- a/i18n/ita/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json +++ b/i18n/ita/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json @@ -13,5 +13,7 @@ "vscode.extension.contributes.views": "Contribuisce visualizzazioni all'editor", "views.explorer": "Visualizzazione di esplorazione", "views.debug": "Visualizzazione Debug", - "locationId.invalid": "'{0}' non è una posizione valida per la visualizzazione" + "locationId.invalid": "'{0}' non è una posizione valida per la visualizzazione", + "duplicateView1": "Non è possibile registrare più visualizzazioni con stesso ID `{0}` nel percorso `{1}`", + "duplicateView2": "Nel percorso `{1}` è già registrata una visualizzazione con ID `{0}` " } \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/browser/actions/workspaceActions.i18n.json b/i18n/ita/src/vs/workbench/browser/actions/workspaceActions.i18n.json index 0c7b03c458a..4d31bf1f0c4 100644 --- a/i18n/ita/src/vs/workbench/browser/actions/workspaceActions.i18n.json +++ b/i18n/ita/src/vs/workbench/browser/actions/workspaceActions.i18n.json @@ -17,5 +17,6 @@ "save": "&&Salva", "saveWorkspace": "Salva area di lavoro", "openWorkspaceAction": "Apri area di lavoro...", - "openWorkspaceConfigFile": "Apri file di configurazione dell'area di lavoro" + "openWorkspaceConfigFile": "Apri file di configurazione dell'area di lavoro", + "workspaceFolderPickerPlaceholder": "Selezionare la cartella dell'area di lavoro" } \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/browser/parts/activitybar/activitybarActions.i18n.json b/i18n/ita/src/vs/workbench/browser/parts/activitybar/activitybarActions.i18n.json index 1be4247d7af..492b8e03095 100644 --- a/i18n/ita/src/vs/workbench/browser/parts/activitybar/activitybarActions.i18n.json +++ b/i18n/ita/src/vs/workbench/browser/parts/activitybar/activitybarActions.i18n.json @@ -6,6 +6,7 @@ { "badgeTitle": "{0} - {1}", "titleKeybinding": "{0} ({1})", + "removeFromActivityBar": "Nascondi in barra attività", "keepInActivityBar": "Mantieni in barra attività", "additionalViews": "Visualizzazioni aggiuntive", "numberBadge": "{0} ({1})", diff --git a/i18n/ita/src/vs/workbench/browser/parts/editor/editorActions.i18n.json b/i18n/ita/src/vs/workbench/browser/parts/editor/editorActions.i18n.json index 34ec4817bae..089f3a4202c 100644 --- a/i18n/ita/src/vs/workbench/browser/parts/editor/editorActions.i18n.json +++ b/i18n/ita/src/vs/workbench/browser/parts/editor/editorActions.i18n.json @@ -35,6 +35,7 @@ "openPreviousEditorInGroup": "Apri editor precedente del gruppo", "navigateNext": "Avanti", "navigatePrevious": "Indietro", + "navigateLast": "Vai all'ultima", "reopenClosedEditor": "Riapri editor chiuso", "clearRecentFiles": "Cancella elementi aperti di recente", "showEditorsInFirstGroup": "Mostra editor nel primo gruppo", diff --git a/i18n/ita/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json b/i18n/ita/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json index 3c268f058c4..c8ef3502070 100644 --- a/i18n/ita/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json +++ b/i18n/ita/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json @@ -11,6 +11,7 @@ "endOfLineLineFeed": "LF", "endOfLineCarriageReturnLineFeed": "CRLF", "tabFocusModeEnabled": "TAB per spostare lo stato attivo", + "screenReaderDetected": "Ottimizzato per l'utilità per la lettura dello schermo", "screenReaderDetectedExtra": "Se non si utilizza un'utilità per la lettura dello schermo, si prega di impostare 'editor.accessibilitySupport' a \"off\".", "disableTabMode": "Disabilita modalità accessibilità", "gotoLine": "Vai alla riga", @@ -47,6 +48,10 @@ "guessedEncoding": "Ipotizzata dal contenuto", "pickEncodingForReopen": "Seleziona codifica per la riapertura del file", "pickEncodingForSave": "Seleziona codifica per il salvataggio del file", + "screenReaderDetectedExplanation.title": "Ottimizzato per l'utilità per la lettura dello schermo", + "screenReaderDetectedExplanation.question": "Si usa un'utilità per la lettura per lo schermo per VS Code?", "screenReaderDetectedExplanation.answerYes": "Sì", - "screenReaderDetectedExplanation.answerNo": "No" + "screenReaderDetectedExplanation.answerNo": "No", + "screenReaderDetectedExplanation.body1": "VS Code è ora ottimizzato per l'utilizzo con un'utilità per la lettura dello schermo.", + "screenReaderDetectedExplanation.body2": "Il comportamento di alcune funzionalità dell'editor sarà diverso, ad esempio a capo automatico, riduzione del codice, chiusura automatica delle parentesi e così via." } \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/browser/parts/views/viewsRegistry.i18n.json b/i18n/ita/src/vs/workbench/browser/parts/views/viewsRegistry.i18n.json index 8b6ad71cd4e..ed1c7bde950 100644 --- a/i18n/ita/src/vs/workbench/browser/parts/views/viewsRegistry.i18n.json +++ b/i18n/ita/src/vs/workbench/browser/parts/views/viewsRegistry.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "duplicateId": "Nel percorso `{1}` è già registrata una visualizzazione con ID `{0}` " +} \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/electron-browser/actions.i18n.json b/i18n/ita/src/vs/workbench/electron-browser/actions.i18n.json index a79d647bc84..4a97354ad49 100644 --- a/i18n/ita/src/vs/workbench/electron-browser/actions.i18n.json +++ b/i18n/ita/src/vs/workbench/electron-browser/actions.i18n.json @@ -42,5 +42,10 @@ "navigateUp": "Passa alla visualizzazione in alto", "navigateDown": "Passa alla visualizzazione in basso", "increaseViewSize": "Aumenta la dimensione della visualizzazione corrente", - "decreaseViewSize": "Diminuisce la dimensione della visualizzazione corrente" + "decreaseViewSize": "Diminuisce la dimensione della visualizzazione corrente", + "showPreviousTab": "Visualizza scheda della finestra precedente", + "showNextWindowTab": "Visualizza scheda della finestra successiva", + "moveWindowTabToNewWindow": "Sposta scheda della finestra in una nuova finestra", + "mergeAllWindowTabs": "Unisci tutte le finestre", + "toggleWindowTabsBar": "Attiva/Disattiva barra delle schede delle finestre" } \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/electron-browser/main.contribution.i18n.json b/i18n/ita/src/vs/workbench/electron-browser/main.contribution.i18n.json index 9398f9fc3dc..52b4f223124 100644 --- a/i18n/ita/src/vs/workbench/electron-browser/main.contribution.i18n.json +++ b/i18n/ita/src/vs/workbench/electron-browser/main.contribution.i18n.json @@ -10,8 +10,14 @@ "workspaces": "Aree di lavoro", "developer": "Sviluppatore", "showEditorTabs": "Controlla se visualizzare o meno gli editor aperti in schede.", + "workbench.editor.labelFormat.default": "Visualizza il nome del file. Quando le schede sono abilitate e due file presentano lo stesso nome in un unico gruppo, vengono aggiunte le sezioni distintive del percorso di ciascun file. Quando le schede sono disabilitate, viene visualizzato il percorso relativo alla radice dell'area di lavoro se l'editor è attivo.", + "workbench.editor.labelFormat.short": "Visualizza il nome del file seguito dal relativo nome di directory.", + "workbench.editor.labelFormat.medium": "Visualizza il nome del file seguito dal percorso corrispondente relativo alla radice dell'area di lavoro.", + "workbench.editor.labelFormat.long": "Visualizza il nome del file seguito dal relativo percorso assoluto.", + "tabDescription": "Controlla il formato dell'etichetta per un editor. Se si modifica questa impostazione, ad esempio, risulterà più agevole individuare il percorso di un file:\n- short: 'parent'\n- medium: 'workspace/src/parent'\n- long: '/home/user/workspace/src/parent'\n- default: '.../parent', quando un'altra scheda condivide lo stesso titolo, oppure il percorso relativo dell'area di lavoro se le schede sono disabilitate", "editorTabCloseButton": "Controlla la posizione dei pulsanti di chiusura delle schede dell'editor oppure li disabilita quando è impostata su 'off'.", "showIcons": "Controlla se visualizzare o meno un'icona per gli editor aperti. Richiede l'abilitazione anche di un tema dell'icona.", + "enablePreview": "Controlla se gli editor aperti vengono visualizzati come anteprima. Le anteprime editor vengono riutilizzate finché vengono mantenute (ad esempio tramite doppio clic o modifica) e vengono visualizzate in corsivo.", "enablePreviewFromQuickOpen": "Controlla se gli editor aperti da Quick Open vengono visualizzati come anteprima. Le anteprime editor vengono riutilizzate finché vengono mantenute, ad esempio tramite doppio clic o modifica.", "editorOpenPositioning": "Controlla la posizione in cui vengono aperti gli editor. Selezionare 'left' o 'right' per aprire gli editor a sinistra o a destra di quello attualmente attivo. Selezionare 'first' o 'last' per aprire gli editor indipendentemente da quello attualmente attivo.", "revealIfOpen": "Controlla se un editor viene visualizzato in uno qualsiasi dei gruppi visibili se viene aperto. Se l'opzione è disabilitata, un editor verrà aperto preferibilmente nel gruppo di editor attualmente attivo. Se è abilitata, un editor già aperto verrà visualizzato e non aperto di nuovo nel gruppo di editor attualmente attivo. Nota: in alcuni casi questa impostazione viene ignorata, ad esempio quando si forza l'apertura di un editor in un gruppo specifico oppure a lato del gruppo attualmente attivo.", diff --git a/i18n/ita/src/vs/workbench/parts/codeEditor/electron-browser/languageConfiguration/languageConfigurationExtensionPoint.i18n.json b/i18n/ita/src/vs/workbench/parts/codeEditor/electron-browser/languageConfiguration/languageConfigurationExtensionPoint.i18n.json index 20b6f54dcb3..baba081c726 100644 --- a/i18n/ita/src/vs/workbench/parts/codeEditor/electron-browser/languageConfiguration/languageConfigurationExtensionPoint.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/codeEditor/electron-browser/languageConfiguration/languageConfigurationExtensionPoint.i18n.json @@ -36,5 +36,10 @@ "schema.indentationRules.unIndentedLinePattern": "Se una riga corrisponde a questo criterio, il rientro non deve essere modificato e la riga non deve essere valutata rispetto alle altre regole.", "schema.indentationRules.unIndentedLinePattern.pattern": "Criterio di RegExp per unIndentedLinePattern.", "schema.indentationRules.unIndentedLinePattern.flags": "Flag di RegExp per unIndentedLinePattern.", - "schema.indentationRules.unIndentedLinePattern.errorMessage": "Deve corrispondere al modello `/^([gimuy]+)$/`." + "schema.indentationRules.unIndentedLinePattern.errorMessage": "Deve corrispondere al modello `/^([gimuy]+)$/`.", + "schema.folding": "Impostazioni di riduzione del codice del linguaggio.", + "schema.folding.offSide": "Un linguaggio è conforme alla regola di offside se i blocchi in tale linguaggio vengono espressi in base al relativo rientro. Se questa opzione è impostata, le righe vuote appartengono al blocco successivo.", + "schema.folding.markers": "Marcatori di riduzione del codice specifici del linguaggio, come '#region' e '#endregion'. Le espressioni regolari di inizio e fine verranno confrontate con il contenuto di tutte le righe e devono essere progettate in modo efficace", + "schema.folding.markers.start": "Criterio di espressione regolare per il marcatore di inizio. L'espressione regolare deve iniziare con '^'.", + "schema.folding.markers.end": "Criterio di espressione regolare per il marcatore di fine. L'espressione regolare deve iniziare con '^'." } \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/debug/electron-browser/debugService.i18n.json b/i18n/ita/src/vs/workbench/parts/debug/electron-browser/debugService.i18n.json index 9df96f524f9..70ec9c0d711 100644 --- a/i18n/ita/src/vs/workbench/parts/debug/electron-browser/debugService.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/debug/electron-browser/debugService.i18n.json @@ -12,6 +12,8 @@ "breakpointRemoved": "Rimosso un punto di interruzione a riga {0} del file {1}", "compoundMustHaveConfigurations": "Per avviare più configurazioni, deve essere impostato l'attributo \"configurations\" dell'elemento compounds.", "configMissing": "In 'launch.json' manca la configurazione '{0}'.", + "debugRequestNotSupported": "La configurazione di debug scelta contiene un valore di attributo `{0}` che non è supportato: '{1}'.", + "debugRequesMissing": "Nella configurazione di debug scelta manca l'attributo '{0}'.", "debugTypeNotSupported": "Il tipo di debug configurato '{0}' non è supportato.", "debugTypeMissing": "Manca la proprietà 'type' per la configurazione di avvio scelta.", "preLaunchTaskErrors": "Sono stati rilevati errori di compilazione durante preLaunchTask '{0}'.", diff --git a/i18n/ita/src/vs/workbench/parts/extensions/browser/extensionEditor.i18n.json b/i18n/ita/src/vs/workbench/parts/extensions/browser/extensionEditor.i18n.json index eef179b48d3..64cacf41da1 100644 --- a/i18n/ita/src/vs/workbench/parts/extensions/browser/extensionEditor.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/extensions/browser/extensionEditor.i18n.json @@ -29,6 +29,13 @@ "view id": "ID", "view name": "Nome", "view location": "Dove", + "colorThemes": "Temi colore ({0})", + "iconThemes": "Temi icona ({0})", + "colors": "Colori ({0})", + "colorId": "ID", + "defaultDark": "Predefinito scuro", + "defaultLight": "Predefinito chiaro", + "defaultHC": "Predefinito contrasto elevato", "JSON Validation": "Convalida JSON ({0})", "commands": "Comandi ({0})", "command name": "Nome", diff --git a/i18n/ita/src/vs/workbench/parts/extensions/browser/extensionsActions.i18n.json b/i18n/ita/src/vs/workbench/parts/extensions/browser/extensionsActions.i18n.json index fe25758722c..999aa22e8f3 100644 --- a/i18n/ita/src/vs/workbench/parts/extensions/browser/extensionsActions.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/extensions/browser/extensionsActions.i18n.json @@ -53,6 +53,7 @@ "showAzureExtensionsShort": "Estensioni di Azure", "OpenExtensionsFile.failed": "Non è possibile creare il file 'extensions.json' all'interno della cartella '.vscode' ({0}).", "configureWorkspaceRecommendedExtensions": "Configura estensioni consigliate (area di lavoro)", + "configureWorkspaceFolderRecommendedExtensions": "Configura estensioni consigliate (cartella dell'area di lavoro)", "builtin": "Predefinita", "disableAll": "Disabilita tutte le estensioni installate", "disableAllWorkspace": "Disabilita tutte le estensioni installate per questa area di lavoro", diff --git a/i18n/ita/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json b/i18n/ita/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json index 69964d4f622..c97e1b40ccb 100644 --- a/i18n/ita/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json @@ -5,10 +5,12 @@ // Do not edit this file. It is machine generated. { "reallyRecommended2": "Per questo tipo di file è consigliabile utilizzare l'estensione '{0}'.", + "reallyRecommendedExtensionPack": "Per questo tipo di file è consigliabile usare il pacchetto di estensione '{0}'.", "showRecommendations": "Mostra gli elementi consigliati", "neverShowAgain": "Non visualizzare più questo messaggio", "close": "Chiudi", "workspaceRecommended": "Per questa area di lavoro sono disponibili estensioni consigliate.", + "ignoreExtensionRecommendations": "Ignorare tutti i suggerimenti per le estensioni?", "ignoreAll": "Sì, ignora tutti", "no": "No", "cancel": "Annulla" diff --git a/i18n/ita/src/vs/workbench/parts/files/browser/files.contribution.i18n.json b/i18n/ita/src/vs/workbench/parts/files/browser/files.contribution.i18n.json index b79f520e3d6..34e5d5d0c26 100644 --- a/i18n/ita/src/vs/workbench/parts/files/browser/files.contribution.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/files/browser/files.contribution.i18n.json @@ -10,12 +10,16 @@ "textFileEditor": "Editor file di testo", "binaryFileEditor": "Editor file binari", "filesConfigurationTitle": "File", + "exclude": "Consente di configurare i criteri GLOB per escludere file e cartelle. Ad esempio, la funzionalità Esplora file stabilisce quali file e cartelle mostrare o nascondere in base a questa impostazione.", "files.exclude.boolean": "Criterio GLOB da usare per trovare percorsi file. Impostare su True o False per abilitare o disabilitare il criterio.", "files.exclude.when": "Controllo aggiuntivo sugli elementi di pari livello di un file corrispondente. Usare $(basename) come variabile del nome file corrispondente.", "associations": "Consente di configurare le associazioni tra file e linguaggi, ad esempio \"*.extension\": \"html\". Queste hanno la precedenza sulle associazioni predefinite dei linguaggi installate.", + "encoding": "Codifica del set di caratteri predefinita da usare durante la lettura e la scrittura di file. È possibile configurare questa impostazione anche in base alla lingua.", + "autoGuessEncoding": "Quando questa opzione è abilitata, la codifica del set di caratteri viene ipotizzata all'apertura dei file. È possibile configurare questa impostazione anche in base alla lingua.", "eol": "Il carattere di fine riga predefinito. Utilizzare \\n per LF e \\r\\n per CRLF.", "trimTrailingWhitespace": "Se è abilitato, taglierà lo spazio vuoto quando si salva un file.", "insertFinalNewline": "Se è abilitato, inserisce un carattere di nuova riga finale alla fine del file durante il salvataggio.", + "trimFinalNewlines": "Se è abilitato, taglia tutte le nuove righe dopo il carattere di nuova riga finale alla fine del file durante il salvataggio.", "files.autoSave.off": "Un file dirty non viene mai salvato automaticamente.", "files.autoSave.afterDelay": "Un file dirty viene salvato automaticamente in base al valore configurato di 'files.autoSaveDelay'.", "files.autoSave.onFocusChange": "Un file dirty viene salvato automaticamente quando l'editor perde lo stato attivo.", diff --git a/i18n/ita/src/vs/workbench/parts/files/common/dirtyFilesTracker.i18n.json b/i18n/ita/src/vs/workbench/parts/files/common/dirtyFilesTracker.i18n.json index 53e90cc6554..92d5051b4e0 100644 --- a/i18n/ita/src/vs/workbench/parts/files/common/dirtyFilesTracker.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/files/common/dirtyFilesTracker.i18n.json @@ -4,5 +4,6 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { + "dirtyFile": "1 file non salvato", "dirtyFiles": "{0} file non salvati" } \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/preferences/browser/preferencesEditor.i18n.json b/i18n/ita/src/vs/workbench/parts/preferences/browser/preferencesEditor.i18n.json index 411f31bd650..973412c0e73 100644 --- a/i18n/ita/src/vs/workbench/parts/preferences/browser/preferencesEditor.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/preferences/browser/preferencesEditor.i18n.json @@ -8,7 +8,7 @@ "SearchSettingsWidget.AriaLabel": "Cerca impostazioni", "SearchSettingsWidget.Placeholder": "Cerca impostazioni", "totalSettingsMessage": "{0} impostazioni in totale", - "noSettingsFound": "Nessuna impostazione corrispondente", + "noSettingsFound": "Nessun risultato", "oneSettingFound": "1 impostazione corrispondente", "settingsFound": "{0} impostazioni corrispondenti", "fileEditorWithInputAriaLabel": "{0}. Editor file di testo.", diff --git a/i18n/ita/src/vs/workbench/parts/scm/electron-browser/scmViewlet.i18n.json b/i18n/ita/src/vs/workbench/parts/scm/electron-browser/scmViewlet.i18n.json index 3b24c2e210b..8bc8834c5e7 100644 --- a/i18n/ita/src/vs/workbench/parts/scm/electron-browser/scmViewlet.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/scm/electron-browser/scmViewlet.i18n.json @@ -5,6 +5,7 @@ // Do not edit this file. It is machine generated. { "scm providers": "Provider di controllo del codice sorgente", + "hideRepository": "Nascondi", "commitMessage": "Message (press {0} to commit)", "installAdditionalSCMProviders": "Installa ulteriori provider SCM ...", "no open repo": "Non esistono provider di controllo codice sorgente attivi.", diff --git a/i18n/ita/src/vs/workbench/parts/snippets/electron-browser/insertSnippet.i18n.json b/i18n/ita/src/vs/workbench/parts/snippets/electron-browser/insertSnippet.i18n.json index f501a03d135..580b9d74850 100644 --- a/i18n/ita/src/vs/workbench/parts/snippets/electron-browser/insertSnippet.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/snippets/electron-browser/insertSnippet.i18n.json @@ -4,5 +4,7 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "snippet.suggestions.label": "Inserisci frammento" + "snippet.suggestions.label": "Inserisci frammento", + "sep.userSnippet": "Frammenti utente", + "sep.extSnippet": "Frammenti estensione" } \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/snippets/electron-browser/snippetsService.i18n.json b/i18n/ita/src/vs/workbench/parts/snippets/electron-browser/snippetsService.i18n.json index 4df49b140ce..09e4993b61b 100644 --- a/i18n/ita/src/vs/workbench/parts/snippets/electron-browser/snippetsService.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/snippets/electron-browser/snippetsService.i18n.json @@ -10,6 +10,7 @@ "vscode.extension.contributes.snippets": "Frammenti per contributes.", "vscode.extension.contributes.snippets-language": "Identificatore di linguaggio per cui si aggiunge come contributo questo frammento.", "vscode.extension.contributes.snippets-path": "Percorso del file snippets. È relativo alla cartella delle estensioni e in genere inizia con './snippets/'.", + "badFile": "Non è stato possibile leggere il file di frammento \"{0}\".", "badVariableUse": "Il frammento \"{0}\" molto probabilmente confonde variabili-frammento con segnaposti-frammento. Vedere https://code.visualstudio.com/docs/editor/userdefinedsnippets#_snippet-syntax per ulteriori dettagli.", "source.snippet": "Frammento utente", "detail.snippet": "{0} ({1})", diff --git a/i18n/ita/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json b/i18n/ita/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json index 94dc081c02c..17b0680c534 100644 --- a/i18n/ita/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json @@ -13,11 +13,13 @@ "manyMarkers": "Più di 99", "runningTasks": "Visualizza attività in esecuzione", "tasks": "Attività", + "TaskSystem.noHotSwap": "Se si cambia il motore di esecuzione delle attività con un'attività attiva in esecuzione, è necessario ricaricare la finestra", "TaskService.noBuildTask1": "Non è stata definita alcuna attività di compilazione. Contrassegnare un'attività con 'isBuildCommand' nel file tasks.json.", "TaskService.noBuildTask2": "Non è stata definita alcuna attività di compilazione. Contrassegnare un'attività come gruppo 'build' nel file tasks.json.", "TaskService.noTestTask1": "Non è stata definita alcuna attività di test. Contrassegnare un'attività con 'isTestCommand' nel file tasks.json.", "TaskService.noTestTask2": "Non è stata definita alcuna attività di test. Contrassegnare un'attività come gruppo 'test' nel file tasks.json.", "TaskServer.noTask": "Attività {0} richiesta per l'esecuzione non trovata", + "TaskService.associate": "associare", "TaskService.attachProblemMatcher.continueWithout": "Continua senza analizzare l'output dell'attività", "TaskService.attachProblemMatcher.never": "Mai analizzare l'output dell'attività", "TaskService.attachProblemMatcher.learnMoreAbout": "Ulteriori informazioni sull'analisi dell'output della attività", @@ -29,6 +31,7 @@ "TaskSystem.active": "Al momento c'è già un'attività in esecuzione. Terminarla prima di eseguirne un'altra.", "TaskSystem.restartFailed": "Non è stato possibile terminare e riavviare l'attività {0}", "TaskSystem.configurationErrors": "Errore: la configurazione delle attività specificata contiene errori di convalida e non è utilizzabile. Correggere prima gli errori.", + "taskService.ignoreingFolder": "Le configurazioni delle attività per la cartella dell'area di lavoro {0} verranno ignorate. Per il supporto delle attività delle aree di lavoro in più cartelle è necessario che tutte le cartelle usino la versione 2.0.0 delle attività\n", "TaskSystem.invalidTaskJson": "Errore: nel contenuto del file tasks.json sono presenti errori di sintassi. Correggerli prima di eseguire un'attività.\n", "TaskSystem.runningTask": "È presente un'attività in esecuzione. Terminarla?", "TaskSystem.terminateTask": "&&Termina attività", @@ -40,20 +43,33 @@ "recentlyUsed": "attività usate di recente", "configured": "attività configurate", "detected": "attività rilevate", + "TaskService.ignoredFolder": "Le cartelle dell'area di lavoro seguenti verranno ignorate perché usano la versione 0.1.0 delle attività: ", "TaskService.notAgain": "Non visualizzare più questo messaggio", "TaskService.ok": "OK", + "TaskService.pickRunTask": "Selezionare l'attività da eseguire", + "TaslService.noEntryToRun": "Non è stata trovata alcuna attività da eseguire. Configurare le attività...", "TaskService.fetchingBuildTasks": "Recupero delle attività di compilazione...", "TaskService.pickBuildTask": "Selezionare l'attività di compilazione da eseguire", + "TaskService.noBuildTask": "Non è stata trovata alcuna attività di compilazione da eseguire. Configurare le attività...", "TaskService.fetchingTestTasks": "Recupero delle attività di test...", "TaskService.pickTestTask": "Selezionare l'attività di test da eseguire", + "TaskService.noTestTaskTerminal": "Non è stata trovata alcuna attività di test da eseguire. Configurare le attività...", "TaskService.tastToTerminate": "Selezionare l'attività da terminare", + "TaskService.noTaskRunning": "Non ci sono attività attualmente in esecuzione", "TerminateAction.noProcess": "Il processo avviato non esiste più. Se l'attività implica la generazione di attività in background, uscendo da Visual Studio Code potrebbero essere presenti processi orfani.", "TerminateAction.failed": "Non è stato possibile terminare l'attività in esecuzione", "TaskService.tastToRestart": "Selezionare l'attività da riavviare", + "TaskService.noTaskToRestart": "Non ci sono attività da riavviare", + "TaskService.template": "Selezionare un modello di attività", + "TaskService.createJsonFile": "Crea il file tasks.json dal modello", + "TaskService.openJsonFile": "Apri il file tasks.json", + "TaskService.pickTask": "Selezionare un'attività da configurare", + "TaskService.defaultBuildTaskExists": "{0} è già contrassegnato come attività di compilazione predefinita", "TaskService.pickDefaultBuildTask": "Selezionare l'attività da usare come attività di compilazione predefinita", "TaskService.defaultTestTaskExists": "{0} è già contrassegnato come attività di test predefinita.", "TaskService.pickDefaultTestTask": "Selezionare l'attività da usare come attività di test predefinita", "TaskService.pickShowTask": "Selezionare l'attività di cui mostrare l'output", + "TaskService.noTaskIsRunning": "Non ci sono attività in esecuzione", "ShowLogAction.label": "Mostra log attività", "RunTaskAction.label": "Esegui attività", "RestartTaskAction.label": "Riavvia attività in esecuzione", diff --git a/i18n/ita/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.i18n.json b/i18n/ita/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.i18n.json index 3d9e3d5f42b..acc06bc45a5 100644 --- a/i18n/ita/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.i18n.json @@ -5,6 +5,7 @@ // Do not edit this file. It is machine generated. { "TerminalTaskSystem.unknownError": "Si è verificato un errore sconosciuto durante l'esecuzione di un'attività. Per dettagli, vedere il log di output dell'attività.", + "dependencyFailed": "Non è stato possibile risolvere l'attività dipendente '{0}' nella cartella dell'area di lavoro '{1}'", "TerminalTaskSystem.terminalName": "Attività - {0}", "reuseTerminal": "Terminale verrà riutilizzato dalle attività, premere un tasto qualsiasi per chiuderlo.", "TerminalTaskSystem": "Non è possibile eseguire un comando della shell su un'unità UNC.", diff --git a/i18n/ita/src/vs/workbench/parts/tasks/node/taskConfiguration.i18n.json b/i18n/ita/src/vs/workbench/parts/tasks/node/taskConfiguration.i18n.json index 10234317e8f..5adc56a7ea0 100644 --- a/i18n/ita/src/vs/workbench/parts/tasks/node/taskConfiguration.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/tasks/node/taskConfiguration.i18n.json @@ -12,6 +12,7 @@ "ConfigurationParser.invalidVaraibleReference": "Errore: il riferimento a problemMatcher non è valido: {0}\n", "ConfigurationParser.noTaskType": "Errore: la configurazione di tasks deve contenere una proprietà di tipo. La configurazione verrà ignorata.\n{0}\n", "ConfigurationParser.noTypeDefinition": "Errore: non ci sono attività registrate di tipo '{0}'. Non è stata installata un'estensione che fornisce un provider di task corrispondente?", + "ConfigurationParser.missingRequiredProperty": "Errore: nella configurazione di attività '{0}' manca la proprietà obbligatoria '{1}'. La configurazione dell'attività verrà ignorata.", "ConfigurationParser.notCustom": "Errore: tasks non è dichiarato come un'attività personalizzata. La configurazione verrà ignorata.\n{0}\n", "ConfigurationParser.noTaskName": "Errore: le attività devono specificare una proprietà taskName. L'attività verrà ignorata.\n{0}\n", "taskConfiguration.shellArgs": "Avviso: l'attività '{0}' è un comando della shell e il nome del comando o uno dei relativi argomenti contiene spazi senza codice di escape. Per garantire la corretta indicazione della riga di comando, unire gli argomenti nel comando.", diff --git a/i18n/ita/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json b/i18n/ita/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json index f11b3608f65..ad495da28bf 100644 --- a/i18n/ita/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json @@ -38,5 +38,6 @@ "workbench.action.terminal.focusFindWidget": "Stato attivo su widget Trova", "workbench.action.terminal.hideFindWidget": "Nascondi widget Trova", "nextTerminalFindTerm": "Mostra il termine di ricerca successivo", - "previousTerminalFindTerm": "Mostra il termine di ricerca precedente" + "previousTerminalFindTerm": "Mostra il termine di ricerca precedente", + "quickOpenTerm": "Cambia terminale attivo" } \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/terminal/electron-browser/terminalColorRegistry.i18n.json b/i18n/ita/src/vs/workbench/parts/terminal/electron-browser/terminalColorRegistry.i18n.json index d707ad877b4..6d85a595027 100644 --- a/i18n/ita/src/vs/workbench/parts/terminal/electron-browser/terminalColorRegistry.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/terminal/electron-browser/terminalColorRegistry.i18n.json @@ -8,5 +8,6 @@ "terminal.foreground": "Il colore di primo piano del terminale.", "terminalCursor.foreground": "Colore di primo piano del cursore del terminale.", "terminalCursor.background": "Colore di sfondo del cursore del terminale. Permette di personalizzare il colore di un carattere quando sovrapposto da un blocco cursore.", + "terminal.selectionBackground": "Colore di sfondo di selezione del terminale.", "terminal.ansiColor": "Colore ANSI '{0}' nel terminale." } \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json b/i18n/ita/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json index 4d0a4f3dde5..be81923149c 100644 --- a/i18n/ita/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json @@ -10,6 +10,7 @@ "welcomePage.newFile": "Nuovo file", "welcomePage.openFolder": "Apri cartella...", "welcomePage.cloneGitRepository": "Clona repository GIT...", + "welcomePage.addWorkspaceFolder": "Aggiungi cartella dell'area di lavoro...", "welcomePage.recent": "Recenti", "welcomePage.moreRecent": "Altro...", "welcomePage.noRecentFolders": "Non ci sono cartelle recenti", diff --git a/i18n/ita/src/vs/workbench/services/configuration/node/configuration.i18n.json b/i18n/ita/src/vs/workbench/services/configuration/node/configuration.i18n.json index 2a16527c203..b5a489af390 100644 --- a/i18n/ita/src/vs/workbench/services/configuration/node/configuration.i18n.json +++ b/i18n/ita/src/vs/workbench/services/configuration/node/configuration.i18n.json @@ -13,6 +13,12 @@ "invalid.title": "'configuration.title' deve essere una stringa", "vscode.extension.contributes.defaultConfiguration": "Aggiunge come contributo le impostazioni di configurazione predefinite dell'editor in base al linguaggio.", "invalid.properties": "'configuration.properties' deve essere un oggetto", + "invalid.allOf": "'configuration.allOf' è deprecato e non deve più essere usato. Passare invece una matrice di sezioni di configurazione al punto di aggiunta contributo 'configuration'.", + "workspaceConfig.folders.description": "Elenco di cartelle da caricare nell'area di lavoro.", "workspaceConfig.path.description": "Percorso di file, ad esempio `/root/folderA` o `./folderA` per un percorso relativo che verrà risolto in base alla posizione del file dell'area di lavoro.", - "workspaceConfig.settings.description": "Impostazioni di area di lavoro" + "workspaceConfig.name.description": "Nome facoltativo per la cartella. ", + "workspaceConfig.uri.description": "URI della cartella", + "workspaceConfig.settings.description": "Impostazioni di area di lavoro", + "workspaceConfig.extensions.description": "Estensioni dell'area di lavoro", + "unknownWorkspaceProperty": "La proprietà di configurazione dell'area di lavoro è sconosciuta" } \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json b/i18n/ita/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json index eb34a440eda..965f92ae5a1 100644 --- a/i18n/ita/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json +++ b/i18n/ita/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json @@ -4,13 +4,26 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { + "openTasksConfiguration": "Apri configurazione attività", + "openLaunchConfiguration": "Apri configurazione di avvio", "close": "Chiudi", "open": "Apri impostazioni", + "saveAndRetry": "Salva e riprova", "errorUnknownKey": "Impossibile scrivere {0} perché {1} non è una configurazione registrata.", "errorInvalidFolderConfiguration": "Impossibile scrivere nella cartella impostazioni perché {0} non supporta l'ambito di risorsa della cartella.", "errorInvalidUserTarget": "Impossibile scrivere le impostazioni utente perché {0} non supporta l'ambito globale.", "errorInvalidFolderTarget": "Impossibile scrivere nella cartella impostazioni perché non viene fornita alcuna risorsa.", "errorNoWorkspaceOpened": "Impossibile scrivere su {0} poiché nessuna area di lavoro è aperta. Si prega di aprire un'area di lavoro e riprovare.", + "errorInvalidTaskConfiguration": "Non è possibile scrivere nel file delle attività. Aprire il file **Attività** per correggere eventuali errori/avvisi, quindi riprovare.", + "errorInvalidLaunchConfiguration": "Non è possibile scrivere nel file di avvio. Aprire il file **Avvio** per correggere eventuali errori/avvisi, quindi riprovare.", + "errorInvalidConfiguration": "Non è possibile scrivere nelle impostazioni utente. Aprire il file **Impostazioni utente** per correggere eventuali errori/avvisi presenti, quindi riprovare.", + "errorInvalidConfigurationWorkspace": "Non è possibile scrivere nelle impostazioni dell'area di lavoro. Aprire il file **Impostazioni area di lavoro** per correggere eventuali errori/avvisi presenti, quindi riprovare.", + "errorInvalidConfigurationFolder": "Non è possibile scrivere nelle impostazioni della cartella. Aprire il file **Impostazioni cartella** nella cartella **{0}** per correggere eventuali errori/avvisi presenti, quindi riprovare.", + "errorTasksConfigurationFileDirty": "Non è possibile scrivere nel file delle attività perché è stato modificato. Salvare il file **Configurazione attività** , quindi riprovare.", + "errorLaunchConfigurationFileDirty": "Non è possibile scrivere nel file di avvio perché è stato modificato. Salvare il file **Configurazione di avvio** , quindi riprovare.", + "errorConfigurationFileDirty": "Non è possibile scrivere nelle impostazioni utente perché il file è stato modificato. Salvare il file **Impostazioni utente** , quindi riprovare.", + "errorConfigurationFileDirtyWorkspace": "Non è possibile scrivere nelle impostazioni dell'area di lavoro perché il file è stato modificato. Salvare il file **Impostazioni area di lavoro** , quindi riprovare.", + "errorConfigurationFileDirtyFolder": "Non è possibile scrivere nelle impostazioni della cartella perché il file è stato modificato. Salvare il file **Impostazioni cartella** nella cartella **{0}**, quindi riprovare.", "userTarget": "Impostazioni utente", "workspaceTarget": "Impostazioni area di lavoro", "folderTarget": "Impostazioni della cartella" diff --git a/i18n/ita/src/vs/workbench/services/files/node/fileService.i18n.json b/i18n/ita/src/vs/workbench/services/files/node/fileService.i18n.json index ba9fba1b186..158f28c3a3e 100644 --- a/i18n/ita/src/vs/workbench/services/files/node/fileService.i18n.json +++ b/i18n/ita/src/vs/workbench/services/files/node/fileService.i18n.json @@ -10,6 +10,7 @@ "fileTooLargeError": "File troppo grande per essere aperto", "fileBinaryError": "Il file sembra essere binario e non può essere aperto come file di testo", "fileNotFoundError": "Il file non è stato trovato ({0})", + "fileExists": "Il file da creare esiste già ({0})", "fileMoveConflict": "Non è possibile eseguire operazioni di spostamento/copia. Il file esiste già nella destinazione.", "unableToMoveCopyError": "Non è possibile eseguire operazioni di spostamento/copia. Il file sostituirebbe la cartella in cui è contenuto.", "foldersCopyError": "Non è possibile copiare le cartelle nell'area di lavoro. Selezionare i singoli file per copiarli.", diff --git a/i18n/jpn/src/vs/platform/actions/electron-browser/menusExtensionPoint.i18n.json b/i18n/jpn/src/vs/platform/actions/electron-browser/menusExtensionPoint.i18n.json index 32f21281c12..981e3bb87da 100644 --- a/i18n/jpn/src/vs/platform/actions/electron-browser/menusExtensionPoint.i18n.json +++ b/i18n/jpn/src/vs/platform/actions/electron-browser/menusExtensionPoint.i18n.json @@ -20,6 +20,7 @@ "menus.editorTabContext": "エディターのタブのコンテキスト メニュー", "menus.debugCallstackContext": "デバッグの呼び出し履歴のコンテキスト メニュー", "menus.scmTitle": "ソース管理のタイトル メニュー", + "menus.scmSourceControl": "ソース管理メニュー", "menus.resourceGroupContext": "ソース管理リソース グループのコンテキスト メニュー", "menus.resourceStateContext": "ソース管理リソース状態のコンテキスト メニュー", "view.viewTitle": "提供されたビューのタイトル メニュー", diff --git a/i18n/jpn/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json b/i18n/jpn/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json index 7b7a2d57fdc..c17b073b1d3 100644 --- a/i18n/jpn/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json +++ b/i18n/jpn/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json @@ -13,5 +13,7 @@ "vscode.extension.contributes.views": "ビューをエディターに提供します", "views.explorer": "エクスプローラー ビュー", "views.debug": "デバッグ ビュー", - "locationId.invalid": "`{0}` は有効なビューの場所ではありません" + "locationId.invalid": "`{0}` は有効なビューの場所ではありません", + "duplicateView1": "location `{1}` で同じ id `{0}` を使用する複数のビューを登録できません", + "duplicateView2": "location `{1}` で id `{0}` のビューが既に登録されています" } \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json b/i18n/jpn/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json index 00621c8e3a0..9a2136e7640 100644 --- a/i18n/jpn/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json +++ b/i18n/jpn/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json @@ -11,6 +11,7 @@ "endOfLineLineFeed": "LF", "endOfLineCarriageReturnLineFeed": "CRLF", "tabFocusModeEnabled": "タブによるフォーカスの移動", + "screenReaderDetected": "スクリーン リーダーに最適化", "screenReaderDetectedExtra": "スクリーン リーダーを使用しない場合、`editor.accessibilitySupport` を \"off\" にしてください。", "disableTabMode": "アクセシビリティ モードを無効にする", "gotoLine": "行へ移動", @@ -47,8 +48,10 @@ "guessedEncoding": "コンテンツから推測", "pickEncodingForReopen": "ファイルを再度開くときのファイルのエンコードの選択", "pickEncodingForSave": "保存時のファイルのエンコードの選択", + "screenReaderDetectedExplanation.title": "スクリーン リーダーに最適化", "screenReaderDetectedExplanation.question": "VS Codeの操作にスクリーンリーダーを使用していますか?", "screenReaderDetectedExplanation.answerYes": "はい", "screenReaderDetectedExplanation.answerNo": "いいえ", - "screenReaderDetectedExplanation.body1": "VS Codeは現在スクリーンリーダーの使用状況に最適化されています。" + "screenReaderDetectedExplanation.body1": "VS Codeは現在スクリーンリーダーの使用状況に最適化されています。", + "screenReaderDetectedExplanation.body2": "いくつかのエディター機能が通常と異なる動作をします。例: 折り返し、折りたたみ、かっこの自動閉じなど" } \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/browser/parts/views/viewsRegistry.i18n.json b/i18n/jpn/src/vs/workbench/browser/parts/views/viewsRegistry.i18n.json index 8b6ad71cd4e..3607a9f498a 100644 --- a/i18n/jpn/src/vs/workbench/browser/parts/views/viewsRegistry.i18n.json +++ b/i18n/jpn/src/vs/workbench/browser/parts/views/viewsRegistry.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "duplicateId": "location `{1}` で id `{0}` のビューが既に登録されています" +} \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/electron-browser/main.contribution.i18n.json b/i18n/jpn/src/vs/workbench/electron-browser/main.contribution.i18n.json index 910483b7333..880049ace58 100644 --- a/i18n/jpn/src/vs/workbench/electron-browser/main.contribution.i18n.json +++ b/i18n/jpn/src/vs/workbench/electron-browser/main.contribution.i18n.json @@ -17,6 +17,7 @@ "tabDescription": "エディターのラベルの書式を制御します。例としてこの設定を変更することでファイルの場所を理解しやすくなります:\n- short: 'parent'\n- medium: 'workspace/src/parent'\n- long: '/home/user/workspace/src/parent'\n- default: '.../parent',  別タブで、同じタイトルを共有する場合や、相対的なワークスペース パス タブが無効になっている場合", "editorTabCloseButton": "エディター タブの閉じるボタンの位置を制御するか、[off] に設定した場合に無効にします。", "showIcons": "開いているエディターをアイコンで表示するかどうかを制御します。これには、アイコンのテーマを有効にする必要もあります。", + "enablePreview": "開かれるエディターをプレビューとして表示するかどうかを制御します。プレビュー エディターは (例: ダブル クリックまたは編集などによって) 変更される時まで再利用し、斜体で表示します。", "enablePreviewFromQuickOpen": "Quick Open で開いたエディターをプレビューとして表示するかどうかを制御します。プレビュー エディターは、保持されている間、再利用されます (ダブルクリックまたは編集などによって)。", "editorOpenPositioning": "エディターを開く場所を制御します。[左] または [右] を選択して、現在アクティブになっているエディターの左または右にエディターを開きます。[最初] または [最後] を選択して、現在アクティブになっているエディターとは別個にエディターを開きます。", "revealIfOpen": "任意の表示グループが開かれた場合に、そこにエディターを表示するかどうかを制御します。無効にした場合、エディターは現在のアクティブなエディター グループに優先して開かれます。有効にした場合は、現在のアクティブなエディター グループにもう一度開くのではなく、既に開いているエディターが表示されます。特定のグループ内や現在アクティブなグループの横に強制的にエディターを開いた場合などに、この設定が無視される場合もあることにご注意ください。", diff --git a/i18n/jpn/src/vs/workbench/parts/debug/electron-browser/debugService.i18n.json b/i18n/jpn/src/vs/workbench/parts/debug/electron-browser/debugService.i18n.json index e47e23b4326..86136d977a5 100644 --- a/i18n/jpn/src/vs/workbench/parts/debug/electron-browser/debugService.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/debug/electron-browser/debugService.i18n.json @@ -12,8 +12,8 @@ "breakpointRemoved": "ブレークポイントを削除しました。行 {0}、ファイル {1}", "compoundMustHaveConfigurations": "複合構成を開始するには、複合に \"configurations\" 属性が設定されている必要があります。", "configMissing": "構成 '{0}' が 'launch.json' 内にありません。", - "debugRequestNotSupported": "構成されているデバッグ要求の '{0}' はサポートされていません", - "debugRequesMissing": "選択している起動構成にデバッグ要求が含まれていません", + "debugRequestNotSupported": "選択したデバッグ構成ではサポートされていない属性値 `{0}` : '{1}'。", + "debugRequesMissing": "選択しているデバッグ構成に '{0}' 属性が含まれていません ", "debugTypeNotSupported": "構成されているデバッグの種類 '{0}' はサポートされていません。", "debugTypeMissing": "選択された起動構成のプロパティ 'type' がありません。", "preLaunchTaskErrors": "preLaunchTask '{0}' の実行中にビルド エラーが検出されました。", diff --git a/i18n/jpn/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json b/i18n/jpn/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json index f8722645f50..2bb3a05f0d6 100644 --- a/i18n/jpn/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json @@ -5,10 +5,12 @@ // Do not edit this file. It is machine generated. { "reallyRecommended2": "このファイルの種類には拡張機能 '{0}' が推奨されます。", + "reallyRecommendedExtensionPack": "このファイルの種類には拡張機能パック '{0}' が推奨されます。", "showRecommendations": "推奨事項を表示", "neverShowAgain": "今後は表示しない", "close": "閉じる", "workspaceRecommended": "このワークスペースには拡張機能の推奨事項があります。", + "ignoreExtensionRecommendations": "すべての拡張機能の推奨事項を無視しますか?", "ignoreAll": "はい、すべて無視します", "no": "いいえ", "cancel": "キャンセル" diff --git a/i18n/jpn/src/vs/workbench/parts/files/browser/files.contribution.i18n.json b/i18n/jpn/src/vs/workbench/parts/files/browser/files.contribution.i18n.json index bb3a98960cc..c1dd7969f73 100644 --- a/i18n/jpn/src/vs/workbench/parts/files/browser/files.contribution.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/files/browser/files.contribution.i18n.json @@ -10,6 +10,7 @@ "textFileEditor": "テキスト ファイル エディター", "binaryFileEditor": "バイナリ ファイル エディター", "filesConfigurationTitle": "ファイル", + "exclude": "ファイルとフォルダーを除外するための glob パターンを構成します。たとえば、ファイル エクスプローラーではこの設定に基づいてファイルとフォルダーの表示や非表示を決定します。", "files.exclude.boolean": "ファイル パスの照合基準となる glob パターン。これを true または false に設定すると、パターンがそれぞれ有効/無効になります。", "files.exclude.when": "一致するファイルの兄弟をさらにチェックします。一致するファイル名の変数として $(basename) を使用します。", "associations": "言語に対するファイルの関連付け (例 \"*.extension\": \"html\") を構成します。これらの関連付けは、インストールされている言語の既定の関連付けより優先されます。", @@ -18,6 +19,7 @@ "eol": "既定の改行文字。LF の場合には \\n を CRLF の場合には \\r\\n を使用してください。", "trimTrailingWhitespace": "有効にすると、ファイルの保存時に末尾の空白をトリミングします。", "insertFinalNewline": "有効にすると、ファイルの保存時に最新の行を末尾に挿入します。", + "trimFinalNewlines": "有効にすると、ファイルの保存時に最終行以降の新しい行をトリミングします。", "files.autoSave.off": "ダーティ ファイルを自動的に保存することはしません。", "files.autoSave.afterDelay": "'files.autoSaveDelay' で構成された時間の経過後に、ダーティ ファイルを自動的に保存します。", "files.autoSave.onFocusChange": "エディターがフォーカスを失った時点で、ダーティ ファイルを自動的に保存します。", diff --git a/i18n/jpn/src/vs/workbench/parts/scm/electron-browser/scmViewlet.i18n.json b/i18n/jpn/src/vs/workbench/parts/scm/electron-browser/scmViewlet.i18n.json index 7b71fd83e57..8f9dfe27002 100644 --- a/i18n/jpn/src/vs/workbench/parts/scm/electron-browser/scmViewlet.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/scm/electron-browser/scmViewlet.i18n.json @@ -5,6 +5,7 @@ // Do not edit this file. It is machine generated. { "scm providers": "ソース管理プロバイダー", + "hideRepository": "非表示", "commitMessage": "Message (press {0} to commit)", "installAdditionalSCMProviders": "その他の SCM プロバイダーをインストール...", "no open repo": "有効なソース管理プロバイダーがありません。", diff --git a/i18n/jpn/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json b/i18n/jpn/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json index d372cb182d4..b93c884904a 100644 --- a/i18n/jpn/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json @@ -31,6 +31,7 @@ "TaskSystem.active": "既に実行中のタスクがあります。まずこのタスクを終了してから、別のタスクを実行してください。", "TaskSystem.restartFailed": "タスク {0} を終了して再開できませんでした", "TaskSystem.configurationErrors": "エラー: 指定したタスク構成に検証エラーがあり、使用できません。最初にエラーを修正してください。", + "taskService.ignoreingFolder": "ワークスペース フォルダー {0} のタスク構成を無視します。マルチ フォルダー ワークスペース タスクのサポートには、すべてのフォルダーがタスク バージョン 2.0.0 を使用する必要があります。\n", "TaskSystem.invalidTaskJson": "エラー: tasks.json ファイルの内容に構文エラーがあります。訂正してからタスクを実行してください。\n", "TaskSystem.runningTask": "実行中のタスクがあります。終了しますか?", "TaskSystem.terminateTask": "タスクの終了(&&T)", @@ -42,6 +43,7 @@ "recentlyUsed": "最近使用したタスク", "configured": "構成済みのタスク", "detected": "検出されたタスク", + "TaskService.ignoredFolder": "次のワークスペース フォルダーはタスク バージョン 0.1.0 を使用しているために無視されます:", "TaskService.notAgain": "今後は表示しない", "TaskService.ok": "OK", "TaskService.pickRunTask": "実行するタスクを選択してください", diff --git a/i18n/jpn/src/vs/workbench/services/configuration/node/configuration.i18n.json b/i18n/jpn/src/vs/workbench/services/configuration/node/configuration.i18n.json index a6698361083..60bf4e08cf5 100644 --- a/i18n/jpn/src/vs/workbench/services/configuration/node/configuration.i18n.json +++ b/i18n/jpn/src/vs/workbench/services/configuration/node/configuration.i18n.json @@ -19,5 +19,6 @@ "workspaceConfig.name.description": "フォルダーにつけるオプションの名前。", "workspaceConfig.uri.description": "フォルダーの URI", "workspaceConfig.settings.description": "ワークスペースの設定", - "workspaceConfig.extensions.description": "ワークスペースの拡張機能" + "workspaceConfig.extensions.description": "ワークスペースの拡張機能", + "unknownWorkspaceProperty": "不明なワークスペース構成プロパティ" } \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json b/i18n/jpn/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json index 1729047052e..c898ae7bee3 100644 --- a/i18n/jpn/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json +++ b/i18n/jpn/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json @@ -4,13 +4,26 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { + "openTasksConfiguration": "タスク構成を開く", + "openLaunchConfiguration": "起動構成を開く", "close": "閉じる", "open": "設定を開く", + "saveAndRetry": "保存して再試行", "errorUnknownKey": "{1} は登録済みの構成ではないため、{0} に書き込むことができません。", "errorInvalidFolderConfiguration": "{0} はフォルダーのリソース スコープをサポートしていないため、フォルダー設定に書き込むことができません。", "errorInvalidUserTarget": "{0} はグローバル スコープをサポートしていないため、ユーザー設定に書き込むことができません。", "errorInvalidFolderTarget": "リソースが指定されていないため、フォルダー設定に書き込むことができません。", "errorNoWorkspaceOpened": "開いているワークスペースがないため、{0} に書き込むことができません。最初にワークスペースを開いてから、もう一度お試しください。", + "errorInvalidTaskConfiguration": "タスク ファイルに書き込めません。**Tasks** ファイルを開いて、ファイル内のエラー/警告を修正してからもう一度お試しください。", + "errorInvalidLaunchConfiguration": "起動ファイルに書き込めません。**Launch** ファイルを開いて、ファイル内のエラー/警告を修正してからもう一度お試しください。", + "errorInvalidConfiguration": "ユーザー設定に書き込めません。**User Settings** ファイルを開いて、ファイル内のエラー/警告を修正してからもう一度お試しください。", + "errorInvalidConfigurationWorkspace": "ワークスペース設定に書き込めません。**Workspace Settings** ファイルを開いて、ファイル内のエラー/警告を修正してからもう一度お試しください。", + "errorInvalidConfigurationFolder": "フォルダー設定に書き込めません。**{0}** フォルダー配下の **Folder Settings** ファイルを開いて、ファイル内のエラー/警告を修正してからもう一度お試しください。", + "errorTasksConfigurationFileDirty": "ファイルが変更されているため、タスク ファイルを書き込めません。**Tasks Configuration**ファイルを保存してから、もう一度お試しください。 ", + "errorLaunchConfigurationFileDirty": "ファイルが変更されているため、起動設定を書き込めません。**Launch Configuration**ファイルを保存してから、もう一度お試しください。 ", + "errorConfigurationFileDirty": "ファイルが変更されているため、ユーザー設定を書き込めません。**User Settings** ファイルを保存してから、もう一度お試しください。", + "errorConfigurationFileDirtyWorkspace": "ファイルが変更されているため、ワークスペース設定を書き込めません。**Workspace Settings** ファイルを保存してから、もう一度お試しください。", + "errorConfigurationFileDirtyFolder": "ファイルが変更されているため、フォルダー設定を書き込めません。**{0}** 配下の **Folder Settings** ファイルを保存してから、もう一度お試しください。", "userTarget": "ユーザー設定", "workspaceTarget": "ワークスペースの設定", "folderTarget": "フォルダーの設定" diff --git a/i18n/kor/extensions/css/package.i18n.json b/i18n/kor/extensions/css/package.i18n.json index 35ae2cde936..307e44f0902 100644 --- a/i18n/kor/extensions/css/package.i18n.json +++ b/i18n/kor/extensions/css/package.i18n.json @@ -4,6 +4,7 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { + "css.title": "CSS", "css.lint.argumentsInColorFunction.desc": "잘못된 매개 변수 수", "css.lint.boxModel.desc": "패딩 또는 테두리를 사용하는 경우 너비 또는 높이를 사용하지 마세요.", "css.lint.compatibleVendorPrefixes.desc": "공급업체 관련 접두사를 사용할 경우 다른 모든 공급업체 관련 속성도 포함합니다.", @@ -25,6 +26,7 @@ "css.trace.server.desc": "VS Code와 CSS 언어 서버 간 통신을 추적합니다.", "css.validate.title": "CSS 유효성 검사 및 문제 심각도를 제어합니다.", "css.validate.desc": "모든 유효성 검사 사용 또는 사용 안 함", + "less.title": "LESS", "less.lint.argumentsInColorFunction.desc": "잘못된 매개 변수 수", "less.lint.boxModel.desc": "패딩 또는 테두리를 사용하는 경우 너비 또는 높이를 사용하지 마세요.", "less.lint.compatibleVendorPrefixes.desc": "공급업체 관련 접두사를 사용할 경우 다른 모든 공급업체 관련 속성도 포함합니다.", @@ -45,6 +47,7 @@ "less.lint.zeroUnits.desc": "0에는 단위가 필요하지 않습니다.", "less.validate.title": "LESS 유효성 검사 및 문제 심각도를 제어합니다.", "less.validate.desc": "모든 유효성 검사 사용 또는 사용 안 함", + "scss.title": "SCSS(Sass)", "scss.lint.argumentsInColorFunction.desc": "잘못된 매개 변수 수", "scss.lint.boxModel.desc": "패딩 또는 테두리를 사용하는 경우 너비 또는 높이를 사용하지 마세요.", "scss.lint.compatibleVendorPrefixes.desc": "공급업체 관련 접두사를 사용할 경우 다른 모든 공급업체 관련 속성도 포함합니다.", diff --git a/i18n/kor/extensions/grunt/out/main.i18n.json b/i18n/kor/extensions/grunt/out/main.i18n.json index 8b6ad71cd4e..e7957d307fc 100644 --- a/i18n/kor/extensions/grunt/out/main.i18n.json +++ b/i18n/kor/extensions/grunt/out/main.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "execFailed": "폴더 {0}에 대해 Grunt 자동 검색에 실패하고 {1} 오류가 발생했습니다." +} \ No newline at end of file diff --git a/i18n/kor/extensions/gulp/out/main.i18n.json b/i18n/kor/extensions/gulp/out/main.i18n.json index 8b6ad71cd4e..87895182ec6 100644 --- a/i18n/kor/extensions/gulp/out/main.i18n.json +++ b/i18n/kor/extensions/gulp/out/main.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "execFailed": "폴더 {0}에 대해 Gulp 자동 검색에 실패하고 {1} 오류가 발생했습니다." +} \ No newline at end of file diff --git a/i18n/kor/extensions/jake/out/main.i18n.json b/i18n/kor/extensions/jake/out/main.i18n.json index 8b6ad71cd4e..508a5285839 100644 --- a/i18n/kor/extensions/jake/out/main.i18n.json +++ b/i18n/kor/extensions/jake/out/main.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "execFailed": "폴더 {0}에 대해 Jake 자동 검색에 실패하고 {1} 오류가 발생했습니다." +} \ No newline at end of file diff --git a/i18n/kor/extensions/markdown/out/extension.i18n.json b/i18n/kor/extensions/markdown/out/extension.i18n.json index f38833da5da..81729088db3 100644 --- a/i18n/kor/extensions/markdown/out/extension.i18n.json +++ b/i18n/kor/extensions/markdown/out/extension.i18n.json @@ -4,5 +4,6 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "onPreviewStyleLoadError": "'markdown.styles': {0}을 불러올 수 없음" + "onPreviewStyleLoadError": "'markdown.styles': {0}을 불러올 수 없음", + "previewTitle": "{0} 미리 보기" } \ No newline at end of file diff --git a/i18n/kor/src/vs/code/electron-main/menus.i18n.json b/i18n/kor/src/vs/code/electron-main/menus.i18n.json index 1e29745ea9b..2e942d1252d 100644 --- a/i18n/kor/src/vs/code/electron-main/menus.i18n.json +++ b/i18n/kor/src/vs/code/electron-main/menus.i18n.json @@ -151,6 +151,10 @@ "mZoom": "확대/축소", "mBringToFront": "모두 맨 앞으로 가져오기", "miSwitchWindow": "창 전환(&&W)", + "mShowPreviousTab": "이전 탭 표시", + "mShowNextTab": "다음 탭 표시", + "mMoveTabToNewWindow": "새 창으로 탭 이동", + "mMergeAllWindows": "모든 창 병합", "miToggleDevTools": "개발자 도구 설정/해제(&&T)", "miAccessibilityOptions": "접근성 옵션(&&O)", "miReportIssues": "문제 보고(&&I)", @@ -171,6 +175,8 @@ "miRunningTask": "실행 중인 작업 표시(&&G)...", "miRestartTask": "실행 중인 작업 다시 시작(&&E)...", "miTerminateTask": "작업 종료(&&T)...", + "miConfigureTask": "작업 구성(&&C)...", + "miConfigureBuildTask": "기본 빌드 작업 구성(&&F)...", "accessibilityOptionsWindowTitle": "접근성 옵션", "miRestartToUpdate": "다시 시작하여 업데이트...", "miCheckingForUpdates": "업데이트를 확인하는 중...", diff --git a/i18n/kor/src/vs/code/electron-main/windows.i18n.json b/i18n/kor/src/vs/code/electron-main/windows.i18n.json index a4902f09f10..16bd7728dcc 100644 --- a/i18n/kor/src/vs/code/electron-main/windows.i18n.json +++ b/i18n/kor/src/vs/code/electron-main/windows.i18n.json @@ -17,6 +17,8 @@ "open": "열기", "openFolder": "폴더 열기", "openFile": "파일 열기", + "workspaceOpenedMessage": "'{0}' 작업 영역을 저장할 수 없음", + "workspaceOpenedDetail": "작업 영역이 이미 다른 창에 열렸습니다. 먼저 해당 창을 닫은 후 다시 시도하세요.", "openWorkspace": "열기(&&O)", "openWorkspaceTitle": "작업 영역 열기", "save": "저장(&&S)", diff --git a/i18n/kor/src/vs/editor/common/config/commonEditorConfig.i18n.json b/i18n/kor/src/vs/editor/common/config/commonEditorConfig.i18n.json index 7790e22f8fc..dc1d0da437c 100644 --- a/i18n/kor/src/vs/editor/common/config/commonEditorConfig.i18n.json +++ b/i18n/kor/src/vs/editor/common/config/commonEditorConfig.i18n.json @@ -11,6 +11,7 @@ "lineHeight": "줄 높이를 제어합니다. fontSize의 lineHeight를 계산하려면 0을 사용합니다.", "letterSpacing": "글자 간격을 픽셀 단위로 조정합니다.", "lineNumbers": "줄 번호의 표시 여부를 제어합니다. 가능한 값은 'on', 'off', 'relative'입니다. 'relative'는 현재 커서 위치에서 줄 수를 표시합니다.", + "rulers": "특정 수의 고정 폭 문자 뒤에 세로 눈금자를 렌더링합니다. 여러 눈금자의 경우 여러 값을 사용합니다. 배열이 비어 있는 경우 눈금자가 그려져 있지 않습니다.", "wordSeparators": "단어 관련 탐색 또는 작업을 수행할 때 단어 구분 기호로 사용되는 문자입니다.", "tabSize": "탭 한 개에 해당하는 공백 수입니다. `editor.detectIndentation`이 켜져 있는 경우 이 설정은 파일 콘텐츠에 따라 재정의됩니다.", "tabSize.errorMessage": "'number'가 필요합니다. 값 \"auto\"는 `editor.detectIndentation` 설정에 의해 바뀌었습니다.", @@ -87,6 +88,7 @@ "accessibilitySupport": "편집기를 스크린 리더를 위해 최적화된 모드로 실행할지 결정합니다.", "links": "편집기에서 링크를 감지하고 클릭할 수 있게 만들지 결정합니다.", "colorDecorators": "편집기에서 인라인 색 데코레이터 및 색 선택을 렌더링할지를 제어합니다.", + "codeActions": "코드 동작 전구를 사용합니다.", "sideBySide": "diff 편집기에서 diff를 나란히 표시할지 인라인으로 표시할지 여부를 제어합니다.", "ignoreTrimWhitespace": "diff 편집기에서 선행 공백 또는 후행 공백 변경을 diffs로 표시할지 여부를 제어합니다.", "renderIndicators": "diff 편집기에서 추가/제거된 변경 내용에 대해 +/- 표시기를 표시하는지 여부를 제어합니다.", diff --git a/i18n/kor/src/vs/editor/common/view/editorColorRegistry.i18n.json b/i18n/kor/src/vs/editor/common/view/editorColorRegistry.i18n.json index b7f686e2628..a8423dd155b 100644 --- a/i18n/kor/src/vs/editor/common/view/editorColorRegistry.i18n.json +++ b/i18n/kor/src/vs/editor/common/view/editorColorRegistry.i18n.json @@ -22,6 +22,8 @@ "errorBorder": "편집기 내 오류 표시선의 테두리 색입니다.", "warningForeground": "편집기 내 경고 표시선의 전경색입니다.", "warningBorder": "편집기 내 경고 표시선의 테두리 색입니다.", + "infoForeground": "편집기 내 정보 표시선의 전경색입니다.", + "infoBorder": "편집기 내 정보 표시선의 테두리 색입니다.", "overviewRulerRangeHighlight": "범위 강조 표시의 개요 눈금자 마커 색입니다.", "overviewRuleError": "오류의 개요 눈금자 마커 색입니다.", "overviewRuleWarning": "경고의 개요 눈금자 마커 색입니다.", diff --git a/i18n/kor/src/vs/editor/contrib/gotoError/browser/gotoError.i18n.json b/i18n/kor/src/vs/editor/contrib/gotoError/browser/gotoError.i18n.json index 9d89202d022..58029e4cfcd 100644 --- a/i18n/kor/src/vs/editor/contrib/gotoError/browser/gotoError.i18n.json +++ b/i18n/kor/src/vs/editor/contrib/gotoError/browser/gotoError.i18n.json @@ -9,5 +9,6 @@ "markerAction.previous.label": "이전 오류 또는 경고로 이동", "editorMarkerNavigationError": "편집기 표식 탐색 위젯 오류 색입니다.", "editorMarkerNavigationWarning": "편집기 표식 탐색 위젯 경고 색입니다.", + "editorMarkerNavigationInfo": "편집기 표식 탐색 위젯 정보 색입니다.", "editorMarkerNavigationBackground": "편집기 표식 탐색 위젯 배경입니다." } \ No newline at end of file diff --git a/i18n/kor/src/vs/platform/actions/electron-browser/menusExtensionPoint.i18n.json b/i18n/kor/src/vs/platform/actions/electron-browser/menusExtensionPoint.i18n.json index 1c5f62b7b23..ee9870e16a1 100644 --- a/i18n/kor/src/vs/platform/actions/electron-browser/menusExtensionPoint.i18n.json +++ b/i18n/kor/src/vs/platform/actions/electron-browser/menusExtensionPoint.i18n.json @@ -13,12 +13,14 @@ "vscode.extension.contributes.menuItem.group": "이 명령이 속하는 그룹입니다.", "vscode.extension.contributes.menus": "편집기에 메뉴 항목을 적용합니다.", "menus.commandPalette": "명령 팔레트", + "menus.touchBar": "터치 바(macOS 전용)", "menus.editorTitle": "편집기 제목 메뉴", "menus.editorContext": "편집기 상황에 맞는 메뉴", "menus.explorerContext": "파일 탐색기 상황에 맞는 메뉴", "menus.editorTabContext": "편집기 탭 상황에 맞는 메뉴", "menus.debugCallstackContext": "디버그 호출 스택 상황에 맞는 메뉴", "menus.scmTitle": "소스 제어 제목 메뉴", + "menus.scmSourceControl": "소스 제어 메뉴", "menus.resourceGroupContext": "소스 제어 리소스 그룹 상황에 맞는 메뉴", "menus.resourceStateContext": "소스 제어 리소스 상태 상황에 맞는 메뉴", "view.viewTitle": "기여 조회 제목 메뉴", diff --git a/i18n/kor/src/vs/platform/environment/node/argv.i18n.json b/i18n/kor/src/vs/platform/environment/node/argv.i18n.json index 614e1274b87..b8dae1071a7 100644 --- a/i18n/kor/src/vs/platform/environment/node/argv.i18n.json +++ b/i18n/kor/src/vs/platform/environment/node/argv.i18n.json @@ -15,6 +15,7 @@ "reuseWindow": "마지막 활성 창에서 파일 또는 폴더를 강제로 엽니다.", "userDataDir": "사용자 데이터가 저장되는 디렉터리를 지정합니다(루트로 실행할 경우 유용함).", "verbose": "자세한 정보 표시를 출력합니다(--wait를 의미).", + "wait": "파일이 닫힐 때 까지 기다린 후 돌아갑니다.", "extensionHomePath": "확장의 루트 경로를 설정합니다.", "listExtensions": "설치된 확장을 나열합니다.", "showVersions": "#NAME?", diff --git a/i18n/kor/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json b/i18n/kor/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json index d726014f30a..a346e007e1c 100644 --- a/i18n/kor/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json +++ b/i18n/kor/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json @@ -6,6 +6,7 @@ { "invalidManifest": "잘못된 확장: package.json이 JSON 파일이 아닙니다.", "restartCodeLocal": "{0}을(를) 다시 설치하기 전에 Code를 다시 시작하세요.", + "restartCodeGallery": "다시 설치하기 전에 Code를 다시 시작하세요.", "uninstallDependeciesConfirmation": "'{0}'만 제거할까요, 아니면 종속성도 제거할까요?", "uninstallOnly": "만", "uninstallAll": "모두", diff --git a/i18n/kor/src/vs/platform/extensions/common/extensionsRegistry.i18n.json b/i18n/kor/src/vs/platform/extensions/common/extensionsRegistry.i18n.json index 005dd7fd2b3..cb72ee5dd24 100644 --- a/i18n/kor/src/vs/platform/extensions/common/extensionsRegistry.i18n.json +++ b/i18n/kor/src/vs/platform/extensions/common/extensionsRegistry.i18n.json @@ -16,6 +16,7 @@ "vscode.extension.activationEvents": "VS Code 확장에 대한 활성화 이벤트입니다.", "vscode.extension.activationEvents.onLanguage": "지정된 언어로 확인되는 파일을 열 때마다 활성화 이벤트가 발송됩니다.", "vscode.extension.activationEvents.onCommand": "지정된 명령을 호출할 때마다 활성화 이벤트가 발송됩니다.", + "vscode.extension.activationEvents.onDebug": "사용자가 디버깅을 시작하거나 디버그 구성을 설정하려고 할 때마다 활성화 이벤트를 내보냅니다.", "vscode.extension.activationEvents.workspaceContains": "지정된 glob 패턴과 일치하는 파일이 하나 이상 있는 폴더를 열 때마다 활성화 알림이 발송됩니다.", "vscode.extension.activationEvents.onView": "지정된 뷰가 확장될 때마다 활성화 이벤트가 내보내 집니다.", "vscode.extension.activationEvents.star": "VS Code 시작 시 활성화 이벤트가 발송됩니다. 훌륭한 최종 사용자 경험을 보장하려면 사용 케이스에서 다른 활성화 이벤트 조합이 작동하지 않을 때에만 확장에서 이 활성화 이벤트를 사용하세요.", diff --git a/i18n/kor/src/vs/platform/theme/common/colorExtensionPoint.i18n.json b/i18n/kor/src/vs/platform/theme/common/colorExtensionPoint.i18n.json index 3f1ee411c6a..9553ac369b7 100644 --- a/i18n/kor/src/vs/platform/theme/common/colorExtensionPoint.i18n.json +++ b/i18n/kor/src/vs/platform/theme/common/colorExtensionPoint.i18n.json @@ -13,6 +13,8 @@ "contributes.defaults.highContrast": "고대비 테마의 기본 색상입니다. 기본값을 제공하는 16진수(#RRGGBB[AA])의 색상 값 또는 테마 지정 가능 색의 식별자입니다.", "invalid.colorConfiguration": "'configuration.colors'는 배열이어야 합니다.", "invalid.default.colorType": "{0}은(는) 16진수의 색 값(#RRGGBB[AA] 또는 #RGB[A]) 또는 기본값을 제공하는 테마 지정 가능 색의 식별자입니다.", + "invalid.id": "'configuration.colors.id'를 정의해야 하며 비워둘 수 없습니다.", "invalid.id.format": "'configuration.colors.id'는 단어[.word]* 다음에 와야 합니다.", + "invalid.description": "'configuration.colors.description'을 정의해야 하며 비워둘 수 없습니다.", "invalid.defaults": "'configuration.colors.defaults'를 정의해야 하며 'light', 'dark' 및 'highContrast'를 포함해야 합니다." } \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json b/i18n/kor/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json index 25892e50a69..22493f55ddf 100644 --- a/i18n/kor/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json +++ b/i18n/kor/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json @@ -13,5 +13,7 @@ "vscode.extension.contributes.views": "뷰를 에디터에 적용합니다.", "views.explorer": "탐색기 뷰", "views.debug": "디버그 보기", - "locationId.invalid": "`{0}`은(는) 유효한 뷰 위치가 아닙니다." + "locationId.invalid": "`{0}`은(는) 유효한 뷰 위치가 아닙니다.", + "duplicateView1": "위치 '{1}'에서 동일한 ID '{0}'(으)로된 여러 개의 보기를 등록할 수 없습니다.", + "duplicateView2": "ID `{0}`이(가) 포함된 뷰가 위치 `{1}`에 이미 등록되어 있습니다." } \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/browser/actions/workspaceActions.i18n.json b/i18n/kor/src/vs/workbench/browser/actions/workspaceActions.i18n.json index ae23e97e23b..b414854fcac 100644 --- a/i18n/kor/src/vs/workbench/browser/actions/workspaceActions.i18n.json +++ b/i18n/kor/src/vs/workbench/browser/actions/workspaceActions.i18n.json @@ -17,5 +17,6 @@ "save": "저장(&&S)", "saveWorkspace": "작업 영역 저장", "openWorkspaceAction": "작업 영역 열기...", - "openWorkspaceConfigFile": "작업 영역 구성 파일 열기" + "openWorkspaceConfigFile": "작업 영역 구성 파일 열기", + "workspaceFolderPickerPlaceholder": "작업 영역 폴더 선택" } \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/browser/parts/activitybar/activitybarActions.i18n.json b/i18n/kor/src/vs/workbench/browser/parts/activitybar/activitybarActions.i18n.json index 06b58ca3a23..2c8a795fe67 100644 --- a/i18n/kor/src/vs/workbench/browser/parts/activitybar/activitybarActions.i18n.json +++ b/i18n/kor/src/vs/workbench/browser/parts/activitybar/activitybarActions.i18n.json @@ -6,6 +6,7 @@ { "badgeTitle": "{0} - {1}", "titleKeybinding": "{0}({1})", + "removeFromActivityBar": "작업 막대에서 숨기기", "keepInActivityBar": "작업 막대에 유지", "additionalViews": "추가 뷰", "numberBadge": "{0}({1})", diff --git a/i18n/kor/src/vs/workbench/browser/parts/editor/editorActions.i18n.json b/i18n/kor/src/vs/workbench/browser/parts/editor/editorActions.i18n.json index 241bb67c5ee..d5bda0aa791 100644 --- a/i18n/kor/src/vs/workbench/browser/parts/editor/editorActions.i18n.json +++ b/i18n/kor/src/vs/workbench/browser/parts/editor/editorActions.i18n.json @@ -35,6 +35,7 @@ "openPreviousEditorInGroup": "그룹에서 이전 편집기 열기", "navigateNext": "앞으로 이동", "navigatePrevious": "뒤로 이동", + "navigateLast": "마지막으로 이동", "reopenClosedEditor": "닫힌 편집기 다시 열기", "clearRecentFiles": "최근 사용 항목 지우기", "showEditorsInFirstGroup": "첫 번째 그룹에 편집기 표시", diff --git a/i18n/kor/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json b/i18n/kor/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json index 75c077118a6..3c0b9b984d4 100644 --- a/i18n/kor/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json +++ b/i18n/kor/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json @@ -11,6 +11,7 @@ "endOfLineLineFeed": "LF", "endOfLineCarriageReturnLineFeed": "CRLF", "tabFocusModeEnabled": "Tab으로 포커스 이동", + "screenReaderDetected": "화면 읽기 프로그램이 최적화됨", "screenReaderDetectedExtra": "화면 읽기 프로그램을 사용하지 않는 경우 `editor.accessibilitySupport` 설정을 \"off\"로 변경하세요.", "disableTabMode": "접근성 모드 사용 안 함", "gotoLine": "줄 이동", @@ -47,6 +48,10 @@ "guessedEncoding": "콘텐츠에서 추측함", "pickEncodingForReopen": "파일을 다시 열 파일 인코딩 선택", "pickEncodingForSave": "파일을 저장할 파일 인코딩 선택", + "screenReaderDetectedExplanation.title": "화면 읽기 프로그램이 최적화됨", + "screenReaderDetectedExplanation.question": "VS Code를 작동하기 위해 화면 읽기 프로그램을 사용하십니까?", "screenReaderDetectedExplanation.answerYes": "예", - "screenReaderDetectedExplanation.answerNo": "아니요" + "screenReaderDetectedExplanation.answerNo": "아니요", + "screenReaderDetectedExplanation.body1": "VS Code가 이제 화면 읽기 프로그램과 사용하는 데 최적화되었습니다.", + "screenReaderDetectedExplanation.body2": "일부 편집기 기능에는 자동 줄바꿈, 접기, 자동 닫는 대괄호 등 여러 가지 동작이 있습니다. " } \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/browser/parts/views/viewsRegistry.i18n.json b/i18n/kor/src/vs/workbench/browser/parts/views/viewsRegistry.i18n.json index 8b6ad71cd4e..6a3532ad44d 100644 --- a/i18n/kor/src/vs/workbench/browser/parts/views/viewsRegistry.i18n.json +++ b/i18n/kor/src/vs/workbench/browser/parts/views/viewsRegistry.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "duplicateId": "ID `{0}`이(가) 포함된 뷰가 위치 `{1}`에 이미 등록되어 있습니다." +} \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/electron-browser/actions.i18n.json b/i18n/kor/src/vs/workbench/electron-browser/actions.i18n.json index e9b90f8dbe3..f652392a397 100644 --- a/i18n/kor/src/vs/workbench/electron-browser/actions.i18n.json +++ b/i18n/kor/src/vs/workbench/electron-browser/actions.i18n.json @@ -42,5 +42,10 @@ "navigateUp": "뷰 위로 이동", "navigateDown": "뷰 아래로 이동", "increaseViewSize": "현재 뷰 크기 늘리기", - "decreaseViewSize": "현재 뷰 크기 줄이기" + "decreaseViewSize": "현재 뷰 크기 줄이기", + "showPreviousTab": "이전 창 탭 표시", + "showNextWindowTab": "다음 창 탭 표시", + "moveWindowTabToNewWindow": "창 탭을 새 창으로 이동", + "mergeAllWindowTabs": "모든 창 병합", + "toggleWindowTabsBar": "창 탭 모음 설정/해제" } \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/electron-browser/main.contribution.i18n.json b/i18n/kor/src/vs/workbench/electron-browser/main.contribution.i18n.json index cf4fcf372d6..7c9f66647d9 100644 --- a/i18n/kor/src/vs/workbench/electron-browser/main.contribution.i18n.json +++ b/i18n/kor/src/vs/workbench/electron-browser/main.contribution.i18n.json @@ -10,8 +10,14 @@ "workspaces": "작업 영역", "developer": "개발자", "showEditorTabs": "열려 있는 편집기를 탭에서 표시할지 여부를 제어합니다.", + "workbench.editor.labelFormat.default": "파일 이름을 표시합니다. 탭이 사용하도록 설정되어 있고 하나의 그룹에서 파일 2개의 이름이 동일하면, 각 파일 경로의 특정 섹션이 추가됩니다. 탭이 사용하도록 설정되어 있지 않으면, 작업 영역 루트에 대한 경로는 편집기가 활성 상태일 때 표시됩니다.", + "workbench.editor.labelFormat.short": "디렉터리 이름 앞에 오는 파일의 이름을 표시합니다.", + "workbench.editor.labelFormat.medium": "작업 영역 루트를 기준으로 하는 상대 경로 앞에 오는 파일의 이름을 표시합니다.", + "workbench.editor.labelFormat.long": "절대 경로 앞에 오는 파일의 이름을 표시합니다.", + "tabDescription": "편집기의 레이블 형식을 제어합니다. 예를 들어 이 설정을 변경하면 파일의 위치를 더 쉽게 파악할 수 있습니다.:\n- 짧게: 'parent'\n- 중간: 'workspace/src/parent'\n- 길게: '/home/user/workspace/src/parent'\n- 기본값: '.../parent', 다른 탭이 동일한 제목을 공유하거나, 탭을 사용하지 않도록 설정한 경우 작업 영역 상대 경로", "editorTabCloseButton": "편집기의 탭 닫기 단추의 위치를 제어하거나 'off'로 설정된 경우 이 단추를 사용하지 않도록 설정합니다.", "showIcons": "열린 편집기를 아이콘과 함께 표시할지 여부를 제어합니다. 이를 위해서는 아이콘 테마도 사용하도록 설정해야 합니다.", + "enablePreview": "열려 있는 편집기를 미리 보기로 표시할지 여부를 제어합니다. 미리 보기 편집기는 유지된 상태까지(예: 두 번 클릭 또는 편집을 통해) 다시 사용되며 기울임꼴 글꼴 스타일로 표시됩니다.", "enablePreviewFromQuickOpen": "Quick Open에서 연 편집기를 미리 보기로 표시할지 여부를 제어합니다. 미리 보기 편집기는 유지된 상태까지(예: 두 번 클릭 또는 편집을 통해) 다시 사용됩니다.", "editorOpenPositioning": "편집기가 열리는 위치를 제어합니다. 현재 활성 편집기의 왼쪽 또는 오른쪽에서 편집기를 열려면 '왼쪽' 또는 '오른쪽'을 선택합니다. 현재 활성 편집기와 독립적으로 편집기를 열려면 '처음' 또는 '마지막'을 선택합니다.", "revealIfOpen": "편집기를 여는 경우 보이는 그룹 중 하나에 표시할지 여부를 제어합니다. 사용하지 않도록 설정할 경우 편집기가 기본적으로 현재 활성 편집기 그룹에 열립니다. 사용하도록 설정할 경우 현재 활성 편집기 그룹에서 편집기가 다시 열리지 않고 이미 열린 편집기가 표시됩니다. 강제로 편집기가 특정 그룹에서 열리거나 현재 활성 그룹 옆에 열리도록 하는 등의 일부 경우에는 이 설정이 무시됩니다.", diff --git a/i18n/kor/src/vs/workbench/parts/codeEditor/electron-browser/languageConfiguration/languageConfigurationExtensionPoint.i18n.json b/i18n/kor/src/vs/workbench/parts/codeEditor/electron-browser/languageConfiguration/languageConfigurationExtensionPoint.i18n.json index f113def895b..59ea1c2066d 100644 --- a/i18n/kor/src/vs/workbench/parts/codeEditor/electron-browser/languageConfiguration/languageConfigurationExtensionPoint.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/codeEditor/electron-browser/languageConfiguration/languageConfigurationExtensionPoint.i18n.json @@ -36,5 +36,10 @@ "schema.indentationRules.unIndentedLinePattern": "행이 이 패턴과 일치하면 들여쓰기를 수정하지 않고 다른 규칙에 대해서 평가하지도 않습니다.", "schema.indentationRules.unIndentedLinePattern.pattern": "unIndentedLinePattern에 대한 RegExp 패턴입니다.", "schema.indentationRules.unIndentedLinePattern.flags": "unIndentedLinePattern에 대한 RegExp 플래그입니다.", - "schema.indentationRules.unIndentedLinePattern.errorMessage": "`/^([gimuy]+)$/` 패턴과 일치해야 합니다." + "schema.indentationRules.unIndentedLinePattern.errorMessage": "`/^([gimuy]+)$/` 패턴과 일치해야 합니다.", + "schema.folding": "해당 언어의 접기 설정입니다.", + "schema.folding.offSide": "해당 언어의 블록이 들여쓰기로 표현되는 경우 언어는 오프사이드 규칙을 준수합니다. 설정하는 경우 빈 줄은 후속 블록에 속합니다.", + "schema.folding.markers": "'#region' 및 '#endregion'처럼 언어별 접기 표식입니다. 시작 및 종료 regex는 모든 줄의 콘텐츠에 대해 테스트되며 효율적으로 설계되어야 합니다.", + "schema.folding.markers.start": "시작 표식에 대한 RegExp 패턴입니다. regexp는 '^'으로 시작해야 합니다.", + "schema.folding.markers.end": "끝 표식에 대한 RegExp 패턴입니다. regexp는 '^'으로 시작해야 합니다." } \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/parts/debug/electron-browser/debugService.i18n.json b/i18n/kor/src/vs/workbench/parts/debug/electron-browser/debugService.i18n.json index 3a1c8cbdce7..7b4fa4d91c9 100644 --- a/i18n/kor/src/vs/workbench/parts/debug/electron-browser/debugService.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/debug/electron-browser/debugService.i18n.json @@ -12,6 +12,8 @@ "breakpointRemoved": "파일 {1}, 줄 {0}에서 중단점이 제거되었습니다.", "compoundMustHaveConfigurations": "여러 구성을 시작하려면 복합에 \"configurations\" 특성 집합이 있어야 합니다.", "configMissing": "'{0}' 구성이 'launch.json'에 없습니다.", + "debugRequestNotSupported": "선택한 디버그 구성에 지원되지 않는 특성 값 `{0}`: '{1}'이(가) 있습니다.", + "debugRequesMissing": "선택한 디버그 구성에 특성 '{0}'이(가) 없습니다.", "debugTypeNotSupported": "구성된 디버그 형식 '{0}'은(는) 지원되지 않습니다.", "debugTypeMissing": "선택한 시작 구성에 대한 'type' 속성이 없습니다.", "preLaunchTaskErrors": "preLaunchTask '{0}' 진행 중에 빌드 오류가 감지되었습니다.", diff --git a/i18n/kor/src/vs/workbench/parts/extensions/browser/extensionEditor.i18n.json b/i18n/kor/src/vs/workbench/parts/extensions/browser/extensionEditor.i18n.json index f0bb9eb253a..7092740fd0c 100644 --- a/i18n/kor/src/vs/workbench/parts/extensions/browser/extensionEditor.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/extensions/browser/extensionEditor.i18n.json @@ -29,6 +29,13 @@ "view id": "ID", "view name": "이름", "view location": "위치", + "colorThemes": "색 테마({0})", + "iconThemes": "아이콘 테마({0})", + "colors": "색({0})", + "colorId": "ID", + "defaultDark": "어둡게 기본값", + "defaultLight": "밝게 기본값", + "defaultHC": "고대비 기본값", "JSON Validation": "JSON 유효성 검사({0})", "commands": "명령({0})", "command name": "이름", diff --git a/i18n/kor/src/vs/workbench/parts/extensions/browser/extensionsActions.i18n.json b/i18n/kor/src/vs/workbench/parts/extensions/browser/extensionsActions.i18n.json index 4740dad8c10..f725b6c7c5b 100644 --- a/i18n/kor/src/vs/workbench/parts/extensions/browser/extensionsActions.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/extensions/browser/extensionsActions.i18n.json @@ -53,6 +53,7 @@ "showAzureExtensionsShort": "Azure 확장", "OpenExtensionsFile.failed": "'.vscode' 폴더({0}) 내에 'extensions.json' 파일을 만들 수 없습니다.", "configureWorkspaceRecommendedExtensions": "권장 확장 구성(작업 영역)", + "configureWorkspaceFolderRecommendedExtensions": "권장 확장 구성(작업 영역 폴더)", "builtin": "기본 제공", "disableAll": "설치된 모든 확장 사용 안 함", "disableAllWorkspace": "이 작업 영역에 대해 설치된 모든 확장 사용 안 함", diff --git a/i18n/kor/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json b/i18n/kor/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json index 1ad38867f92..5d5a8d4e6fb 100644 --- a/i18n/kor/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json @@ -5,10 +5,12 @@ // Do not edit this file. It is machine generated. { "reallyRecommended2": "이 파일 형식에 대해 '{0}' 확장이 권장됩니다.", + "reallyRecommendedExtensionPack": "이 파일 형식에 대해 '{0}' 확장 팩이 권장됩니다.", "showRecommendations": "권장 사항 표시", "neverShowAgain": "다시 표시 안 함", "close": "닫기", "workspaceRecommended": "이 작업 영역에 확장 권장 사항이 있습니다.", + "ignoreExtensionRecommendations": "확장 권장 사항을 모두 무시하시겠습니까?", "ignoreAll": "예, 모두 무시", "no": "아니요", "cancel": "취소" diff --git a/i18n/kor/src/vs/workbench/parts/files/browser/files.contribution.i18n.json b/i18n/kor/src/vs/workbench/parts/files/browser/files.contribution.i18n.json index 4ab44e5871c..c3fd559ec19 100644 --- a/i18n/kor/src/vs/workbench/parts/files/browser/files.contribution.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/files/browser/files.contribution.i18n.json @@ -10,12 +10,16 @@ "textFileEditor": "텍스트 파일 편집기", "binaryFileEditor": "이진 파일 편집기", "filesConfigurationTitle": "파일", + "exclude": "파일 및 폴더를 제외하도록 GLOB 패턴을 구성합니다. 예를 들어 파일 탐색기는 이 설정에 따라 표시하거나 숨길 파일 및 폴더를 결정합니다.", "files.exclude.boolean": "파일 경로를 일치시킬 GLOB 패턴입니다. 패턴을 사용하거나 사용하지 않도록 설정하려면 true 또는 false로 설정하세요.", "files.exclude.when": "일치하는 파일의 형제에 대한 추가 검사입니다. $(basename)을 일치하는 파일 이름에 대한 변수로 사용하세요.", "associations": "파일과 언어의 연결을 구성하세요(예: \"*.extension\": \"html\"). 이러한 구성은 설치된 언어의 기본 연결보다 우선 순위가 높습니다.", + "encoding": "파일을 읽고 쓸 때 사용할 기본 문자 집합 인코딩입니다. 이 설정은 언어별로 구성할 수도 있습니다.", + "autoGuessEncoding": "사용하도록 설정하는 경우 파일을 열 때 문자 집합 인코딩을 추측합니다. 이 설정은 언어별로 구성할 수도 있습니다.", "eol": "줄 바꿈 문자의 기본 끝입니다. LF에는 \\n, CRLF에는 \\r\\n을 사용하세요.", "trimTrailingWhitespace": "사용하도록 설정되면 파일을 저장할 때 후행 공백이 잘립니다.", "insertFinalNewline": "사용하도록 설정되면 저장할 때 파일 끝에 마지막 줄바꿈을 삽입합니다.", + "trimFinalNewlines": "사용하도록 설정되면 저장할 때 파일 끝에 마지막 줄 바꿈 이후의 모든 줄 바꿈이 잘립니다.", "files.autoSave.off": "더티 파일이 자동으로 저장되지 않습니다.", "files.autoSave.afterDelay": "'files.autoSaveDelay' 구성 후 더티 파일이 자동으로 저장됩니다.", "files.autoSave.onFocusChange": "편집기가 포커스를 잃으면 더티 파일이 자동으로 저장됩니다.", diff --git a/i18n/kor/src/vs/workbench/parts/files/common/dirtyFilesTracker.i18n.json b/i18n/kor/src/vs/workbench/parts/files/common/dirtyFilesTracker.i18n.json index cbd0a366921..92d4ab06aac 100644 --- a/i18n/kor/src/vs/workbench/parts/files/common/dirtyFilesTracker.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/files/common/dirtyFilesTracker.i18n.json @@ -4,5 +4,6 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { + "dirtyFile": "저장되지 않은 파일 1개", "dirtyFiles": "{0}개의 저장되지 않은 파일" } \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/parts/scm/electron-browser/scmViewlet.i18n.json b/i18n/kor/src/vs/workbench/parts/scm/electron-browser/scmViewlet.i18n.json index 613ba80ad4e..7706711508b 100644 --- a/i18n/kor/src/vs/workbench/parts/scm/electron-browser/scmViewlet.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/scm/electron-browser/scmViewlet.i18n.json @@ -4,8 +4,11 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { + "scm providers": "소스 제어 공급자", + "hideRepository": "숨기기", "commitMessage": "Message (press {0} to commit)", "installAdditionalSCMProviders": "추가 SCM 공급자 설치...", + "no open repo": "활성 소스 제어 공급자가 없습니다.", "source control": "소스 제어", "viewletTitle": "{0}: {1}" } \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/parts/snippets/electron-browser/insertSnippet.i18n.json b/i18n/kor/src/vs/workbench/parts/snippets/electron-browser/insertSnippet.i18n.json index 7fd318c3ac3..89f97af107d 100644 --- a/i18n/kor/src/vs/workbench/parts/snippets/electron-browser/insertSnippet.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/snippets/electron-browser/insertSnippet.i18n.json @@ -4,5 +4,7 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "snippet.suggestions.label": "코드 조각 삽입" + "snippet.suggestions.label": "코드 조각 삽입", + "sep.userSnippet": "사용자 코드 조각", + "sep.extSnippet": "확장 코드 조각" } \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/parts/snippets/electron-browser/snippetsService.i18n.json b/i18n/kor/src/vs/workbench/parts/snippets/electron-browser/snippetsService.i18n.json index ff965d875e1..b80c311ab32 100644 --- a/i18n/kor/src/vs/workbench/parts/snippets/electron-browser/snippetsService.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/snippets/electron-browser/snippetsService.i18n.json @@ -10,6 +10,7 @@ "vscode.extension.contributes.snippets": "코드 조각을 적용합니다.", "vscode.extension.contributes.snippets-language": "이 코드 조각이 적용되는 언어 식별자입니다.", "vscode.extension.contributes.snippets-path": "코드 조각 파일의 경로입니다. 이 경로는 확장 폴더의 상대 경로이며 일반적으로 './snippets/'로 시작합니다.", + "badFile": "코드 조각 파일 \"{0}\"을(를) 읽을 수 없습니다.", "badVariableUse": "\"{0}\"-snippet은 snippet-variables 및 snippet-placeholders와 혼동하기 쉽습니다. 자세한 내용은\n https://code.visualstudio.com/docs/editor/userdefinedsnippets#_snippet-syntax를 참조하세요.", "source.snippet": "사용자 코드 조각", "detail.snippet": "{0}({1})", diff --git a/i18n/kor/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json b/i18n/kor/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json index ebb319eca1e..f423d7950f1 100644 --- a/i18n/kor/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json @@ -13,11 +13,13 @@ "manyMarkers": "99+", "runningTasks": "실행 중인 작업 표시", "tasks": "작업", + "TaskSystem.noHotSwap": "실행 중인 활성 작업이 있는 작업 실행 엔진을 변경하면 Window를 다시 로드해야 합니다.", "TaskService.noBuildTask1": "정의된 빌드 작업이 없습니다. tasks.json 파일에서 작업을 'isBuildCommand'로 표시하세요.", "TaskService.noBuildTask2": "정의된 빌드 작업이 없습니다. tasks.json 파일에서 작업을 'build'로 표시하세요.", "TaskService.noTestTask1": "정의된 테스트 작업이 없습니다. tasks.json 파일에서 작업을 'isTestCommand'로 표시하세요.", "TaskService.noTestTask2": "정의된 테스트 작업이 없습니다. tasks.json 파일에서 작업을 'test'로 표시하세요.", "TaskServer.noTask": "실행하도록 요청한 작업 {0}을(를) 찾을 수 없습니다.", + "TaskService.associate": "연결", "TaskService.attachProblemMatcher.continueWithout": "작업 출력을 스캔하지 않고 계속", "TaskService.attachProblemMatcher.never": "작업 출력 스캔 안 함", "TaskService.attachProblemMatcher.learnMoreAbout": "작업 출력 스캔에 대해 자세히 알아보기", @@ -29,6 +31,7 @@ "TaskSystem.active": "이미 실행 중인 작업이 있습니다. 다른 작업을 실행하려면 먼저 이 작업을 종료하세요.", "TaskSystem.restartFailed": "{0} 작업을 종료하고 다시 시작하지 못했습니다.", "TaskSystem.configurationErrors": "오류: 제공한 작업 구성에 유효성 검사 오류가 있으며 사용할 수 없습니다. 먼저 오류를 수정하세요.", + "taskService.ignoreingFolder": "작업 영역 폴더 {0}에 대한 작업 구성을 무시합니다. 여러 폴더 작업 영역 작업 지원은 모든 폴더가 작업 버전 2.0.0을 사용해야 합니다.\n", "TaskSystem.invalidTaskJson": "오류: tasks.json 파일의 내용에 구문 오류가 있습니다. 작업을 실행하기 전에 오류를 정정하세요.\n", "TaskSystem.runningTask": "실행 중인 작업이 있습니다. 이 작업을 종료할까요?", "TaskSystem.terminateTask": "작업 종료(&&T)", @@ -40,20 +43,33 @@ "recentlyUsed": "최근에 사용한 작업", "configured": "구성된 작업", "detected": "감지된 작업", + "TaskService.ignoredFolder": "작업 버전 0.1.0을 사용하기 때문에 다음 작업 영역 폴더는 무시됩니다.", "TaskService.notAgain": "다시 표시 안 함", "TaskService.ok": "확인", + "TaskService.pickRunTask": "실행할 작업 선택", + "TaslService.noEntryToRun": "실행할 작업이 없습니다. 작업 구성...", "TaskService.fetchingBuildTasks": "빌드 작업을 페치하는 중...", "TaskService.pickBuildTask": "실행할 빌드 작업 선택", + "TaskService.noBuildTask": "실행할 빌드 작업이 없습니다. 작업 구성...", "TaskService.fetchingTestTasks": "테스트 작업을 페치하는 중...", "TaskService.pickTestTask": "실행할 테스트 작업 선택", + "TaskService.noTestTaskTerminal": "실행할 테스트 작업이 없습니다. 작업 구성...", "TaskService.tastToTerminate": "종료할 작업 선택", + "TaskService.noTaskRunning": "현재 실행 중인 작업이 없습니다.", "TerminateAction.noProcess": "시작된 프로세스가 더 이상 존재하지 않습니다. 작업에서 생성된, VS Code를 끝내는 백그라운드 작업이 분리된 프로세스가 될 수 있습니다.", "TerminateAction.failed": "실행 중인 작업을 종료하지 못했습니다.", "TaskService.tastToRestart": "다시 시작할 작업 선택", + "TaskService.noTaskToRestart": "다시 시작할 작업이 없습니다.", + "TaskService.template": "작업 템플릿 선택", + "TaskService.createJsonFile": "템플릿에서 tasks.json 파일 만들기", + "TaskService.openJsonFile": "tasks.json 파일 열기", + "TaskService.pickTask": "구성할 작업 선택", + "TaskService.defaultBuildTaskExists": "{0}은(는) 이미 기본 빌드 작업으로 표시되어 있습니다.", "TaskService.pickDefaultBuildTask": "기본 빌드 작업으로 사용할 작업을 선택", "TaskService.defaultTestTaskExists": "{0}은(는) 이미 기본 테스트 작업으로 표시되어 있습니다.", "TaskService.pickDefaultTestTask": "기본 테스트 작업으로 사용할 작업 선택", "TaskService.pickShowTask": "출력을 표시할 작업 선택", + "TaskService.noTaskIsRunning": "실행 중인 작업이 없습니다.", "ShowLogAction.label": "작업 로그 표시", "RunTaskAction.label": "작업 실행", "RestartTaskAction.label": "실행 중인 작업 다시 시작", diff --git a/i18n/kor/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.i18n.json b/i18n/kor/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.i18n.json index 4c053b9817c..b052f09dc9e 100644 --- a/i18n/kor/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.i18n.json @@ -5,6 +5,7 @@ // Do not edit this file. It is machine generated. { "TerminalTaskSystem.unknownError": "작업을 실행하는 동안 알 수 없는 오류가 발생했습니다. 자세한 내용은 작업 출력 로그를 참조하세요.", + "dependencyFailed": "작업 영역 폴더 '{1}'에서 종속 작업 '{0}'을(를) 확인할 수 없습니다. ", "TerminalTaskSystem.terminalName": "작업 - {0}", "reuseTerminal": "터미널이 작업에서 다시 사용됩니다. 닫으려면 아무 키나 누르세요.", "TerminalTaskSystem": "UNC 드라이브에서 셸 명령을 실행할 수 없습니다.", diff --git a/i18n/kor/src/vs/workbench/parts/tasks/node/taskConfiguration.i18n.json b/i18n/kor/src/vs/workbench/parts/tasks/node/taskConfiguration.i18n.json index e33377e3064..d676ae23acb 100644 --- a/i18n/kor/src/vs/workbench/parts/tasks/node/taskConfiguration.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/tasks/node/taskConfiguration.i18n.json @@ -12,6 +12,7 @@ "ConfigurationParser.invalidVaraibleReference": "오류: 잘못된 problemMatcher 참조: {0}\n", "ConfigurationParser.noTaskType": "오류: 작업 구성은 유형 속성이 필요합니다. 이 구성은 무시됩니다.\n{0}\n", "ConfigurationParser.noTypeDefinition": "오류: 등록된 작업 형식 '{0}'이(가) 없습니다. 해당하는 작업 공급자를 제공하는 확장을 설치하지 않으셨습니까?", + "ConfigurationParser.missingRequiredProperty": "오류: 작업 구성 '{0}'에 필요한 속성 '{1}'이(가) 없습니다. 작업 구성이 무시됩니다.", "ConfigurationParser.notCustom": "오류: 작업이 사용자 지정 작업으로 선언되지 않았습니다. 이 구성은 무시됩니다.\n{0}\n", "ConfigurationParser.noTaskName": "오류: 작업에서 taskName 속성을 제공해야 합니다. 이 작업은 무시됩니다.\n{0}\n", "taskConfiguration.shellArgs": "경고: 작업 '{0}'은(는) 셸 명령이며, 명령 이름이나 인수 중 하나에 이스케이프되지 않은 공백이 있습니다. 명령줄 인용을 올바르게 하려면 인수를 명령으로 병합하세요.", diff --git a/i18n/kor/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json b/i18n/kor/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json index d5e2c68ddac..110ad443882 100644 --- a/i18n/kor/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json @@ -38,5 +38,6 @@ "workbench.action.terminal.focusFindWidget": "파인드 위젯 포커스", "workbench.action.terminal.hideFindWidget": "파인드 위젯 숨기기", "nextTerminalFindTerm": "다음 검색어 표시", - "previousTerminalFindTerm": "이전 검색어 표시" + "previousTerminalFindTerm": "이전 검색어 표시", + "quickOpenTerm": "활성 터미널 전환" } \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/parts/terminal/electron-browser/terminalColorRegistry.i18n.json b/i18n/kor/src/vs/workbench/parts/terminal/electron-browser/terminalColorRegistry.i18n.json index 23c1d36b142..32869d50216 100644 --- a/i18n/kor/src/vs/workbench/parts/terminal/electron-browser/terminalColorRegistry.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/terminal/electron-browser/terminalColorRegistry.i18n.json @@ -8,5 +8,6 @@ "terminal.foreground": "터미널의 전경색입니다.", "terminalCursor.foreground": "터미널 커서의 전경색입니다.", "terminalCursor.background": "터미널 커서의 배경색입니다. 블록 커서와 겹친 문자의 색상을 사용자 정의할 수 있습니다.", + "terminal.selectionBackground": "터미널의 선택 영역 배경색입니다.", "terminal.ansiColor": "터미널의 '{0}' ANSI 색입니다." } \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json b/i18n/kor/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json index a7a11fff031..5e2412f131b 100644 --- a/i18n/kor/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json @@ -10,6 +10,7 @@ "welcomePage.newFile": "새 파일", "welcomePage.openFolder": "폴더 열기...", "welcomePage.cloneGitRepository": "Git 리포지토리 복제...", + "welcomePage.addWorkspaceFolder": "작업 영역 폴더 추가...", "welcomePage.recent": "최근 항목", "welcomePage.moreRecent": "자세히...", "welcomePage.noRecentFolders": "최근 폴더 없음", diff --git a/i18n/kor/src/vs/workbench/services/configuration/node/configuration.i18n.json b/i18n/kor/src/vs/workbench/services/configuration/node/configuration.i18n.json index 0082a801e64..96b95e7ea94 100644 --- a/i18n/kor/src/vs/workbench/services/configuration/node/configuration.i18n.json +++ b/i18n/kor/src/vs/workbench/services/configuration/node/configuration.i18n.json @@ -13,6 +13,12 @@ "invalid.title": "'configuration.title'은 문자열이어야 합니다.", "vscode.extension.contributes.defaultConfiguration": "언어별로 기본 편집기 구성 설정을 적용합니다.", "invalid.properties": "'configuration.properties'는 개체여야 합니다.", + "invalid.allOf": "'configuration.allOf'는 사용되지 않으며 더 이상 사용해서는 안됩니다. 대신 여러 구성 섹션을 배열로 'configuration' 기여 지점에 전달하세요.", + "workspaceConfig.folders.description": "작업 영역에 로드되는 폴더 목록입니다.", "workspaceConfig.path.description": "파일 경로입니다. 예: `/root/folderA` 또는 `./folderA`(작업 영역 파일의 위치를 기준으로 확인할 상대 경로인 경우)", - "workspaceConfig.settings.description": "작업 영역 설정" + "workspaceConfig.name.description": "폴더에 대한 선택적 이름입니다.", + "workspaceConfig.uri.description": "폴더의 URI", + "workspaceConfig.settings.description": "작업 영역 설정", + "workspaceConfig.extensions.description": "작업 영역 확장", + "unknownWorkspaceProperty": "알 수 없는 작업 영역 구성 속성" } \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json b/i18n/kor/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json index f5327cac860..8eb022003b1 100644 --- a/i18n/kor/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json +++ b/i18n/kor/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json @@ -4,13 +4,26 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { + "openTasksConfiguration": "작업 구성 열기", + "openLaunchConfiguration": "시작 구성 열기", "close": "닫기", "open": "설정 열기", + "saveAndRetry": "저장 및 다시 시도", "errorUnknownKey": "{1}은(는) 등록된 구성이 아니므로 {0}에 쓸 수 없습니다.", "errorInvalidFolderConfiguration": "{0}이(가) 폴더 리소스 범위를 지원하지 않으므로 폴더 설정에 쓸 수 없습니다.", "errorInvalidUserTarget": "{0}이(가) 글로벌 범위를 지원하지 않으므로 사용자 설정에 쓸 수 없습니다.", "errorInvalidFolderTarget": "리소스가 제공되지 않으므로 폴더 설정에 쓸 수 없습니다.", "errorNoWorkspaceOpened": "작업 영역이 열려 있지 않으므로 {0}에 쓸 수 없습니다. 먼저 작업 영역을 열고 다시 시도하세요.", + "errorInvalidTaskConfiguration": "작업 파일에 쓸 수 없습니다. **작업** 파일을 열어 오류/경고를 수정하고 다시 시도하세요.", + "errorInvalidLaunchConfiguration": "실행 파일에 쓸 수 없습니다. **실행** 파일을 열어 오류/경고를 수정하고 다시 시도하세요.", + "errorInvalidConfiguration": "사용자 설정에 쓸 수 없습니다. **사용자 설정** 파일을 열어 오류/경고를 수정하고 다시 시도하세요.", + "errorInvalidConfigurationWorkspace": "작업 영역 설정에 쓸 수 없습니다. **작업 영역 설정** 파일을 열어 오류/경고를 수정하고 다시 시도하세요.", + "errorInvalidConfigurationFolder": "폴더 설정에 쓸 수 없습니다. **{0}** 폴더 아래의 **폴더 설정** 파일을 열어 오류/경고를 수정하고 다시 시도하세요.", + "errorTasksConfigurationFileDirty": "파일이 변경되어 작업 파일에 쓸 수 없습니다. **작업 구성** 파일을 저장하고 다시 시도하세요.", + "errorLaunchConfigurationFileDirty": "파일이 변경되어 시작 파일에 쓸 수 없습니다. **시작 구성** 파일을 저장하고 다시 시도하세요.", + "errorConfigurationFileDirty": "파일이 변경되어 사용자 설정에 쓸 수 없습니다. **사용자 설정** 파일을 저장하고 다시 시도하세요.", + "errorConfigurationFileDirtyWorkspace": "파일이 변경되어 작업 영역에 쓸 수 없습니다. **작업 영역 설정** 파일을 저장하고 다시 시도하세요.", + "errorConfigurationFileDirtyFolder": "파일이 변경되어 폴더 설정에 쓸 수 없습니다. **{0}** 폴더 아래의 **폴더 설정** 파일을 저장하고 다시 시도하세요.", "userTarget": "사용자 설정", "workspaceTarget": "작업 영역 설정", "folderTarget": "폴더 설정" diff --git a/i18n/kor/src/vs/workbench/services/files/node/fileService.i18n.json b/i18n/kor/src/vs/workbench/services/files/node/fileService.i18n.json index ff2c5e9f172..28c96c9fb3d 100644 --- a/i18n/kor/src/vs/workbench/services/files/node/fileService.i18n.json +++ b/i18n/kor/src/vs/workbench/services/files/node/fileService.i18n.json @@ -5,10 +5,12 @@ // Do not edit this file. It is machine generated. { "fileInvalidPath": "잘못된 파일 리소스({0})", + "fileIsDirectoryError": "파일이 디렉터리입니다.", "fileNotModifiedError": "파일 수정 안 됨", "fileTooLargeError": "파일이 너무 커서 열 수 없음", "fileBinaryError": "파일이 이진인 것 같으므로 테스트로 열 수 없습니다.", "fileNotFoundError": "파일을 찾을 수 없습니다({0}).", + "fileExists": "만드려는 파일이 이미 있음({0})", "fileMoveConflict": "이동/복사할 수 없습니다. 대상에 파일이 이미 있습니다.", "unableToMoveCopyError": "이동/복사할 수 없습니다. 파일이 포함된 폴더를 파일로 대체합니다.", "foldersCopyError": "폴더를 작업 영역에 복사할 수 없습니다. 개별 파일을 선택하여 복사하세요.", diff --git a/i18n/ptb/src/vs/platform/actions/electron-browser/menusExtensionPoint.i18n.json b/i18n/ptb/src/vs/platform/actions/electron-browser/menusExtensionPoint.i18n.json index cea37b5ae9c..28adcb87065 100644 --- a/i18n/ptb/src/vs/platform/actions/electron-browser/menusExtensionPoint.i18n.json +++ b/i18n/ptb/src/vs/platform/actions/electron-browser/menusExtensionPoint.i18n.json @@ -20,6 +20,7 @@ "menus.editorTabContext": "Mostrar o menu de contexto do editor", "menus.debugCallstackContext": "O menu de contexto de pilha de chamadas de depuração", "menus.scmTitle": "O menu de título do controle de fonte", + "menus.scmSourceControl": "O menu do Controle de Código Fonte", "menus.resourceGroupContext": "O menu de contexto do grupo de recursos de controle de fonte", "menus.resourceStateContext": "O menu de contexto de estado de recursos do controle de fonte", "view.viewTitle": "O menu de título da visualização contribuída", diff --git a/i18n/ptb/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json b/i18n/ptb/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json index fe9bcf24664..2d1418035ea 100644 --- a/i18n/ptb/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json +++ b/i18n/ptb/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json @@ -13,5 +13,7 @@ "vscode.extension.contributes.views": "Contribui visualizações ao editor", "views.explorer": "Visualização do explorador", "views.debug": "Visualizar Depurador", - "locationId.invalid": "'{0}' não é um local válido de visualização" + "locationId.invalid": "'{0}' não é um local válido de visualização", + "duplicateView1": "Não é possível registrar vários modos de exibição com a mesma id '{0}' no local '{1}'", + "duplicateView2": "Uma exibição com id '{0}' já está registrada no local '{1}'" } \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/electron-browser/main.contribution.i18n.json b/i18n/ptb/src/vs/workbench/electron-browser/main.contribution.i18n.json index 762047cd35b..b53f01cbe3b 100644 --- a/i18n/ptb/src/vs/workbench/electron-browser/main.contribution.i18n.json +++ b/i18n/ptb/src/vs/workbench/electron-browser/main.contribution.i18n.json @@ -10,7 +10,6 @@ "workspaces": "Espaços de trabalho", "developer": "Desenvolvedor", "showEditorTabs": "Controla se os editores abertos devem ou não serem exibidos em abas.", - "workbench.editor.labelFormat.default": "Mostrar o nome do arquivo. Quando as guias estão habilitadas e dois arquivos têm o mesmo nome em um grupo, as seções distintas de cada caminho de arquivo são adicionadas. Quando as guias estão desativadas, o caminho relativo à raiz do espaço de trabalho é mostrado se o editor estiver ativo.", "workbench.editor.labelFormat.short": "Mostrar o nome do arquivo seguido pelo nome do diretório.", "workbench.editor.labelFormat.medium": "Mostrar o nome do arquivo seguido pelo seu caminho relativo à raiz do espaço de trabalho.", "workbench.editor.labelFormat.long": "Mostrar o nome do arquivo seguido pelo seu caminho absoluto.", diff --git a/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/debugService.i18n.json b/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/debugService.i18n.json index 8532e53b63f..86218bade61 100644 --- a/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/debugService.i18n.json +++ b/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/debugService.i18n.json @@ -12,8 +12,6 @@ "breakpointRemoved": "Ponto de interrupção removido, linha {0}, arquivo {1}", "compoundMustHaveConfigurations": "Composição deve ter o atributo \"configurations\" definido para iniciar várias configurações.", "configMissing": "Configuração '{0}' não tem 'launch.json'.", - "debugRequestNotSupported": "Solicitação de depuração configurada '{0}' não é suportada", - "debugRequesMissing": "Solicitação de depuração está faltando na configuração de lançamento escolhida", "debugTypeNotSupported": "Tipo de depuração configurado '{0}' não é suportado.", "debugTypeMissing": "Falta a propriedade 'type' para a configuração de lançamento escolhida.", "preLaunchTaskErrors": "Erros de build foram detectados durante a preLaunchTask '{0}'.", diff --git a/i18n/ptb/src/vs/workbench/parts/files/browser/files.contribution.i18n.json b/i18n/ptb/src/vs/workbench/parts/files/browser/files.contribution.i18n.json index e4d6ecbed2f..f64389d1f4a 100644 --- a/i18n/ptb/src/vs/workbench/parts/files/browser/files.contribution.i18n.json +++ b/i18n/ptb/src/vs/workbench/parts/files/browser/files.contribution.i18n.json @@ -10,6 +10,7 @@ "textFileEditor": "Editor de Arquivo de Texto", "binaryFileEditor": "Editor de Arquivo Binário", "filesConfigurationTitle": "Arquivos", + "exclude": "Configure padrões glob para excluir os arquivos e pastas. Por exemplo, o explorador de arquivos decide quais arquivos e pastas mostrar ou ocultar baseado nessa configuração.", "files.exclude.boolean": "O padrão glob com o qual combinar os caminhos de arquivo. Defina para verdadeiro ou falso para habilitar ou desabilitar o padrão.", "files.exclude.when": "Verificação adicional nos irmãos de um arquivo correspondente. Use $(basename) como variável para o nome do arquivo correspondente.", "associations": "Configurar as associações de arquivo para linguagens (por exemplo, \"* Extension\": \"html\"). Estas têm precedência sobre as associações padrão das linguagens instaladas.", diff --git a/i18n/ptb/src/vs/workbench/parts/scm/electron-browser/scmViewlet.i18n.json b/i18n/ptb/src/vs/workbench/parts/scm/electron-browser/scmViewlet.i18n.json index a743a823aad..4b9c688e07f 100644 --- a/i18n/ptb/src/vs/workbench/parts/scm/electron-browser/scmViewlet.i18n.json +++ b/i18n/ptb/src/vs/workbench/parts/scm/electron-browser/scmViewlet.i18n.json @@ -5,6 +5,7 @@ // Do not edit this file. It is machine generated. { "scm providers": "Provedores de Controle de Código Fonte", + "hideRepository": "Ocultar", "commitMessage": "Mensagem (tecle {0} para confirmar)", "installAdditionalSCMProviders": "Instalar provedores de SCM adicionais...", "no open repo": "Não existem provedores controle de código fonte ativos.", diff --git a/i18n/ptb/src/vs/workbench/services/configuration/node/configuration.i18n.json b/i18n/ptb/src/vs/workbench/services/configuration/node/configuration.i18n.json index c096360a2d7..2cd5ff9947e 100644 --- a/i18n/ptb/src/vs/workbench/services/configuration/node/configuration.i18n.json +++ b/i18n/ptb/src/vs/workbench/services/configuration/node/configuration.i18n.json @@ -19,5 +19,6 @@ "workspaceConfig.name.description": "Um nome opcional para a pasta. ", "workspaceConfig.uri.description": "URI da pasta", "workspaceConfig.settings.description": "Configurações de espaço de trabalho", - "workspaceConfig.extensions.description": "Extensões para o espaço de trabalho" + "workspaceConfig.extensions.description": "Extensões para o espaço de trabalho", + "unknownWorkspaceProperty": "Propriedade de configuração do espaço de trabalho desconhecida" } \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json b/i18n/ptb/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json index cf0d6f1808b..f4e46e76613 100644 --- a/i18n/ptb/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json +++ b/i18n/ptb/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json @@ -4,6 +4,8 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { + "openTasksConfiguration": "Abrir Configuração de Tarefas", + "openLaunchConfiguration": "Abrir Configuração de Execução", "close": "Fechar", "open": "Abrir configurações", "errorUnknownKey": "Não é possível gravar {0} porque {1} não é uma configuração registrada.", diff --git a/i18n/rus/extensions/css/package.i18n.json b/i18n/rus/extensions/css/package.i18n.json index b6410d713d7..db66fb21a3c 100644 --- a/i18n/rus/extensions/css/package.i18n.json +++ b/i18n/rus/extensions/css/package.i18n.json @@ -4,6 +4,7 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { + "css.title": "CSS", "css.lint.argumentsInColorFunction.desc": "Недопустимое число параметров", "css.lint.boxModel.desc": "Не использовать ширину или высоту при использовании поля или границы", "css.lint.compatibleVendorPrefixes.desc": "При использовании зависящего от поставщика префикса также указывайте все остальные свойства поставщика", @@ -25,6 +26,7 @@ "css.trace.server.desc": "Отслеживает обмен данными между VS Code и языковым сервером CSS.", "css.validate.title": "Управляет проверкой CSS и серьезностью проблем.", "css.validate.desc": "Включает или отключает все проверки", + "less.title": "LESS", "less.lint.argumentsInColorFunction.desc": "Недопустимое число параметров", "less.lint.boxModel.desc": "Не использовать ширину или высоту при использовании поля или границы", "less.lint.compatibleVendorPrefixes.desc": "При использовании зависящего от поставщика префикса также указывайте все остальные свойства поставщика", @@ -45,6 +47,7 @@ "less.lint.zeroUnits.desc": "Для нуля не требуется единица измерения", "less.validate.title": "Управляет проверкой LESS и уровнями серьезности проблем. ", "less.validate.desc": "Включает или отключает все проверки", + "scss.title": "SCSS (SASS)", "scss.lint.argumentsInColorFunction.desc": "Недопустимое число параметров", "scss.lint.boxModel.desc": "Не использовать ширину или высоту при использовании поля или границы", "scss.lint.compatibleVendorPrefixes.desc": "При использовании зависящего от поставщика префикса также указывайте все остальные свойства поставщика", diff --git a/i18n/rus/extensions/grunt/out/main.i18n.json b/i18n/rus/extensions/grunt/out/main.i18n.json index 8b6ad71cd4e..2de2f8e2719 100644 --- a/i18n/rus/extensions/grunt/out/main.i18n.json +++ b/i18n/rus/extensions/grunt/out/main.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "execFailed": "Не удалось автоматически определить задания Grunt для папки {0}. Ошибка: {1}" +} \ No newline at end of file diff --git a/i18n/rus/extensions/gulp/out/main.i18n.json b/i18n/rus/extensions/gulp/out/main.i18n.json index 8b6ad71cd4e..21e246af6b3 100644 --- a/i18n/rus/extensions/gulp/out/main.i18n.json +++ b/i18n/rus/extensions/gulp/out/main.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "execFailed": "Не удалось автоматически определить задания gulp для папки {0}. Ошибка: {1}" +} \ No newline at end of file diff --git a/i18n/rus/extensions/jake/out/main.i18n.json b/i18n/rus/extensions/jake/out/main.i18n.json index 8b6ad71cd4e..7a33b80be29 100644 --- a/i18n/rus/extensions/jake/out/main.i18n.json +++ b/i18n/rus/extensions/jake/out/main.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "execFailed": "Не удалось автоматически определить задания Jake для папки {0}. Ошибка: {1}" +} \ No newline at end of file diff --git a/i18n/rus/extensions/markdown/out/extension.i18n.json b/i18n/rus/extensions/markdown/out/extension.i18n.json index 5c5b3690dc6..5a81b95de6e 100644 --- a/i18n/rus/extensions/markdown/out/extension.i18n.json +++ b/i18n/rus/extensions/markdown/out/extension.i18n.json @@ -4,5 +4,6 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "onPreviewStyleLoadError": "Не удалось загрузить 'markdown.styles': {0}" + "onPreviewStyleLoadError": "Не удалось загрузить 'markdown.styles': {0}", + "previewTitle": "Предварительный просмотр {0}" } \ No newline at end of file diff --git a/i18n/rus/src/vs/code/electron-main/menus.i18n.json b/i18n/rus/src/vs/code/electron-main/menus.i18n.json index d5553161f35..683007474d8 100644 --- a/i18n/rus/src/vs/code/electron-main/menus.i18n.json +++ b/i18n/rus/src/vs/code/electron-main/menus.i18n.json @@ -151,6 +151,10 @@ "mZoom": "Изменить масштаб", "mBringToFront": "Переместить все на передний план", "miSwitchWindow": "Переключить &&окно...", + "mShowPreviousTab": "Показать предыдущую вкладку", + "mShowNextTab": "Показать следующую вкладку", + "mMoveTabToNewWindow": "Переместить вкладку в новое окно", + "mMergeAllWindows": "Объединить все окна", "miToggleDevTools": "&&Показать/скрыть средства разработчика", "miAccessibilityOptions": "Специальные &&возможности", "miReportIssues": "&&Сообщить о проблемах", @@ -171,6 +175,8 @@ "miRunningTask": "Показать выполняющ&&иеся задачи...", "miRestartTask": "П&&ерезапустить запущенную задачу...", "miTerminateTask": "&&Завершить задачу...", + "miConfigureTask": "&&Настроить задачи...", + "miConfigureBuildTask": "Настроить задачу сборки по у&&молчанию...", "accessibilityOptionsWindowTitle": "Специальные возможности", "miRestartToUpdate": "Перезапустить программу для обновления...", "miCheckingForUpdates": "Идет проверка наличия обновлений...", diff --git a/i18n/rus/src/vs/code/electron-main/windows.i18n.json b/i18n/rus/src/vs/code/electron-main/windows.i18n.json index 6d52d829bc3..44f93a90db1 100644 --- a/i18n/rus/src/vs/code/electron-main/windows.i18n.json +++ b/i18n/rus/src/vs/code/electron-main/windows.i18n.json @@ -17,6 +17,8 @@ "open": "Открыть", "openFolder": "Открыть папку", "openFile": "Открыть файл", + "workspaceOpenedMessage": "Не удается сохранить рабочую область '{0}'", + "workspaceOpenedDetail": "Эта рабочая область уже открыта в другом окне. Закройте это окно и повторите попытку.", "openWorkspace": "&&Открыть...", "openWorkspaceTitle": "Открыть рабочую область", "save": "Сохранить", diff --git a/i18n/rus/src/vs/editor/common/config/commonEditorConfig.i18n.json b/i18n/rus/src/vs/editor/common/config/commonEditorConfig.i18n.json index 9ba3271eec9..33c7717b2f8 100644 --- a/i18n/rus/src/vs/editor/common/config/commonEditorConfig.i18n.json +++ b/i18n/rus/src/vs/editor/common/config/commonEditorConfig.i18n.json @@ -11,6 +11,7 @@ "lineHeight": "Управляет высотой строк. Укажите 0 для вычисления высоты строки по размеру шрифта.", "letterSpacing": "Управляет интервалом между буквами в пикселях.", "lineNumbers": "Управляет видимостью номеров строк. Возможные значения: \"on\", \"off\" и \"relative\". Значение \"relative\" показывает количество строк, начиная с текущего положения курсора.", + "rulers": "Отображать вертикальные линейки после определенного числа моноширинных символов. Для отображения нескольких линеек укажите несколько значений. Если не указано ни одного значения, вертикальные линейки отображаться не будут.", "wordSeparators": "Символы, которые будут использоваться как разделители слов при выполнении навигации или других операций, связанных со словами.", "tabSize": "Число пробелов в табуляции. Эта настройка переопределяется на основании содержимого файла, когда включен параметр \"editor.detectIndentation\".", "tabSize.errorMessage": "Ожидается число. Обратите внимание, что значение auto заменено параметром editor.detectIndentation.", @@ -87,6 +88,7 @@ "accessibilitySupport": "Определяет, следует ли запустить редактор в режиме оптимизации для средства чтения с экрана.", "links": "Определяет, должен ли редактор определять ссылки и делать их доступными для щелчка", "colorDecorators": "Определяет, должны ли в редакторе отображаться внутренние декораторы цвета и средство выбора цвета.", + "codeActions": "Включает индикатор действия кода", "sideBySide": "Определяет, как редактор несовпадений отображает отличия: рядом или в тексте.", "ignoreTrimWhitespace": "Определяет, должен ли редактор несовпадений трактовать несовпадения символов-разделителей как различия.", "renderIndicators": "Определяет отображение редактором несовпадений индикаторов +/- для добавленных или удаленных изменений", diff --git a/i18n/rus/src/vs/editor/common/view/editorColorRegistry.i18n.json b/i18n/rus/src/vs/editor/common/view/editorColorRegistry.i18n.json index 6fb3e1373ce..4801d2ec386 100644 --- a/i18n/rus/src/vs/editor/common/view/editorColorRegistry.i18n.json +++ b/i18n/rus/src/vs/editor/common/view/editorColorRegistry.i18n.json @@ -22,6 +22,8 @@ "errorBorder": "Цвет границ волнистой линии для выделения ошибок в редакторе.", "warningForeground": "Цвет волнистой линии для выделения предупреждений в редакторе.", "warningBorder": "Цвет границ волнистой линии для выделения предупреждений в редакторе.", + "infoForeground": "Цвет волнистой линии для выделения информационных сообщений в редакторе.", + "infoBorder": "Цвет границ волнистой линии для выделения информационных сообщений в редакторе. ", "overviewRulerRangeHighlight": "Цвет метки линейки в окне просмотра для выделений диапазонов.", "overviewRuleError": "Цвет метки линейки в окне просмотра для ошибок.", "overviewRuleWarning": "Цвет метки линейки в окне просмотра для предупреждений.", diff --git a/i18n/rus/src/vs/editor/contrib/gotoError/browser/gotoError.i18n.json b/i18n/rus/src/vs/editor/contrib/gotoError/browser/gotoError.i18n.json index 3e7c8375e65..5ca181d11bd 100644 --- a/i18n/rus/src/vs/editor/contrib/gotoError/browser/gotoError.i18n.json +++ b/i18n/rus/src/vs/editor/contrib/gotoError/browser/gotoError.i18n.json @@ -9,5 +9,6 @@ "markerAction.previous.label": "Перейти к предыдущей ошибке или предупреждению", "editorMarkerNavigationError": "Цвет ошибки в мини-приложении навигации по меткам редактора.", "editorMarkerNavigationWarning": "Цвет предупреждения в мини-приложении навигации по меткам редактора.", + "editorMarkerNavigationInfo": "Цвет информационного сообщения в мини-приложении навигации по меткам редактора.", "editorMarkerNavigationBackground": "Фон мини-приложения навигации по меткам редактора." } \ No newline at end of file diff --git a/i18n/rus/src/vs/platform/actions/electron-browser/menusExtensionPoint.i18n.json b/i18n/rus/src/vs/platform/actions/electron-browser/menusExtensionPoint.i18n.json index 6b77834c391..b8216927851 100644 --- a/i18n/rus/src/vs/platform/actions/electron-browser/menusExtensionPoint.i18n.json +++ b/i18n/rus/src/vs/platform/actions/electron-browser/menusExtensionPoint.i18n.json @@ -13,12 +13,14 @@ "vscode.extension.contributes.menuItem.group": "Группа, к которой принадлежит эта команда", "vscode.extension.contributes.menus": "Добавляет элементы меню в редактор", "menus.commandPalette": "Палитра команд", + "menus.touchBar": "Сенсорная панель (только для macOS)", "menus.editorTitle": "Главное меню редактора", "menus.editorContext": "Контекстное меню редактора", "menus.explorerContext": "Контекстное меню проводника", "menus.editorTabContext": "Контекстное меню вкладок редактора", "menus.debugCallstackContext": "Контекстное меню стека вызовов при отладке", "menus.scmTitle": "Меню заголовков для системы управления версиями", + "menus.scmSourceControl": "Меню \"Система управления версиями\"", "menus.resourceGroupContext": "Контекстное меню группы ресурсов для системы управления версиями", "menus.resourceStateContext": "Контекстное меню состояния ресурсов для системы управления версиями", "view.viewTitle": "Меню заголовка для окна участников", diff --git a/i18n/rus/src/vs/platform/environment/node/argv.i18n.json b/i18n/rus/src/vs/platform/environment/node/argv.i18n.json index b078834959a..eb6770aa30b 100644 --- a/i18n/rus/src/vs/platform/environment/node/argv.i18n.json +++ b/i18n/rus/src/vs/platform/environment/node/argv.i18n.json @@ -15,6 +15,7 @@ "reuseWindow": "Принудительно открыть файл или папку в последнем активном окне.", "userDataDir": "Указывает каталог, в котором хранятся данные пользователей, используется в случае выполнения от имени привилегированного пользователя.", "verbose": "Печать подробного вывода (подразумевает использование параметра \"--wait\").", + "wait": "Дождаться закрытия файлов перед возвратом.", "extensionHomePath": "Задайте корневой путь для расширений.", "listExtensions": "Перечислить существующие расширения.", "showVersions": "Показать версии установленных расширений при указании параметра --list-extension.", diff --git a/i18n/rus/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json b/i18n/rus/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json index 0e8a5193ce9..16024062ff7 100644 --- a/i18n/rus/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json +++ b/i18n/rus/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json @@ -6,6 +6,7 @@ { "invalidManifest": "Недопустимое расширение: package.json не является файлом JSON.", "restartCodeLocal": "Перезапустите код перед переустановкой {0}.", + "restartCodeGallery": "Перезапустите Code перед повторной установкой.", "uninstallDependeciesConfirmation": "Вы хотите удалить \"{0}\" отдельно или вместе с зависимостями?", "uninstallOnly": "Только", "uninstallAll": "Все", diff --git a/i18n/rus/src/vs/platform/extensions/common/extensionsRegistry.i18n.json b/i18n/rus/src/vs/platform/extensions/common/extensionsRegistry.i18n.json index fc0e79cc260..c5f432f019c 100644 --- a/i18n/rus/src/vs/platform/extensions/common/extensionsRegistry.i18n.json +++ b/i18n/rus/src/vs/platform/extensions/common/extensionsRegistry.i18n.json @@ -16,6 +16,7 @@ "vscode.extension.activationEvents": "События активации для расширения кода VS Code.", "vscode.extension.activationEvents.onLanguage": "Событие активации выдается каждый раз, когда открывается файл, который разрешается к указанному языку.", "vscode.extension.activationEvents.onCommand": "Событие активации выдается каждый раз при вызове указанной команды.", + "vscode.extension.activationEvents.onDebug": "Событие активации выдается каждый раз, когда пользователь запускает отладку или собирается установить конфигурацию отладки.", "vscode.extension.activationEvents.workspaceContains": "Событие активации выдается каждый раз при открытии папки, содержащей по крайней мере один файл, который соответствует указанной стандартной маске.", "vscode.extension.activationEvents.onView": "Событие активации выдается каждый раз при развертывании указанного окна.", "vscode.extension.activationEvents.star": "Событие активации выдается при запуске VS Code. Для удобства пользователя используйте это событие в своем расширении только в том случае, если другие сочетания событий не подходят.", diff --git a/i18n/rus/src/vs/platform/theme/common/colorExtensionPoint.i18n.json b/i18n/rus/src/vs/platform/theme/common/colorExtensionPoint.i18n.json index 88665d47b93..651ebfe5a8d 100644 --- a/i18n/rus/src/vs/platform/theme/common/colorExtensionPoint.i18n.json +++ b/i18n/rus/src/vs/platform/theme/common/colorExtensionPoint.i18n.json @@ -13,6 +13,8 @@ "contributes.defaults.highContrast": "Цвет по умолчанию для тем с высоким контрастом. Укажите значение цвета в шестнадцатеричном формате (#RRGGBB[AA]) или идентификатор цвета темы.", "invalid.colorConfiguration": "'configuration.colors' должен быть массивом", "invalid.default.colorType": "{0} должен представлять собой значение цвета в шестнадцатеричном формате (#RRGGBB[AA] или #RGB[A]) или идентификатор цвета темы.", + "invalid.id": "Параметр 'configuration.colors.id' должен быть указан и не может быть пустым", "invalid.id.format": "Параметр 'configuration.colors.id' должен следовать за word[.word]*", + "invalid.description": "Параметр 'configuration.colors.description' должен быть указан и не может быть пустым", "invalid.defaults": "'configuration.colors.defaults' может быть указан и может содержать значения 'light', 'dark' и 'highContrast'" } \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json b/i18n/rus/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json index 1ad62d4bc9b..56be368eede 100644 --- a/i18n/rus/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json +++ b/i18n/rus/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json @@ -13,5 +13,7 @@ "vscode.extension.contributes.views": "Добавляет представления в редактор", "views.explorer": "Представление проводника", "views.debug": "Представление отладки", - "locationId.invalid": "\"{0}\" не является допустимым расположением представления" + "locationId.invalid": "\"{0}\" не является допустимым расположением представления", + "duplicateView1": "Не удается зарегистрировать несколько представлений с одинаковым идентификатором '{0}' в расположении '{1}'", + "duplicateView2": "Представление с идентификатором '{0}' уже зарегистрировано в расположении '{1}'" } \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/browser/actions/workspaceActions.i18n.json b/i18n/rus/src/vs/workbench/browser/actions/workspaceActions.i18n.json index b82df283bae..3dc67610b94 100644 --- a/i18n/rus/src/vs/workbench/browser/actions/workspaceActions.i18n.json +++ b/i18n/rus/src/vs/workbench/browser/actions/workspaceActions.i18n.json @@ -17,5 +17,6 @@ "save": "Сохранить", "saveWorkspace": "Сохранить рабочую область", "openWorkspaceAction": "Открыть рабочую область...", - "openWorkspaceConfigFile": "Открыть файл конфигурации рабочей области" + "openWorkspaceConfigFile": "Открыть файл конфигурации рабочей области", + "workspaceFolderPickerPlaceholder": "Выберите папку рабочей области" } \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/browser/parts/activitybar/activitybarActions.i18n.json b/i18n/rus/src/vs/workbench/browser/parts/activitybar/activitybarActions.i18n.json index d24ed6f5d96..8339670f4f7 100644 --- a/i18n/rus/src/vs/workbench/browser/parts/activitybar/activitybarActions.i18n.json +++ b/i18n/rus/src/vs/workbench/browser/parts/activitybar/activitybarActions.i18n.json @@ -6,6 +6,7 @@ { "badgeTitle": "{0} - {1}", "titleKeybinding": "{0} ({1})", + "removeFromActivityBar": "Скрыть с панели действий", "keepInActivityBar": "Хранить в панели действий", "additionalViews": "Дополнительные представления", "numberBadge": "{0} ({1})", diff --git a/i18n/rus/src/vs/workbench/browser/parts/editor/editorActions.i18n.json b/i18n/rus/src/vs/workbench/browser/parts/editor/editorActions.i18n.json index 393b1e55fe5..86a745f5204 100644 --- a/i18n/rus/src/vs/workbench/browser/parts/editor/editorActions.i18n.json +++ b/i18n/rus/src/vs/workbench/browser/parts/editor/editorActions.i18n.json @@ -35,6 +35,7 @@ "openPreviousEditorInGroup": "Открыть предыдущий редактор в группе", "navigateNext": "Далее", "navigatePrevious": "Назад", + "navigateLast": "Перейти к последнему", "reopenClosedEditor": "Открыть закрытый редактор", "clearRecentFiles": "Очистить недавно открытые", "showEditorsInFirstGroup": "Показать редакторы в первой группе", diff --git a/i18n/rus/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json b/i18n/rus/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json index 3b9f50c195a..c38e7f9a12a 100644 --- a/i18n/rus/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json +++ b/i18n/rus/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json @@ -11,6 +11,7 @@ "endOfLineLineFeed": "LF", "endOfLineCarriageReturnLineFeed": "CRLF", "tabFocusModeEnabled": "Клавиша TAB перемещает фокус", + "screenReaderDetected": "Средство чтения с экрана оптимизировано", "screenReaderDetectedExtra": "Если вы не используете средство чтения с экрана, измените значение параметра \"editor.accessibilitySupport\" на \"off\".", "disableTabMode": "Отключить режим специальных возможностей", "gotoLine": "Перейти к строке", @@ -47,6 +48,10 @@ "guessedEncoding": "Предположение на основе содержимого", "pickEncodingForReopen": "Выберите кодировку файла для его повторного открытия", "pickEncodingForSave": "Выберите кодировку файла для его сохранения", + "screenReaderDetectedExplanation.title": "Средство чтения с экрана оптимизировано", + "screenReaderDetectedExplanation.question": "Вы используете средство чтения с экрана в VS Code?", "screenReaderDetectedExplanation.answerYes": "Да", - "screenReaderDetectedExplanation.answerNo": "Нет" + "screenReaderDetectedExplanation.answerNo": "Нет", + "screenReaderDetectedExplanation.body1": "Теперь среда VS Code оптимизирована для средства чтения с экрана.", + "screenReaderDetectedExplanation.body2": "Некоторые функции редактора (например, перенос слов, сворачивание, автоматическая вставка закрывающих скобок и т.д.) будут работать по-другому." } \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/browser/parts/views/viewsRegistry.i18n.json b/i18n/rus/src/vs/workbench/browser/parts/views/viewsRegistry.i18n.json index 8b6ad71cd4e..2feabab41e5 100644 --- a/i18n/rus/src/vs/workbench/browser/parts/views/viewsRegistry.i18n.json +++ b/i18n/rus/src/vs/workbench/browser/parts/views/viewsRegistry.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "duplicateId": "Представление с идентификатором '{0}' уже зарегистрировано в расположении '{1}'" +} \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/electron-browser/actions.i18n.json b/i18n/rus/src/vs/workbench/electron-browser/actions.i18n.json index cb0068c301a..be259940bc0 100644 --- a/i18n/rus/src/vs/workbench/electron-browser/actions.i18n.json +++ b/i18n/rus/src/vs/workbench/electron-browser/actions.i18n.json @@ -42,5 +42,10 @@ "navigateUp": "Перейти к представлению вверху", "navigateDown": "Перейти к представлению внизу", "increaseViewSize": "Увеличить размер текущего представления", - "decreaseViewSize": "Уменьшить размер текущего представления" + "decreaseViewSize": "Уменьшить размер текущего представления", + "showPreviousTab": "Показать предыдущую вкладку в окне", + "showNextWindowTab": "Показать следующую вкладку в окне", + "moveWindowTabToNewWindow": "Переместить вкладку окна в новое окно", + "mergeAllWindowTabs": "Объединить все окна", + "toggleWindowTabsBar": "Переключить панель вкладок окна" } \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/electron-browser/main.contribution.i18n.json b/i18n/rus/src/vs/workbench/electron-browser/main.contribution.i18n.json index e0e8cd01de8..1de29e6dd0e 100644 --- a/i18n/rus/src/vs/workbench/electron-browser/main.contribution.i18n.json +++ b/i18n/rus/src/vs/workbench/electron-browser/main.contribution.i18n.json @@ -10,8 +10,14 @@ "workspaces": "Рабочие области", "developer": "Разработчик", "showEditorTabs": "Определяет, должны ли открытые редакторы отображаться на вкладках или нет.", + "workbench.editor.labelFormat.default": "Отображать имя файла. Если вкладки включены и в одной группе есть два файла с одинаковыми именами, будут добавлены различающиеся части пути к каждому из этих файлов. Если вкладки отключены, то для активного редактора отображается путь по отношению к корневому каталогу рабочей области.", + "workbench.editor.labelFormat.short": "Отображать имя файла и имя каталога.", + "workbench.editor.labelFormat.medium": "Отображать имя файла и путь к файлу относительно корневого каталога рабочей области.", + "workbench.editor.labelFormat.long": "Отображать имя файла и абсолютный путь.", + "tabDescription": "Определяет формат метки редактора. Изменив этот параметр, можно сделать более наглядным расположение файла:\n- короткий формат: 'parent'\n- средний формат: 'workspace/src/parent'\n- длинный формат: '/home/user/workspace/src/parent'\n- по умолчанию: '.../parent', если другая вкладка имеет такой же заголовок или относительный путь к рабочей области, если вкладки отключены", "editorTabCloseButton": "Определяет положение кнопок закрытия вкладок редактора или отключает их, если задано значение off.", "showIcons": "Определяет, должны ли открытые редакторы отображаться со значком. Требует включить тему значков.", + "enablePreview": "Определяет, отображаются ли открытые редакторы в режиме предварительного просмотра. Редакторы в режиме предварительного просмотра можно использовать, пока они открыты (например, с помощью двойного щелчка мыши или изменения). Текст в таких редакторах отображается курсивом.", "enablePreviewFromQuickOpen": "Определяет, отображаются ли редакторы из Quick Open в режиме предварительного просмотра. Редакторы в режиме предварительного просмотра повторно используются до сохранения (например, с помощью двойного щелчка или изменения).", "editorOpenPositioning": "Определяет место открытия редакторов. Выберите \"Слева\" или \"Справа\", чтобы открывать редакторы слева или справа от активного сейчас редактора. Выберите \"Первый\" или \"Последний\", чтобы открывать редакторы независимо от активного сейчас редактора.", "revealIfOpen": "Определяет, отображается ли редактор в какой-либо из видимых групп при открытии. Если функция отключена, редактор открывается в текущей активной группе редакторов. Если функция включена, вместо открытия уже открытый редактор будет отображен в текущей активной группе редакторов. Обратите внимание, что в некоторых случаях этот параметр игнорируется, например при принудительном открытии редактора в определенной группе или сбоку от текущей активной группы редакторов.", diff --git a/i18n/rus/src/vs/workbench/parts/codeEditor/electron-browser/languageConfiguration/languageConfigurationExtensionPoint.i18n.json b/i18n/rus/src/vs/workbench/parts/codeEditor/electron-browser/languageConfiguration/languageConfigurationExtensionPoint.i18n.json index 177e66e9e73..b42f22c8880 100644 --- a/i18n/rus/src/vs/workbench/parts/codeEditor/electron-browser/languageConfiguration/languageConfigurationExtensionPoint.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/codeEditor/electron-browser/languageConfiguration/languageConfigurationExtensionPoint.i18n.json @@ -36,5 +36,10 @@ "schema.indentationRules.unIndentedLinePattern": "Если строка соответствует шаблону, то отступ для этой строки не следует изменять и проверять на соответствие другим правилам.", "schema.indentationRules.unIndentedLinePattern.pattern": "Шаблон регулярного выражения для unIndentedLinePattern.", "schema.indentationRules.unIndentedLinePattern.flags": "Флаги регулярного выражения для unIndentedLinePattern.", - "schema.indentationRules.unIndentedLinePattern.errorMessage": "Должно соответствовать шаблону \"/^([gimuy]+)$/\"." + "schema.indentationRules.unIndentedLinePattern.errorMessage": "Должно соответствовать шаблону \"/^([gimuy]+)$/\".", + "schema.folding": "Параметры сворачивания языка.", + "schema.folding.offSide": "Язык придерживается правила отступов, если блоки в этом языке определяются отступами. Если этот параметр установлен, пустые строки будут принадлежать последующему блоку.", + "schema.folding.markers": "Метки свертывания для конкретного языка, например, '#region' и '#endregion'. Регулярные выражения начала и окончания будут применены к содержимому всех строк. Их следует тщательно продумать.", + "schema.folding.markers.start": "Шаблон регулярного выражения для метки начала. Регулярное выражение должно начинаться с '^'.", + "schema.folding.markers.end": "Шаблон регулярного выражения для метки окончания. Регулярное выражение должно начинаться с '^'. " } \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/parts/debug/electron-browser/debugService.i18n.json b/i18n/rus/src/vs/workbench/parts/debug/electron-browser/debugService.i18n.json index ee52447b162..3333c4ffeb2 100644 --- a/i18n/rus/src/vs/workbench/parts/debug/electron-browser/debugService.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/debug/electron-browser/debugService.i18n.json @@ -12,6 +12,8 @@ "breakpointRemoved": "Удалена точка останова: строка {0}, файл {1}", "compoundMustHaveConfigurations": "Для составного элемента должен быть задан атрибут configurations для запуска нескольких конфигураций.", "configMissing": "Конфигурация \"{0}\" отсутствует в launch.json.", + "debugRequestNotSupported": "В выбранной конфигурации отладки указано неподдерживаемое значение атрибута '{0}': '{1}'.", + "debugRequesMissing": "В выбранной конфигурации отладки отсутствует атрибут '{0}'.", "debugTypeNotSupported": "Настроенный тип отладки \"{0}\" не поддерживается.", "debugTypeMissing": "Отсутствует свойство \"type\" для выбранной конфигурации запуска.", "preLaunchTaskErrors": "При выполнении предварительной задачи \"{0}\" обнаружены ошибки.", diff --git a/i18n/rus/src/vs/workbench/parts/extensions/browser/extensionEditor.i18n.json b/i18n/rus/src/vs/workbench/parts/extensions/browser/extensionEditor.i18n.json index b56949c4101..00a5bd00b41 100644 --- a/i18n/rus/src/vs/workbench/parts/extensions/browser/extensionEditor.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/extensions/browser/extensionEditor.i18n.json @@ -29,6 +29,13 @@ "view id": "Идентификатор", "view name": "Имя", "view location": "Где", + "colorThemes": "Цветовые темы ({0})", + "iconThemes": "Темы значков ({0})", + "colors": "Цвета ({0})", + "colorId": "Идентификатор", + "defaultDark": "Темная по умолчанию", + "defaultLight": "Светлая по умолчанию", + "defaultHC": "С высоким контрастом по умолчанию", "JSON Validation": "Проверка JSON ({0})", "commands": "Команды ({0})", "command name": "Имя", diff --git a/i18n/rus/src/vs/workbench/parts/extensions/browser/extensionsActions.i18n.json b/i18n/rus/src/vs/workbench/parts/extensions/browser/extensionsActions.i18n.json index 6c4879d3c3f..9f7ebdfbc58 100644 --- a/i18n/rus/src/vs/workbench/parts/extensions/browser/extensionsActions.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/extensions/browser/extensionsActions.i18n.json @@ -53,6 +53,7 @@ "showAzureExtensionsShort": "Расширения Azure", "OpenExtensionsFile.failed": "Не удается создать файл \"extensions.json\" в папке \".vscode\" ({0}).", "configureWorkspaceRecommendedExtensions": "Настроить рекомендуемые расширения (рабочая область)", + "configureWorkspaceFolderRecommendedExtensions": "Настроить рекомендуемые расширения (папка рабочей области)", "builtin": "Встроенное", "disableAll": "Отключить все установленные расширения", "disableAllWorkspace": "Отключить все установленные расширения для этой рабочей области", diff --git a/i18n/rus/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json b/i18n/rus/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json index 1034adcf6b0..150e4832ad9 100644 --- a/i18n/rus/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json @@ -5,10 +5,12 @@ // Do not edit this file. It is machine generated. { "reallyRecommended2": "Для этого типа файлов рекомендуется использовать расширение '{0}'.", + "reallyRecommendedExtensionPack": "Для этого типа файлов рекомендуется использовать пакет расширений '{0}'.", "showRecommendations": "Показать рекомендации", "neverShowAgain": "Больше не показывать", "close": "Закрыть", "workspaceRecommended": "Эта рабочая область включает рекомендации по расширениям.", + "ignoreExtensionRecommendations": "Вы действительно хотите проигнорировать все рекомендации по расширениям?", "ignoreAll": "Да, игнорировать все", "no": "Нет", "cancel": "Отмена" diff --git a/i18n/rus/src/vs/workbench/parts/files/browser/files.contribution.i18n.json b/i18n/rus/src/vs/workbench/parts/files/browser/files.contribution.i18n.json index a46c73f42cc..7f5602d1266 100644 --- a/i18n/rus/src/vs/workbench/parts/files/browser/files.contribution.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/files/browser/files.contribution.i18n.json @@ -10,12 +10,16 @@ "textFileEditor": "Редактор текстовых файлов", "binaryFileEditor": "Редактор двоичных файлов", "filesConfigurationTitle": "Файлы", + "exclude": "Настройте стандартные маски для исключения файлов и папок. Этот параметр влияет, например, на скрытые и отображаемые файлы в проводнике.", "files.exclude.boolean": "Стандартная маска, соответствующая путям к файлам. Задайте значение true или false, чтобы включить или отключить маску.", "files.exclude.when": "Дополнительная проверка элементов того же уровня соответствующего файла. Используйте $(basename) в качестве переменной для соответствующего имени файла.", "associations": "Настройте сопоставления файлов с языками (например, \"*.extension\": \"html\"). У них будет приоритет перед заданными по умолчанию сопоставлениями установленных языков.", + "encoding": "Кодировка по умолчанию, используемая при чтении и записи файлов. Этот параметр также можно настроить для отдельных языков.", + "autoGuessEncoding": "Если этот параметр установлен, то при открытии файла будет предпринята попытка определить кодировку символов. Этот параметр также можно настроить для отдельных языков.", "eol": "Символ конца строки по умолчанию. Используйте \\n для LF и \\r\\n для CRLF.", "trimTrailingWhitespace": "Если этот параметр включен, при сохранении файла будут удалены концевые пробелы.", "insertFinalNewline": "Если этот параметр включен, при сохранении файла в его конец вставляется финальная новая строка.", + "trimFinalNewlines": "Если этот параметр установлен, то при сохранении файла будут удалены все новые строки за последней новой строкой в конце файла.", "files.autoSave.off": "\"Грязный\" файл не сохраняется автоматически.", "files.autoSave.afterDelay": "\"Грязный\" файл автоматически сохраняется по истечении срока \"files.autoSaveDelay\".", "files.autoSave.onFocusChange": "\"Грязный\" файл автоматически сохраняется при потере фокуса редактором.", diff --git a/i18n/rus/src/vs/workbench/parts/files/common/dirtyFilesTracker.i18n.json b/i18n/rus/src/vs/workbench/parts/files/common/dirtyFilesTracker.i18n.json index 83ec78cab1e..b2007310ead 100644 --- a/i18n/rus/src/vs/workbench/parts/files/common/dirtyFilesTracker.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/files/common/dirtyFilesTracker.i18n.json @@ -4,5 +4,6 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { + "dirtyFile": "1 несохраненный файл", "dirtyFiles": "Несохраненных файлов: {0}" } \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/parts/scm/electron-browser/scmViewlet.i18n.json b/i18n/rus/src/vs/workbench/parts/scm/electron-browser/scmViewlet.i18n.json index 8aaaf54a7a2..d61548e8be2 100644 --- a/i18n/rus/src/vs/workbench/parts/scm/electron-browser/scmViewlet.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/scm/electron-browser/scmViewlet.i18n.json @@ -4,8 +4,11 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { + "scm providers": "Поставщики систем управления версиями", + "hideRepository": "Скрыть", "commitMessage": "Message (press {0} to commit)", "installAdditionalSCMProviders": "Установить дополнительных поставщиков SCM...", + "no open repo": "Отсутствуют активные поставщики систем управления версиями.", "source control": "Система управления версиями", "viewletTitle": "{0}: {1}" } \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/parts/snippets/electron-browser/insertSnippet.i18n.json b/i18n/rus/src/vs/workbench/parts/snippets/electron-browser/insertSnippet.i18n.json index 8c220bbce30..9c6c8d802ca 100644 --- a/i18n/rus/src/vs/workbench/parts/snippets/electron-browser/insertSnippet.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/snippets/electron-browser/insertSnippet.i18n.json @@ -4,5 +4,7 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "snippet.suggestions.label": "Вставить фрагмент кода" + "snippet.suggestions.label": "Вставить фрагмент кода", + "sep.userSnippet": "Фрагменты кода пользователя", + "sep.extSnippet": "Фрагменты кода расширения" } \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/parts/snippets/electron-browser/snippetsService.i18n.json b/i18n/rus/src/vs/workbench/parts/snippets/electron-browser/snippetsService.i18n.json index 7d6c740e5bc..8f0ce17a110 100644 --- a/i18n/rus/src/vs/workbench/parts/snippets/electron-browser/snippetsService.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/snippets/electron-browser/snippetsService.i18n.json @@ -10,6 +10,7 @@ "vscode.extension.contributes.snippets": "Добавляет фрагменты.", "vscode.extension.contributes.snippets-language": "Идентификатор языка, для которого добавляется этот фрагмент.", "vscode.extension.contributes.snippets-path": "Путь к файлу фрагментов. Путь указывается относительно папки расширения и обычно начинается с \"./snippets/\".", + "badFile": "Не удалось прочитать файл фрагмента \"{0}\".", "badVariableUse": "Похоже, во фрагменте \"{0}\" перепутаны переменные и заполнители. Дополнительные сведения см. на странице https://code.visualstudio.com/docs/editor/userdefinedsnippets#_snippet-syntax.", "source.snippet": "Фрагмент кода пользователя", "detail.snippet": "{0} ({1})", diff --git a/i18n/rus/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json b/i18n/rus/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json index 56cb2f5fe56..6e4e63c216e 100644 --- a/i18n/rus/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json @@ -13,11 +13,13 @@ "manyMarkers": "99+", "runningTasks": "Показать выполняемые задачи", "tasks": "Задачи", + "TaskSystem.noHotSwap": "Чтобы изменить подсистему выполнения задач, в которой запущена активная задача, необходимо перезагрузить окно", "TaskService.noBuildTask1": "Задача сборки не определена. Отметьте задачу с помощью \"isBuildCommand\" в файле tasks.json.", "TaskService.noBuildTask2": "Задача сборки не определена. Отметьте задачу с помощью группы 'build' в файле tasks.json.", "TaskService.noTestTask1": "Задача теста не определена. Отметьте задачу с помощью \"isTestCommand\" в файле tasks.json.", "TaskService.noTestTask2": "Задача теста не определена. Отметьте задачу с помощью группы 'test' в файле tasks.json.", "TaskServer.noTask": "Запрошенная задача {0} для выполнения не найдена.", + "TaskService.associate": "связать", "TaskService.attachProblemMatcher.continueWithout": "Продолжить без проверки выходных данных задачи", "TaskService.attachProblemMatcher.never": "Никогда не проверять выходные данные задачи", "TaskService.attachProblemMatcher.learnMoreAbout": "Дополнительные сведения о проверке выходных данных задачи", @@ -29,6 +31,7 @@ "TaskSystem.active": "Уже выполняется задача. Завершите ее, прежде чем выполнять другую задачу.", "TaskSystem.restartFailed": "Не удалось завершить и перезапустить задачу {0}", "TaskSystem.configurationErrors": "Ошибка: в конфигурации указанной задачи при проверке были выявлены ошибки, и ее невозможно использовать. Сначала устраните ошибки.", + "taskService.ignoreingFolder": "Конфигурации задач для папки рабочей области {0} будут проигнорированы. Для задач рабочей области с несколькими папками необходимо, чтобы во всех папках использовалась версия задачи 2.0.0\n", "TaskSystem.invalidTaskJson": "Ошибка: в содержимом файла tasks.json есть синтаксические ошибки. Исправьте их, прежде чем выполнять задачу.\n", "TaskSystem.runningTask": "Имеется выполняющаяся задача. Завершить ее?", "TaskSystem.terminateTask": "&&Завершить задачу", @@ -40,20 +43,33 @@ "recentlyUsed": "недавно использованные задачи", "configured": "настроенные задачи", "detected": "обнаруженные задачи", + "TaskService.ignoredFolder": "Следующие папки рабочей области будут проигнорированы, так как в них используется версия задач 0.1.0:", "TaskService.notAgain": "Больше не показывать", "TaskService.ok": "ОК", + "TaskService.pickRunTask": "Выберите задачу для запуска", + "TaslService.noEntryToRun": "Задача для запуска не найдена. Настройте задачи...", "TaskService.fetchingBuildTasks": "Получение задач сборки...", "TaskService.pickBuildTask": "Выберите задачу сборки для запуска", + "TaskService.noBuildTask": "Задача сборки не найдена. Настройте задачи... ", "TaskService.fetchingTestTasks": "Получение задач тестирования...", "TaskService.pickTestTask": "Выберите задачу тестирования для запуска", + "TaskService.noTestTaskTerminal": "Тестовая задача для запуска не найдена. Настройте задачи...", "TaskService.tastToTerminate": "Выберите задачи для завершения", + "TaskService.noTaskRunning": "Ни одной задачи не запущено", "TerminateAction.noProcess": "Запущенный процесс больше не существует. Если задача породила фоновые задачи, выход из Visual Studio Code может привести к появлению потерянных процессов.", "TerminateAction.failed": "Не удалось завершить запущенную задачу", "TaskService.tastToRestart": "Выберите задачу для перезапуска", + "TaskService.noTaskToRestart": "Задачи для перезапуска не найдены", + "TaskService.template": "Выберите шаблон задачи", + "TaskService.createJsonFile": "Создать файл tasks.json из шаблона", + "TaskService.openJsonFile": "Открыть файл tasks.json", + "TaskService.pickTask": "Выберите задачу для настройки", + "TaskService.defaultBuildTaskExists": "Задача {0} уже помечена как задача сборки по умолчанию", "TaskService.pickDefaultBuildTask": "Выберите задачу, которая будет использоваться в качестве задачи сборки по умолчанию.", "TaskService.defaultTestTaskExists": "{0} уже помечена как задача сборки по умолчанию. ", "TaskService.pickDefaultTestTask": "Выберите задачу, которая будет использоваться в качестве задачи тестирования по умолчанию. ", "TaskService.pickShowTask": "Выберите задачу, выходные данные для которой нужно отобразить", + "TaskService.noTaskIsRunning": "Ни одной задачи не запущено", "ShowLogAction.label": "Показать журнал задач", "RunTaskAction.label": "Выполнить задачу", "RestartTaskAction.label": "Перезапустить запущенную задачу", diff --git a/i18n/rus/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.i18n.json b/i18n/rus/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.i18n.json index 922550c51cb..05102c96f17 100644 --- a/i18n/rus/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.i18n.json @@ -5,6 +5,7 @@ // Do not edit this file. It is machine generated. { "TerminalTaskSystem.unknownError": "При выполнении задачи произошла неизвестная ошибка. Подробности см. в журнале выходных данных задач.", + "dependencyFailed": "Не удалось разрешить зависимую задачу '{0}' в папке рабочей области '{1}'", "TerminalTaskSystem.terminalName": "Задача — {0}", "reuseTerminal": "Терминал будет повторно использоваться задачами. Чтобы закрыть его, нажмите любую клавишу.", "TerminalTaskSystem": "Невозможно выполнить команду оболочки на диске UNC.", diff --git a/i18n/rus/src/vs/workbench/parts/tasks/node/taskConfiguration.i18n.json b/i18n/rus/src/vs/workbench/parts/tasks/node/taskConfiguration.i18n.json index 3360204c259..a317034d2a3 100644 --- a/i18n/rus/src/vs/workbench/parts/tasks/node/taskConfiguration.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/tasks/node/taskConfiguration.i18n.json @@ -12,6 +12,7 @@ "ConfigurationParser.invalidVaraibleReference": "Ошибка: недопустимая ссылка на problemMatcher: {0}\n", "ConfigurationParser.noTaskType": "Ошибка: в конфигурации задач должно присутствовать свойство типа. Конфигурация будет проигнорирована.\n{0}\n", "ConfigurationParser.noTypeDefinition": "Ошибка: тип задачи '{0}' не зарегистрирован. Возможно, вы не установили расширение, которое предоставляет соответствующий поставщик задач.", + "ConfigurationParser.missingRequiredProperty": "Ошибка: в конфигурации задачи '{0}' отсутствует необходимое свойство '{1}'. Конфигурация задачи будет проигнорирована.", "ConfigurationParser.notCustom": "Ошибка: задачи не объявлены в качестве пользовательской задачи. Конфигурация будет проигнорирована.\n{0}\n", "ConfigurationParser.noTaskName": "Ошибка: задачи должны предоставлять свойство taskName. Задача будет проигнорирована.\n{0}\n", "taskConfiguration.shellArgs": "Предупреждение: задача \"{0}\" является командой оболочки, и имя команды или одного из ее аргументов включает пробелы без escape-последовательности. Чтобы обеспечить правильную расстановку кавычек в командной строке, объедините аргументы в команде.", diff --git a/i18n/rus/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json b/i18n/rus/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json index 3b888b1a880..05cb39eed74 100644 --- a/i18n/rus/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json @@ -38,5 +38,6 @@ "workbench.action.terminal.focusFindWidget": "Выделить мини-приложение поиска", "workbench.action.terminal.hideFindWidget": "Скрыть мини-приложение поиска", "nextTerminalFindTerm": "Показать следующий найденный термин", - "previousTerminalFindTerm": "Показать предыдущий найденный термин" + "previousTerminalFindTerm": "Показать предыдущий найденный термин", + "quickOpenTerm": "Переключить активный терминал" } \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/parts/terminal/electron-browser/terminalColorRegistry.i18n.json b/i18n/rus/src/vs/workbench/parts/terminal/electron-browser/terminalColorRegistry.i18n.json index 3a2688c515c..fc208588fb0 100644 --- a/i18n/rus/src/vs/workbench/parts/terminal/electron-browser/terminalColorRegistry.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/terminal/electron-browser/terminalColorRegistry.i18n.json @@ -8,5 +8,6 @@ "terminal.foreground": "Цвет переднего плана терминала.", "terminalCursor.foreground": "Цвет переднего плана курсора терминала.", "terminalCursor.background": "Цвет фона курсора терминала. Позволяет выбрать цвет символа, который перекрывается блочным курсором.", + "terminal.selectionBackground": "Цвет фона выделения терминала.", "terminal.ansiColor": "Цвет ANSI \"{0}\" в терминале." } \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json b/i18n/rus/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json index a9a867d8cd5..0a038573db2 100644 --- a/i18n/rus/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json @@ -10,6 +10,7 @@ "welcomePage.newFile": "Создать файл", "welcomePage.openFolder": "Открыть папку...", "welcomePage.cloneGitRepository": "Клонировать репозиторий Git...", + "welcomePage.addWorkspaceFolder": "Добавить папку в рабочую область...", "welcomePage.recent": "Последние", "welcomePage.moreRecent": "Дополнительные сведения...", "welcomePage.noRecentFolders": "Нет последних папок.", diff --git a/i18n/rus/src/vs/workbench/services/configuration/node/configuration.i18n.json b/i18n/rus/src/vs/workbench/services/configuration/node/configuration.i18n.json index ba1ed604879..8915524eb9b 100644 --- a/i18n/rus/src/vs/workbench/services/configuration/node/configuration.i18n.json +++ b/i18n/rus/src/vs/workbench/services/configuration/node/configuration.i18n.json @@ -13,6 +13,12 @@ "invalid.title": "configuration.title должно быть строкой", "vscode.extension.contributes.defaultConfiguration": "Предоставляет параметры конфигурации редактора по умолчанию в соответствии с языком.", "invalid.properties": "configuration.properties должно быть объектом", + "invalid.allOf": "Параметр 'configuration.allOf' является устаревшим, и использовать его не рекомендуется. Вместо этого передайте несколько параметров в виде массива в точку вклада 'configuration'.", + "workspaceConfig.folders.description": "Список папок, которые будут загружены в рабочую область.", "workspaceConfig.path.description": "Путь к файлу, например, \"/root/folderA\" или \"./folderA\" для пути по отношению к файлу рабочей области.", - "workspaceConfig.settings.description": "Параметры рабочей области" + "workspaceConfig.name.description": "Необязательное имя папки.", + "workspaceConfig.uri.description": "URI папки", + "workspaceConfig.settings.description": "Параметры рабочей области", + "workspaceConfig.extensions.description": "Расширения рабочей области", + "unknownWorkspaceProperty": "Неизвестное свойство рабочей области" } \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json b/i18n/rus/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json index 2408ba056f8..6d87ae00932 100644 --- a/i18n/rus/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json +++ b/i18n/rus/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json @@ -4,13 +4,26 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { + "openTasksConfiguration": "Открыть конфигурацию задач", + "openLaunchConfiguration": "Открыть конфигурацию запуска", "close": "Закрыть", "open": "Открыть параметры", + "saveAndRetry": "Сохранить и повторить", "errorUnknownKey": "Не удалось записать в {0}, так как {1} не является зарегистрированной конфигурацией.", "errorInvalidFolderConfiguration": "Не удается изменить параметры папок, так как {0} не поддерживает область ресурсов папок. ", "errorInvalidUserTarget": "Не удается изменить параметры пользователей, так как {0} не поддерживает глобальную область.", "errorInvalidFolderTarget": "Не удается изменить параметры папок, так как ресурс не указан.", "errorNoWorkspaceOpened": "Не удается записать в {0}, так как не открыта ни одна рабочая область. Откройте рабочую область и повторите попытку.", + "errorInvalidTaskConfiguration": "Не удается выполнить запись в файл задач. Откройте файл **Tasks**, исправьте ошибки и предупреждения и повторите попытку.", + "errorInvalidLaunchConfiguration": "Не удается выполнить запись в файл запуска. Откройте файл **Launch**, исправьте ошибки и предупреждения и повторите попытку. ", + "errorInvalidConfiguration": "Не удается выполнить запись в файл параметров пользователя. Откройте файл **User Settings**, исправьте ошибки и предупреждения и повторите попытку. ", + "errorInvalidConfigurationWorkspace": "Не удается выполнить запись в файл параметров рабочей области. Откройте файл **Workspace Settings**, исправьте ошибки и предупреждения и повторите попытку. ", + "errorInvalidConfigurationFolder": "Не удается выполнить запись в файл параметров папок. Откройте файл **Folder Settings** в папке **{0}**, исправьте ошибки и предупреждения и повторите попытку. ", + "errorTasksConfigurationFileDirty": "Не удается выполнить запись параметров в файл задач, так как файл был изменен. Сохраните файл **Tasks Configuration** и повторите попытку.", + "errorLaunchConfigurationFileDirty": "Не удается выполнить запись в файл запуска, так как файл был изменен. Сохраните файл **Launch Configuration** и повторите попытку.", + "errorConfigurationFileDirty": "Не удается записать параметры пользователя, так как файл был изменен. Сохраните файл **User Settings** и повторите попытку.", + "errorConfigurationFileDirtyWorkspace": "Не удается записать параметры рабочей области, так как файл был изменен. Сохраните файл **Workspace Settings** и повторите попытку. ", + "errorConfigurationFileDirtyFolder": "Не удается записать параметры папок, так как файл был изменен. Сохраните файл **Folder Settings** в папке **{0}** и повторите попытку. ", "userTarget": "Параметры пользователя", "workspaceTarget": "Параметры рабочей области", "folderTarget": "Параметры папок" diff --git a/i18n/rus/src/vs/workbench/services/files/node/fileService.i18n.json b/i18n/rus/src/vs/workbench/services/files/node/fileService.i18n.json index 975e12c9b23..6e032cd3874 100644 --- a/i18n/rus/src/vs/workbench/services/files/node/fileService.i18n.json +++ b/i18n/rus/src/vs/workbench/services/files/node/fileService.i18n.json @@ -5,10 +5,12 @@ // Do not edit this file. It is machine generated. { "fileInvalidPath": "Недопустимый ресурс файла ({0})", + "fileIsDirectoryError": "Файл является каталогом", "fileNotModifiedError": "undefined", "fileTooLargeError": "Не удается открыть файл, так как он имеет слишком большой размер", "fileBinaryError": "Похоже, файл является двоичным, и его нельзя открыть как текстовый.", "fileNotFoundError": "Файл не найден ({0})", + "fileExists": "Создаваемый файл уже существует ({0})", "fileMoveConflict": "Невозможно переместить или скопировать файл, так как он уже существует в папке назначения.", "unableToMoveCopyError": "Невозможно переместить или скопировать файл, так как он заменил бы папку, в которой содержится.", "foldersCopyError": "Папки нельзя копировать в рабочую область. Выберите отдельные файлы, чтобы скопировать их.", diff --git a/i18n/trk/src/vs/platform/actions/electron-browser/menusExtensionPoint.i18n.json b/i18n/trk/src/vs/platform/actions/electron-browser/menusExtensionPoint.i18n.json index cd79d1e6d7c..5ddafd4b6b9 100644 --- a/i18n/trk/src/vs/platform/actions/electron-browser/menusExtensionPoint.i18n.json +++ b/i18n/trk/src/vs/platform/actions/electron-browser/menusExtensionPoint.i18n.json @@ -20,6 +20,7 @@ "menus.editorTabContext": "Düzenleyici sekmeleri bağlam menüsü", "menus.debugCallstackContext": "Hata ayıklama çağrı yığını bağlam menüsü", "menus.scmTitle": "Kaynak Denetimi başlık menüsü", + "menus.scmSourceControl": "Kaynak Denetimi menüsü", "menus.resourceGroupContext": "Kaynak Denetimi kaynak grubu bağlam menüsü", "menus.resourceStateContext": "Kaynak Denetimi kaynak durumu bağlam menüsü", "view.viewTitle": "Katkıda bulunan görünümü başlık menüsü", diff --git a/i18n/trk/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json b/i18n/trk/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json index b6cde91a3db..e786294f130 100644 --- a/i18n/trk/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json +++ b/i18n/trk/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json @@ -14,6 +14,6 @@ "views.explorer": "Gezgin Görünümü", "views.debug": "Hata Ayıklama Görünümü", "locationId.invalid": "`{0}` geçerli bir görünüm konumu değil", - "duplicateView1": "{1} konumunda aynı {0} kimliğine sahip birden çok görünüm kaydedilemiyor", - "duplicateView2": "Bir görünüm {1} konumunda zaten {0} olarak kayıtlı" + "duplicateView1": "`{1}` konumunda aynı `{0}` kimliğine sahip birden çok görünüm kaydedilemiyor", + "duplicateView2": "`{0}` kimliğine sahip bir görünüm `{1}` konumunda zaten kayıtlı" } \ No newline at end of file diff --git a/i18n/trk/src/vs/workbench/browser/parts/views/viewsRegistry.i18n.json b/i18n/trk/src/vs/workbench/browser/parts/views/viewsRegistry.i18n.json index 056b4f0a42c..d412455fd99 100644 --- a/i18n/trk/src/vs/workbench/browser/parts/views/viewsRegistry.i18n.json +++ b/i18n/trk/src/vs/workbench/browser/parts/views/viewsRegistry.i18n.json @@ -4,5 +4,5 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "duplicateId": "Bir görünüm ${1} konumunda zaten {0} olarak kayıtlı" + "duplicateId": "`{0}` kimliğine sahip bir görünüm `{1}` konumunda zaten kayıtlı" } \ No newline at end of file diff --git a/i18n/trk/src/vs/workbench/parts/debug/electron-browser/debugService.i18n.json b/i18n/trk/src/vs/workbench/parts/debug/electron-browser/debugService.i18n.json index 48c31c797e6..25a3a60a2ae 100644 --- a/i18n/trk/src/vs/workbench/parts/debug/electron-browser/debugService.i18n.json +++ b/i18n/trk/src/vs/workbench/parts/debug/electron-browser/debugService.i18n.json @@ -12,8 +12,8 @@ "breakpointRemoved": "Kesme noktası kaldırıldı, {0}. satır, {1} dosyası", "compoundMustHaveConfigurations": "Bileşik, birden çok yapılandırmayı başlatmak için \"configurations\" özniteliği bulundurmalıdır.", "configMissing": "'launch.json' dosyasında '{0}' yapılandırması eksik.", - "debugRequestNotSupported": "Yapılandırılan hata ayıklama isteği '{0}' desteklenmiyor.", - "debugRequesMissing": "Hata ayıklama isteği, seçilen başlatma yapılandırılmasında eksik", + "debugRequestNotSupported": "Seçilen hata ayıklama yapılandırması desteklenmeyen öznitelik değeri `{0}` içeriyor: '{1}'.", + "debugRequesMissing": "'{0}' özniteliği seçilen hata ayıklama yapılandırılmasında eksik.", "debugTypeNotSupported": "Yapılandırılan hata ayıklama türü '{0}', desteklenmiyor.", "debugTypeMissing": "Seçilen başlatma yapılandırması için 'type' özelliği eksik.", "preLaunchTaskErrors": "'{0}' ön başlatma görevi sırasında derleme hataları algılandı.", diff --git a/i18n/trk/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json b/i18n/trk/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json index 640d11588c6..278618bcfd8 100644 --- a/i18n/trk/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json +++ b/i18n/trk/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json @@ -5,6 +5,7 @@ // Do not edit this file. It is machine generated. { "reallyRecommended2": "'{0}' eklentisi bu dosya türü için tavsiye edilir.", + "reallyRecommendedExtensionPack": "'{0}' eklenti paketi bu dosya türü için tavsiye edilir.", "showRecommendations": "Tavsiyeleri Göster", "neverShowAgain": "Tekrar gösterme", "close": "Kapat", From 5cc20c4130422bbc37569952c0f88e6f9398184f Mon Sep 17 00:00:00 2001 From: Daniel Ye Date: Wed, 4 Oct 2017 08:38:30 -0700 Subject: [PATCH 031/158] 2017-10-04. Merged in translations from Transifex. --- i18n/deu/extensions/css/package.i18n.json | 3 +++ i18n/deu/extensions/grunt/out/main.i18n.json | 4 +++- i18n/deu/extensions/gulp/out/main.i18n.json | 4 +++- i18n/deu/extensions/jake/out/main.i18n.json | 4 +++- .../extensions/markdown/out/extension.i18n.json | 3 ++- .../src/vs/code/electron-main/menus.i18n.json | 2 ++ .../src/vs/code/electron-main/windows.i18n.json | 2 ++ .../menusExtensionPoint.i18n.json | 1 + .../api/browser/viewsExtensionPoint.i18n.json | 4 +++- .../browser/actions/workspaceActions.i18n.json | 3 ++- .../browser/parts/editor/editorActions.i18n.json | 1 + .../browser/parts/editor/editorStatus.i18n.json | 7 ++++++- .../browser/parts/views/viewsRegistry.i18n.json | 4 +++- .../workbench/electron-browser/actions.i18n.json | 6 +++++- .../electron-browser/main.contribution.i18n.json | 5 +++++ ...languageConfigurationExtensionPoint.i18n.json | 7 ++++++- .../electron-browser/debugService.i18n.json | 2 ++ .../extensions/browser/extensionEditor.i18n.json | 7 +++++++ .../browser/extensionsActions.i18n.json | 1 + .../extensionTipsService.i18n.json | 2 ++ .../files/browser/files.contribution.i18n.json | 4 ++++ .../files/common/dirtyFilesTracker.i18n.json | 1 + .../scm/electron-browser/scmViewlet.i18n.json | 3 +++ .../electron-browser/insertSnippet.i18n.json | 4 +++- .../electron-browser/snippetsService.i18n.json | 1 + .../electron-browser/task.contribution.i18n.json | 16 ++++++++++++++++ .../terminalTaskSystem.i18n.json | 1 + .../parts/tasks/node/taskConfiguration.i18n.json | 1 + .../electron-browser/terminalActions.i18n.json | 3 ++- .../terminalColorRegistry.i18n.json | 1 + .../vs_code_welcome_page.i18n.json | 1 + .../configuration/node/configuration.i18n.json | 8 +++++++- .../node/configurationEditingService.i18n.json | 13 +++++++++++++ .../services/files/node/fileService.i18n.json | 1 + .../browser/parts/editor/editorStatus.i18n.json | 5 ++++- .../browser/parts/views/viewsRegistry.i18n.json | 4 +++- .../electron-browser/main.contribution.i18n.json | 2 ++ .../electron-browser/debugService.i18n.json | 2 ++ .../extensionTipsService.i18n.json | 2 ++ .../files/browser/files.contribution.i18n.json | 1 + .../electron-browser/task.contribution.i18n.json | 2 ++ .../node/configurationEditingService.i18n.json | 11 +++++++++++ 42 files changed, 144 insertions(+), 15 deletions(-) diff --git a/i18n/deu/extensions/css/package.i18n.json b/i18n/deu/extensions/css/package.i18n.json index 991fb95bca2..2fd30b43e1f 100644 --- a/i18n/deu/extensions/css/package.i18n.json +++ b/i18n/deu/extensions/css/package.i18n.json @@ -4,6 +4,7 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { + "css.title": "CSS", "css.lint.argumentsInColorFunction.desc": "Ungültige Parameteranzahl.", "css.lint.boxModel.desc": "Verwenden Sie width oder height nicht beim Festlegen von padding oder border", "css.lint.compatibleVendorPrefixes.desc": "Stellen Sie beim Verwenden vom anbieterspezifischen Präfix sicher, dass alle anderen anbieterspezifischen Eigenschaften miteinbezogen werden", @@ -25,6 +26,7 @@ "css.trace.server.desc": "Verfolgt die Kommunikation zwischen VS Code und dem CSS-Sprachserver.", "css.validate.title": "Steuert die CSS-Validierung und Problemschweregrade.", "css.validate.desc": "Aktiviert oder deaktiviert alle Überprüfungen.", + "less.title": "LESS", "less.lint.argumentsInColorFunction.desc": "Ungültige Parameteranzahl.", "less.lint.boxModel.desc": "Verwenden Sie width oder height nicht beim Festlegen von padding oder border", "less.lint.compatibleVendorPrefixes.desc": "Stellen Sie beim Verwenden vom anbieterspezifischen Präfix sicher, dass alle anderen anbieterspezifischen Eigenschaften miteinbezogen werden", @@ -45,6 +47,7 @@ "less.lint.zeroUnits.desc": "Keine Einheit für Null erforderlich", "less.validate.title": "Steuert die LESS-Validierung und Problemschweregrade.", "less.validate.desc": "Aktiviert oder deaktiviert alle Überprüfungen.", + "scss.title": "SCSS (SASS)", "scss.lint.argumentsInColorFunction.desc": "Ungültige Parameteranzahl.", "scss.lint.boxModel.desc": "Verwenden Sie width oder height nicht beim Festlegen von padding oder border", "scss.lint.compatibleVendorPrefixes.desc": "Stellen Sie beim Verwenden vom anbieterspezifischen Präfix sicher, dass alle anderen anbieterspezifischen Eigenschaften miteinbezogen werden", diff --git a/i18n/deu/extensions/grunt/out/main.i18n.json b/i18n/deu/extensions/grunt/out/main.i18n.json index 8b6ad71cd4e..47bed6eef41 100644 --- a/i18n/deu/extensions/grunt/out/main.i18n.json +++ b/i18n/deu/extensions/grunt/out/main.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "execFailed": "Fehler bei der automatischen Grunt-Erkennung für den Ordner {0}. Fehlermeldung: {1}" +} \ No newline at end of file diff --git a/i18n/deu/extensions/gulp/out/main.i18n.json b/i18n/deu/extensions/gulp/out/main.i18n.json index 8b6ad71cd4e..7d146a15f94 100644 --- a/i18n/deu/extensions/gulp/out/main.i18n.json +++ b/i18n/deu/extensions/gulp/out/main.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "execFailed": "Fehler bei der automatischen Gulp-Erkennung für den Ordner {0}. Fehlermeldung: {1}" +} \ No newline at end of file diff --git a/i18n/deu/extensions/jake/out/main.i18n.json b/i18n/deu/extensions/jake/out/main.i18n.json index 8b6ad71cd4e..48ad4462aeb 100644 --- a/i18n/deu/extensions/jake/out/main.i18n.json +++ b/i18n/deu/extensions/jake/out/main.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "execFailed": "Fehler bei der automatischen Jake-Erkennung für den Ordner {0}. Fehlermeldung: {1}" +} \ No newline at end of file diff --git a/i18n/deu/extensions/markdown/out/extension.i18n.json b/i18n/deu/extensions/markdown/out/extension.i18n.json index 490139dcf55..9c9948137e9 100644 --- a/i18n/deu/extensions/markdown/out/extension.i18n.json +++ b/i18n/deu/extensions/markdown/out/extension.i18n.json @@ -4,5 +4,6 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "onPreviewStyleLoadError": "'markdown.styles' konnte nicht geladen werden: {0}" + "onPreviewStyleLoadError": "'markdown.styles' konnte nicht geladen werden: {0}", + "previewTitle": "Vorschau von {0}" } \ No newline at end of file diff --git a/i18n/deu/src/vs/code/electron-main/menus.i18n.json b/i18n/deu/src/vs/code/electron-main/menus.i18n.json index 49cfdddcd5d..26bf3d1e020 100644 --- a/i18n/deu/src/vs/code/electron-main/menus.i18n.json +++ b/i18n/deu/src/vs/code/electron-main/menus.i18n.json @@ -175,6 +175,8 @@ "miRunningTask": "Aktive Auf&&gaben anzeigen...", "miRestartTask": "Aktuell&&e Aufgabe neu starten...", "miTerminateTask": "&&Aufgabe beenden...", + "miConfigureTask": "Aufgaben &&konfigurieren...", + "miConfigureBuildTask": "Standardbuildaufgabe kon&&figurieren...", "accessibilityOptionsWindowTitle": "Optionen für erleichterte Bedienung", "miRestartToUpdate": "Zum Aktualisieren neu starten...", "miCheckingForUpdates": "Überprüfen auf Updates...", diff --git a/i18n/deu/src/vs/code/electron-main/windows.i18n.json b/i18n/deu/src/vs/code/electron-main/windows.i18n.json index 79397671383..6b7b1900ae4 100644 --- a/i18n/deu/src/vs/code/electron-main/windows.i18n.json +++ b/i18n/deu/src/vs/code/electron-main/windows.i18n.json @@ -17,6 +17,8 @@ "open": "Öffnen", "openFolder": "Ordner öffnen", "openFile": "Datei öffnen", + "workspaceOpenedMessage": "Der Arbeitsbereich \"{0}\" kann nicht gespeichert werden.", + "workspaceOpenedDetail": "Der Arbeitsbereich ist bereits in einem anderen Fenster geöffnet. Schließen Sie zuerst das andere Fenster, und versuchen Sie anschließend noch mal.", "openWorkspace": "&&Öffnen", "openWorkspaceTitle": "Arbeitsbereich öffnen", "save": "&&Speichern", diff --git a/i18n/deu/src/vs/platform/actions/electron-browser/menusExtensionPoint.i18n.json b/i18n/deu/src/vs/platform/actions/electron-browser/menusExtensionPoint.i18n.json index bd80f226684..5cd50df300a 100644 --- a/i18n/deu/src/vs/platform/actions/electron-browser/menusExtensionPoint.i18n.json +++ b/i18n/deu/src/vs/platform/actions/electron-browser/menusExtensionPoint.i18n.json @@ -20,6 +20,7 @@ "menus.editorTabContext": "Das Kontextmenü für die Editor-Registerkarten", "menus.debugCallstackContext": "Das Kontextmenü für den Debug-Callstack", "menus.scmTitle": "Das Titelmenü der Quellcodeverwaltung", + "menus.scmSourceControl": "Das Menü \"Quellcodeverwaltung\"", "menus.resourceGroupContext": "Das Ressourcengruppen-Kontextmenü der Quellcodeverwaltung", "menus.resourceStateContext": "Das Ressourcenstatus-Kontextmenü der Quellcodeverwaltung", "view.viewTitle": "Das beigetragene Editor-Titelmenü.", diff --git a/i18n/deu/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json b/i18n/deu/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json index 79702d24961..fecc67b154d 100644 --- a/i18n/deu/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json +++ b/i18n/deu/src/vs/workbench/api/browser/viewsExtensionPoint.i18n.json @@ -13,5 +13,7 @@ "vscode.extension.contributes.views": "Trägt Ansichten zum Editor bei.", "views.explorer": "Explorer-Ansicht", "views.debug": "Debugansicht", - "locationId.invalid": "{0}\" ist kein gültiger Ansichtenspeicherort" + "locationId.invalid": "{0}\" ist kein gültiger Ansichtenspeicherort", + "duplicateView1": "Mehrere Ansichten können nicht mit derselben ID \"{0}\" am Speicherort \"{1}\" registriert werden.", + "duplicateView2": "Eine Ansicht mit der ID \"{0}\" ist am Speicherort \"{1}\" bereits registriert." } \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/browser/actions/workspaceActions.i18n.json b/i18n/deu/src/vs/workbench/browser/actions/workspaceActions.i18n.json index 13a7e15f206..d630b8be8f2 100644 --- a/i18n/deu/src/vs/workbench/browser/actions/workspaceActions.i18n.json +++ b/i18n/deu/src/vs/workbench/browser/actions/workspaceActions.i18n.json @@ -17,5 +17,6 @@ "save": "&&Speichern", "saveWorkspace": "Arbeitsbereich speichern", "openWorkspaceAction": "Arbeitsbereich öffnen...", - "openWorkspaceConfigFile": "Konfigurationsdatei des Arbeitsbereichs öffnen" + "openWorkspaceConfigFile": "Konfigurationsdatei des Arbeitsbereichs öffnen", + "workspaceFolderPickerPlaceholder": "Arbeitsbereichsordner auswählen" } \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/browser/parts/editor/editorActions.i18n.json b/i18n/deu/src/vs/workbench/browser/parts/editor/editorActions.i18n.json index 16d380370f6..842738eb092 100644 --- a/i18n/deu/src/vs/workbench/browser/parts/editor/editorActions.i18n.json +++ b/i18n/deu/src/vs/workbench/browser/parts/editor/editorActions.i18n.json @@ -35,6 +35,7 @@ "openPreviousEditorInGroup": "Vorherigen Editor in der Gruppe öffnen", "navigateNext": "Weiter", "navigatePrevious": "Zurück", + "navigateLast": "Zum Ende gehen", "reopenClosedEditor": "Geschlossenen Editor erneut öffnen", "clearRecentFiles": "Zuletzt geöffnete löschen", "showEditorsInFirstGroup": "Editoren in erster Gruppe anzeigen", diff --git a/i18n/deu/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json b/i18n/deu/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json index f18a0fe0687..fb5b37b0028 100644 --- a/i18n/deu/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json +++ b/i18n/deu/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json @@ -11,6 +11,7 @@ "endOfLineLineFeed": "LF", "endOfLineCarriageReturnLineFeed": "CRLF", "tabFocusModeEnabled": "TAB-TASTE verschiebt Fokus", + "screenReaderDetected": "Für Sprachausgabe optimiert", "screenReaderDetectedExtra": "Wenn Sie keine Sprachausgabe verwenden, ändern Sie die Einstellung \"editor.accessibilitySupport\" in \"Aus\".", "disableTabMode": "Barrierefreiheitsmodus deaktivieren", "gotoLine": "Gehe zu Zeile", @@ -47,6 +48,10 @@ "guessedEncoding": "Vom Inhalt abgeleitet", "pickEncodingForReopen": "Dateicodierung zum erneuten Öffnen der Datei auswählen", "pickEncodingForSave": "Dateicodierung auswählen, mit der gespeichert werden soll", + "screenReaderDetectedExplanation.title": "Für Sprachausgabe optimiert", + "screenReaderDetectedExplanation.question": "Verwenden Sie eine Sprachausgabe zum Bedienen von VS Code?", "screenReaderDetectedExplanation.answerYes": "Ja", - "screenReaderDetectedExplanation.answerNo": "Nein" + "screenReaderDetectedExplanation.answerNo": "Nein", + "screenReaderDetectedExplanation.body1": "VS Code ist jetzt für die Verwendung mit einer Sprachausgabe optimiert. ", + "screenReaderDetectedExplanation.body2": "Einige Editorfunktionen weisen ein anderes Verhalten auf, z. B. in Bezug auf den Zeilenumbruch, Faltung, automatisches Schließen von Klammern usw." } \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/browser/parts/views/viewsRegistry.i18n.json b/i18n/deu/src/vs/workbench/browser/parts/views/viewsRegistry.i18n.json index 8b6ad71cd4e..a36d97eb0e0 100644 --- a/i18n/deu/src/vs/workbench/browser/parts/views/viewsRegistry.i18n.json +++ b/i18n/deu/src/vs/workbench/browser/parts/views/viewsRegistry.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "duplicateId": "Eine Ansicht mit der ID \"{0}\" ist am Speicherort \"{1}\" bereits registriert." +} \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/electron-browser/actions.i18n.json b/i18n/deu/src/vs/workbench/electron-browser/actions.i18n.json index 93902d627de..bff17f6154d 100644 --- a/i18n/deu/src/vs/workbench/electron-browser/actions.i18n.json +++ b/i18n/deu/src/vs/workbench/electron-browser/actions.i18n.json @@ -43,5 +43,9 @@ "navigateDown": "Zur Ansicht darunter navigieren", "increaseViewSize": "Aktuelle Ansicht vergrößern", "decreaseViewSize": "Aktuelle Ansicht verkleinern", - "mergeAllWindowTabs": "Alle Fenster zusammenführen" + "showPreviousTab": "Vorherige Fensterregisterkarte anzeigen", + "showNextWindowTab": "Nächste Fensterregisterkarte anzeigen", + "moveWindowTabToNewWindow": "Fensterregisterkarte in neues Fenster verschieben", + "mergeAllWindowTabs": "Alle Fenster zusammenführen", + "toggleWindowTabsBar": "Fensterregisterkarten-Leiste umschalten" } \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/electron-browser/main.contribution.i18n.json b/i18n/deu/src/vs/workbench/electron-browser/main.contribution.i18n.json index 748f3e96e32..ac447a68175 100644 --- a/i18n/deu/src/vs/workbench/electron-browser/main.contribution.i18n.json +++ b/i18n/deu/src/vs/workbench/electron-browser/main.contribution.i18n.json @@ -10,9 +10,14 @@ "workspaces": "Arbeitsbereiche", "developer": "Entwickler", "showEditorTabs": "Steuert, ob geöffnete Editoren auf Registerkarten angezeigt werden sollen.", + "workbench.editor.labelFormat.default": "Zeigt den Namen der Datei an. Wenn Registerkarten aktiviert sind und zwei Dateien den gleichen Namen in einer Gruppe haben, werden die besonderen Abschnitte des Pfads jeder Datei hinzugefügt. Wenn Registerkarten deaktiviert sind, wird der Pfad zum Arbeitsbereich-Stammverzeichnis angezeigt, wenn der Editor aktiv ist.", "workbench.editor.labelFormat.short": "Den Namen der Datei anzeigen, gefolgt von dessen Verzeichnisnamen.", + "workbench.editor.labelFormat.medium": "Zeigt den Namen der Datei an, gefolgt vom Pfad zum Arbeitsbereich-Stammverzeichnis.", + "workbench.editor.labelFormat.long": "Zeigt den Namen der Datei an, gefolgt von ihrem absoluten Pfad.", + "tabDescription": "Steuert das Format der Beschriftung für einen Editor. Wenn Sie diese Einstellung ändern, ist beispielsweise der Speicherort einer Datei besser ersichtlich:\n- kurz: \"parent\"\n- mittel: \"workspace/src/parent\"\n- lang: \"/home/user/workspace/src/parent\"\n- Standard: \".../parent\", wenn eine andere Registerkarte denselben Titel hat, oder den relativen Arbeitsbereichspfad, wenn Registerkarten deaktiviert sind.", "editorTabCloseButton": "Steuert die Position der Schließen-Schaltflächen der Editor-Registerkarten oder deaktiviert sie bei der Einstellung \"off\".", "showIcons": "Steuert, ob geöffnete Editoren mit einem Symbol angezeigt werden sollen. Hierzu muss auch ein Symboldesign aktiviert werden.", + "enablePreview": "Steuert, ob geöffnete Editoren als Vorschau angezeigt werden. Vorschau-Editoren werden wiederverwendet, bis sie gespeichert werden (z. B. über Doppelklicken oder Bearbeiten), und sie werden mit kursivem Schriftschnitt angezeigt.", "enablePreviewFromQuickOpen": "Steuert, ob geöffnete Editoren aus Quick Open als Vorschau angezeigt werden. Vorschau-Editoren werden wiederverwendet, bis sie gespeichert werden (z. B. über Doppelklicken oder Bearbeiten).", "editorOpenPositioning": "Steuert, wo Editoren geöffnet werden. Wählen Sie \"Links\" oder \"Rechts\" aus, um Editoren links oder rechts vom aktuellen aktiven Editor zu öffnen. Wählen Sie \"Erster\" oder \"Letzter\" aus, um Editoren unabhängig vom aktuell aktiven Editor zu öffnen.", "revealIfOpen": "Steuert, ob ein geöffneter Editor in einer der sichtbaren Gruppen angezeigt wird. Ist diese Option deaktiviert, wird ein Editor vorzugsweise in der aktuell aktiven Editorgruppe geöffnet. Ist diese Option aktiviert, wird ein bereits geöffneter Editor angezeigt und nicht in der aktuell aktiven Editorgruppe erneut geöffnet. In einigen Fällen wird diese Einstellung ignoriert, z. B. wenn das Öffnen eines Editors in einer bestimmten Gruppe oder neben der aktuell aktiven Gruppe erzwungen wird.", diff --git a/i18n/deu/src/vs/workbench/parts/codeEditor/electron-browser/languageConfiguration/languageConfigurationExtensionPoint.i18n.json b/i18n/deu/src/vs/workbench/parts/codeEditor/electron-browser/languageConfiguration/languageConfigurationExtensionPoint.i18n.json index 51de9385764..3deaa385b55 100644 --- a/i18n/deu/src/vs/workbench/parts/codeEditor/electron-browser/languageConfiguration/languageConfigurationExtensionPoint.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/codeEditor/electron-browser/languageConfiguration/languageConfigurationExtensionPoint.i18n.json @@ -36,5 +36,10 @@ "schema.indentationRules.unIndentedLinePattern": "Wenn eine Zeile diesem Muster entspricht, sollte ihr Einzug nicht geändert und die Zeile nicht mit den anderen Regeln ausgewertet werden.", "schema.indentationRules.unIndentedLinePattern.pattern": "Das RegExp-Muster für unIndentedLinePattern.", "schema.indentationRules.unIndentedLinePattern.flags": "Die RegExp-Flags für unIndentedLinePattern.", - "schema.indentationRules.unIndentedLinePattern.errorMessage": "Muss mit dem Muster `/^([gimuy]+)$/` übereinstimmen." + "schema.indentationRules.unIndentedLinePattern.errorMessage": "Muss mit dem Muster `/^([gimuy]+)$/` übereinstimmen.", + "schema.folding": "Die Faltungseinstellungen der Sprache.", + "schema.folding.offSide": "Für eine Sprache gilt die Abseitsregel, wenn Blöcke in dieser Sprache durch die Einrücktiefe ausgedrückt werden. Wenn dies festgelegt ist, gehören leere Zeilen zum nächsten Block.", + "schema.folding.markers": "Sprachspezifische Faltungsmarkierungen wie \"#region\" und \"#endregion\". Die regulären Anfangs- und Endausdrücke werden im Hinblick auf den Inhalt aller Zeilen getestet und müssen effizient erstellt werden.", + "schema.folding.markers.start": "Das RegExp-Muster für die Startmarkierung. Das Regexp muss mit \"^\" beginnen.", + "schema.folding.markers.end": "Das RegExp-Muster für die Endmarkierung. Das Regexp muss mit \"^\" beginnen." } \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/debug/electron-browser/debugService.i18n.json b/i18n/deu/src/vs/workbench/parts/debug/electron-browser/debugService.i18n.json index 4588894202a..85809743b85 100644 --- a/i18n/deu/src/vs/workbench/parts/debug/electron-browser/debugService.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/debug/electron-browser/debugService.i18n.json @@ -12,6 +12,8 @@ "breakpointRemoved": "Der Haltepunkt wurde entfernt. Zeile {0}, Datei \"{1}\".", "compoundMustHaveConfigurations": "Für den Verbund muss das Attribut \"configurations\" festgelegt werden, damit mehrere Konfigurationen gestartet werden können.", "configMissing": "Konfiguration \"{0}\" fehlt in \"launch.json\".", + "debugRequestNotSupported": "Die ausgewählte Debugkonfiguration verfügt über einen nicht unterstützten Attributwert \"{0}\": \"{1}\".", + "debugRequesMissing": "Das Attribut \"{0}\" fehlt in der ausgewählten Debugkonfiguration.", "debugTypeNotSupported": "Der konfigurierte Debugtyp \"{0}\" wird nicht unterstützt.", "debugTypeMissing": "Fehlende Eigenschaft \"type\" für die ausgewählte Startkonfiguration.", "preLaunchTaskErrors": "Buildfehler während preLaunchTask \"{0}\".", diff --git a/i18n/deu/src/vs/workbench/parts/extensions/browser/extensionEditor.i18n.json b/i18n/deu/src/vs/workbench/parts/extensions/browser/extensionEditor.i18n.json index b8500949209..2d51a131a66 100644 --- a/i18n/deu/src/vs/workbench/parts/extensions/browser/extensionEditor.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/extensions/browser/extensionEditor.i18n.json @@ -29,6 +29,13 @@ "view id": "ID", "view name": "Name", "view location": "Wo", + "colorThemes": "Farbdesigns ({0})", + "iconThemes": "Symboldesigns ({0})", + "colors": "Farben ({0})", + "colorId": "ID", + "defaultDark": "Standard, dunkel", + "defaultLight": "Standard, hell", + "defaultHC": "Standard, hoher Kontrast", "JSON Validation": "JSON-Validierung ({0})", "commands": "Befehle ({0})", "command name": "Name", diff --git a/i18n/deu/src/vs/workbench/parts/extensions/browser/extensionsActions.i18n.json b/i18n/deu/src/vs/workbench/parts/extensions/browser/extensionsActions.i18n.json index 9285fd4e2a9..cf3c69c8cbe 100644 --- a/i18n/deu/src/vs/workbench/parts/extensions/browser/extensionsActions.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/extensions/browser/extensionsActions.i18n.json @@ -53,6 +53,7 @@ "showAzureExtensionsShort": "Azure-Erweiterungen", "OpenExtensionsFile.failed": "Die Datei \"extensions.json\" kann nicht im Ordner \".vscode\" erstellt werden ({0}).", "configureWorkspaceRecommendedExtensions": "Empfohlene Erweiterungen konfigurieren (Arbeitsbereich)", + "configureWorkspaceFolderRecommendedExtensions": "Empfohlene Erweiterungen konfigurieren (Arbeitsbereichsordner)", "builtin": "Integriert", "disableAll": "Alle installierten Erweiterungen löschen", "disableAllWorkspace": "Alle installierten Erweiterungen für diesen Arbeitsbereich deaktivieren", diff --git a/i18n/deu/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json b/i18n/deu/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json index d81c461c922..e62525ae073 100644 --- a/i18n/deu/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json @@ -5,10 +5,12 @@ // Do not edit this file. It is machine generated. { "reallyRecommended2": "Für diesen Dateityp wird die Erweiterung \"{0}\" empfohlen.", + "reallyRecommendedExtensionPack": "Für diesen Dateityp wird das Erweiterungspaket \"{0}\" empfohlen.", "showRecommendations": "Empfehlungen anzeigen", "neverShowAgain": "Nicht mehr anzeigen", "close": "Schließen", "workspaceRecommended": "Für diesen Arbeitsbereich sind Erweiterungsempfehlungen verfügbar.", + "ignoreExtensionRecommendations": "Möchten Sie alle Erweiterungsempfehlungen ignorieren?", "ignoreAll": "Ja, alles ignorieren", "no": "Nein", "cancel": "Abbrechen" diff --git a/i18n/deu/src/vs/workbench/parts/files/browser/files.contribution.i18n.json b/i18n/deu/src/vs/workbench/parts/files/browser/files.contribution.i18n.json index f5d75b5e0f7..93f045f545a 100644 --- a/i18n/deu/src/vs/workbench/parts/files/browser/files.contribution.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/files/browser/files.contribution.i18n.json @@ -10,12 +10,16 @@ "textFileEditor": "Textdatei-Editor", "binaryFileEditor": "Binärdatei-Editor", "filesConfigurationTitle": "Dateien", + "exclude": "Konfigurieren Sie Globmuster zum Ausschließen von Dateien und Ordnern. Zum Beispiel entscheidet Explorer welche Dateien und Ordner gezeigt oder ausgeblendet werden anhand dieser Einstellung.", "files.exclude.boolean": "Das Globmuster, mit dem Dateipfade verglichen werden sollen. Legen Sie diesen Wert auf \"true\" oder \"false\" fest, um das Muster zu aktivieren bzw. zu deaktivieren.", "files.exclude.when": "Zusätzliche Überprüfung der gleichgeordneten Elemente einer entsprechenden Datei. Verwenden Sie \"$(basename)\" als Variable für den entsprechenden Dateinamen.", "associations": "Konfigurieren Sie Dateizuordnungen zu Sprachen (beispielsweise \"*.extension\": \"html\"). Diese besitzen Vorrang vor den Standardzuordnungen der installierten Sprachen.", + "encoding": "Die Standardzeichensatz-Codierung, die beim Lesen und Schreiben von Dateien verwendet werden soll. Diese Einstellung kann auch pro Sprache konfiguriert werden.", + "autoGuessEncoding": "Wenn diese Option aktiviert ist, wird beim Öffnen von Dateien versucht, die Zeichensatzcodierung automatisch zu ermitteln. Diese Einstellung kann auch pro Sprache konfiguriert werden.", "eol": "Das Zeilenende-Standardzeichen. Verwenden Sie \\n für LF und \\r\\n für CRLF.", "trimTrailingWhitespace": "Bei Aktivierung werden nachgestellte Leerzeichen beim Speichern einer Datei gekürzt.", "insertFinalNewline": "Bei Aktivierung wird beim Speichern einer Datei eine abschließende neue Zeile am Dateiende eingefügt.", + "trimFinalNewlines": "Wenn diese Option aktiviert ist, werden beim Speichern alle neuen Zeilen nach der abschließenden neuen Zeile am Dateiende gekürzt.", "files.autoSave.off": "Eine geänderte Datei wird nie automatisch gespeichert.", "files.autoSave.afterDelay": "Eine geänderte Datei wird automatisch nach der konfigurierten \"files.autoSaveDelay\" gespeichert.", "files.autoSave.onFocusChange": "Eine geänderte Datei wird automatisch gespeichert, wenn der Editor den Fokus verliert.", diff --git a/i18n/deu/src/vs/workbench/parts/files/common/dirtyFilesTracker.i18n.json b/i18n/deu/src/vs/workbench/parts/files/common/dirtyFilesTracker.i18n.json index 26ccd3a8679..efb4c5dd0f4 100644 --- a/i18n/deu/src/vs/workbench/parts/files/common/dirtyFilesTracker.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/files/common/dirtyFilesTracker.i18n.json @@ -4,5 +4,6 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { + "dirtyFile": "1 nicht gespeicherte Datei", "dirtyFiles": "{0} nicht gespeicherte Dateien" } \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/scm/electron-browser/scmViewlet.i18n.json b/i18n/deu/src/vs/workbench/parts/scm/electron-browser/scmViewlet.i18n.json index e2b7029e51b..c5c0985f4fc 100644 --- a/i18n/deu/src/vs/workbench/parts/scm/electron-browser/scmViewlet.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/scm/electron-browser/scmViewlet.i18n.json @@ -4,8 +4,11 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { + "scm providers": "Quellcodeanbieter", + "hideRepository": "Ausblenden", "commitMessage": "Message (press {0} to commit)", "installAdditionalSCMProviders": "Installiere weiter SCM Provider...", + "no open repo": "Es gibt keine aktiven Quellcodeanbieter.", "source control": "Quellcodeverwaltung", "viewletTitle": "{0}: {1}" } \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/snippets/electron-browser/insertSnippet.i18n.json b/i18n/deu/src/vs/workbench/parts/snippets/electron-browser/insertSnippet.i18n.json index 1fb6b028507..04501ed578a 100644 --- a/i18n/deu/src/vs/workbench/parts/snippets/electron-browser/insertSnippet.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/snippets/electron-browser/insertSnippet.i18n.json @@ -4,5 +4,7 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "snippet.suggestions.label": "Codeausschnitt einfügen" + "snippet.suggestions.label": "Codeausschnitt einfügen", + "sep.userSnippet": "Benutzercodeausschnitte", + "sep.extSnippet": "Erweiterungscodeausschnitte" } \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/snippets/electron-browser/snippetsService.i18n.json b/i18n/deu/src/vs/workbench/parts/snippets/electron-browser/snippetsService.i18n.json index 8dae1914450..016b1854df2 100644 --- a/i18n/deu/src/vs/workbench/parts/snippets/electron-browser/snippetsService.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/snippets/electron-browser/snippetsService.i18n.json @@ -10,6 +10,7 @@ "vscode.extension.contributes.snippets": "Trägt Codeausschnitte bei.", "vscode.extension.contributes.snippets-language": "Der Sprachbezeichner, für den dieser Codeausschnitt beigetragen wird.", "vscode.extension.contributes.snippets-path": "Der Pfad der Codeausschnittdatei. Der Pfad ist relativ zum Erweiterungsordner und beginnt normalerweise mit \". /snippets/\".", + "badFile": "Die Ausschnittsdatei \"{0}\" konnte nicht gelesen werden.", "badVariableUse": "Das \"{0}\"-Snippet verwirrt wahrscheinlich Snippet-Variablen und Snippet-Paltzhalter. Schaue https://code.visualstudio.com/docs/editor/userdefinedsnippets#_snippet-syntax für weitere Informationen.", "source.snippet": "Benutzercodeausschnitt", "detail.snippet": "{0} ({1})", diff --git a/i18n/deu/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json b/i18n/deu/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json index 42ac5818d46..5f9f1928ae6 100644 --- a/i18n/deu/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json @@ -13,11 +13,13 @@ "manyMarkers": "mehr als 99", "runningTasks": "Aktive Aufgaben anzeigen", "tasks": "Aufgaben", + "TaskSystem.noHotSwap": "Zum Ändern des Aufgabenausführungsmoduls mit einem aktiven Task muss das Fenster erneut geladen werden.", "TaskService.noBuildTask1": "Keine Buildaufgabe definiert. Markieren Sie eine Aufgabe mit 'isBuildCommand' in der tasks.json-Datei.", "TaskService.noBuildTask2": "Es ist keine Buildaufgabe definiert. Markieren Sie eine Aufgabe in der Datei \"tasks.json\" als \"Buildgruppe\". ", "TaskService.noTestTask1": "Keine Testaufgabe definiert. Markieren Sie eine Aufgabe mit 'isTestCommand' in der tasks.json-Datei.", "TaskService.noTestTask2": "Es ist keine Testaufgabe definiert. Markieren Sie eine Aufgabe in der Datei \"tasks.json\" als \"Testgruppe\". ", "TaskServer.noTask": "Die angeforderte auszuführende Aufgabe {0} wurde nicht gefunden.", + "TaskService.associate": "assoziieren", "TaskService.attachProblemMatcher.continueWithout": "Ohne Überprüfung der Aufgabenausgabe fortsetzen", "TaskService.attachProblemMatcher.never": "Aufgabenausgabe nie überprüfen", "TaskService.attachProblemMatcher.learnMoreAbout": "Weitere Informationen zur Überprüfung der Aufgabenausgabe", @@ -29,6 +31,7 @@ "TaskSystem.active": "Eine aktive Aufgabe wird bereits ausgeführt. Beenden Sie diese, bevor Sie eine andere Aufgabe ausführen.", "TaskSystem.restartFailed": "Fehler beim Beenden und Neustarten der Aufgabe \"{0}\".", "TaskSystem.configurationErrors": "Fehler: Die angegebene Aufgabenkonfiguration weist Validierungsfehler auf und kann nicht verwendet werden. Beheben Sie zuerst die Fehler.", + "taskService.ignoreingFolder": "Die Aufgabenkonfigurationen für den Arbeitsbereichsordner {0} werden ignoriert. Für die Aufgabenunterstützung von Arbeitsbereichen mit mehreren Ordner müssen alle Ordner die Aufgabenversion 2.0.0 verwenden.\n", "TaskSystem.invalidTaskJson": "Fehler: Der Inhalt der Datei \"tasks.json\" weist Syntaxfehler auf. Bitte korrigieren sie diese, bevor Sie einen Task ausführen.\n", "TaskSystem.runningTask": "Es wird ein Task ausgeführt wird. Möchten Sie ihn beenden?", "TaskSystem.terminateTask": "&&Task beenden", @@ -40,20 +43,33 @@ "recentlyUsed": "zuletzt verwendete Aufgaben", "configured": "konfigurierte Aufgaben", "detected": "erkannte Aufgaben", + "TaskService.ignoredFolder": "Die folgenden Arbeitsbereichsordner werden ignoriert, da sie Aufgabenversion 0.1.0 verwenden: ", "TaskService.notAgain": "Nicht mehr anzeigen", "TaskService.ok": "OK", + "TaskService.pickRunTask": "Auszuführende Aufgabe auswählen", + "TaslService.noEntryToRun": "Es wurde keine auszuführende Aufgabe gefunden. Aufgaben konfigurieren...", "TaskService.fetchingBuildTasks": "Buildaufgaben werden abgerufen...", "TaskService.pickBuildTask": "Auszuführende Buildaufgabe auswählen", + "TaskService.noBuildTask": "Es wurde keine auszuführende Buildaufgabe gefunden. Aufgaben konfigurieren...", "TaskService.fetchingTestTasks": "Testaufgaben werden abgerufen...", "TaskService.pickTestTask": "Auszuführende Testaufgabe auswählen", + "TaskService.noTestTaskTerminal": "Es wurde keine auszuführende Testaufgabe gefunden. Aufgaben konfigurieren...", "TaskService.tastToTerminate": "Zu beendende Aufgabe auswählen", + "TaskService.noTaskRunning": "Zurzeit wird keine Aufgabe ausgeführt.", "TerminateAction.noProcess": "Der gestartete Prozess ist nicht mehr vorhanden. Wenn der Task Hintergrundtasks erzeugt hat, kann das Beenden von VS Code ggf. zu verwaisten Prozessen führen.", "TerminateAction.failed": "Fehler beim Beenden des ausgeführten Tasks.", "TaskService.tastToRestart": "Neu zu startende Aufgabe auswählen", + "TaskService.noTaskToRestart": "Es ist keine neu zu startende Aufgabe vorhanden.", + "TaskService.template": "Aufgabenvorlage auswählen", + "TaskService.createJsonFile": "Datei \"tasks.json\" aus Vorlage erstellen", + "TaskService.openJsonFile": "Datei \"tasks.json\" öffnen", + "TaskService.pickTask": "Zu konfigurierende Aufgabe auswählen", + "TaskService.defaultBuildTaskExists": "{0} ist bereits als Standardbuildaufgabe markiert.", "TaskService.pickDefaultBuildTask": "Als Standardbuildaufgabe zu verwendende Aufgabe auswählen", "TaskService.defaultTestTaskExists": "{0} ist bereits als Standardtestaufgabe markiert.", "TaskService.pickDefaultTestTask": "Als Standardtestaufgabe zu verwendende Aufgabe auswählen", "TaskService.pickShowTask": "Aufgabe zum Anzeigen der Ausgabe auswählen", + "TaskService.noTaskIsRunning": "Es wird keine Aufgabe ausgeführt.", "ShowLogAction.label": "Taskprotokoll anzeigen", "RunTaskAction.label": "Task ausführen", "RestartTaskAction.label": "Ausgeführte Aufgabe neu starten", diff --git a/i18n/deu/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.i18n.json b/i18n/deu/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.i18n.json index 0ad146b3785..197256b0631 100644 --- a/i18n/deu/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.i18n.json @@ -5,6 +5,7 @@ // Do not edit this file. It is machine generated. { "TerminalTaskSystem.unknownError": "Unbekannter Fehler beim Ausführen eines Tasks. Details finden Sie im Taskausgabeprotokoll.", + "dependencyFailed": "Die abhängige Aufgabe \"{0}\" im Arbeitsbereichsordner \"{1}\" konnte nicht aufgelöst werden.", "TerminalTaskSystem.terminalName": "Aufgabe - {0}", "reuseTerminal": "Das Terminal wird von Aufgaben wiederverwendet, drücken Sie zum Schließen eine beliebige Taste.", "TerminalTaskSystem": "Ein Shell-Befehl kann nicht auf einem UNC-Laufwerk ausgeführt werden.", diff --git a/i18n/deu/src/vs/workbench/parts/tasks/node/taskConfiguration.i18n.json b/i18n/deu/src/vs/workbench/parts/tasks/node/taskConfiguration.i18n.json index f4454e4c78d..89dde23b864 100644 --- a/i18n/deu/src/vs/workbench/parts/tasks/node/taskConfiguration.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/tasks/node/taskConfiguration.i18n.json @@ -12,6 +12,7 @@ "ConfigurationParser.invalidVaraibleReference": "Fehler: Ungültiger ProblemMatcher-Verweis: {0}\n", "ConfigurationParser.noTaskType": "Fehler: Die Aufgabenkonfiguration muss eine type-Eigenschaft enthalten. Die Konfiguration wird ignoriert.\n{0}\n", "ConfigurationParser.noTypeDefinition": "Fehler: Der registrierte Aufgabentyp \"{0}\" ist nicht vorhanden. Wurde möglicherweise eine Erweiterung nicht installiert, die den entsprechenden Aufgabenanbieter bereitstellt?", + "ConfigurationParser.missingRequiredProperty": "Fehler: Die Aufgabenkonfiguration \"{0}\" enthält die erforderlich Eigenschaft \"{1}\" nicht. Die Aufgabenkonfiguration wird ignoriert.", "ConfigurationParser.notCustom": "Fehler: Die Aufgabe ist nicht als benutzerdefinierte Aufgabe deklariert. Die Konfiguration wird ignoriert.\n{0}\n", "ConfigurationParser.noTaskName": "Fehler: Tasks müssen eine Eigenschaft \"TaskName\" angeben. Der Task wird ignoriert.\n{0}\n", "taskConfiguration.shellArgs": "Warnung: Die Aufgabe \"{0}\" ist ein Shellbefehl, und der Befehlsname oder eines seiner Argumente enthält Leerzeichen ohne Escapezeichen. Führen Sie Argumente im Befehl zusammen, um eine korrekte Angabe der Befehlszeile sicherzustellen.", diff --git a/i18n/deu/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json b/i18n/deu/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json index 54fd0c65e90..7d62688f024 100644 --- a/i18n/deu/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json @@ -38,5 +38,6 @@ "workbench.action.terminal.focusFindWidget": "Widget zum Anzeigen der Suche mit Fokus", "workbench.action.terminal.hideFindWidget": "Widget zum Ausblenden der Suche", "nextTerminalFindTerm": "Nächsten Suchbegriff anzeigen", - "previousTerminalFindTerm": "Vorherigen Suchbegriff anzeigen" + "previousTerminalFindTerm": "Vorherigen Suchbegriff anzeigen", + "quickOpenTerm": "Aktives Terminal wechseln" } \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/terminal/electron-browser/terminalColorRegistry.i18n.json b/i18n/deu/src/vs/workbench/parts/terminal/electron-browser/terminalColorRegistry.i18n.json index e1d9d37fe1e..76d17079ae8 100644 --- a/i18n/deu/src/vs/workbench/parts/terminal/electron-browser/terminalColorRegistry.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/terminal/electron-browser/terminalColorRegistry.i18n.json @@ -8,5 +8,6 @@ "terminal.foreground": "Die Vordergrundfarbe des Terminal.", "terminalCursor.foreground": "Die Vordergrundfarbe des Terminalcursors.", "terminalCursor.background": "Die Hintergrundfarbe des Terminalcursors. Ermöglicht das Anpassen der Farbe eines Zeichens, das von einem Blockcursor überdeckt wird.", + "terminal.selectionBackground": "Die Auswahlvordergrundfarbe des Terminals.", "terminal.ansiColor": "\"{0}\": ANSI-Farbe im Terminal" } \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json b/i18n/deu/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json index 75f68335e05..ff1138d5fed 100644 --- a/i18n/deu/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json @@ -10,6 +10,7 @@ "welcomePage.newFile": "Neue Datei", "welcomePage.openFolder": "Ordner öffnen...", "welcomePage.cloneGitRepository": "Git-Repository klonen...", + "welcomePage.addWorkspaceFolder": "Arbeitsbereichsordner hinzufügen...", "welcomePage.recent": "Zuletzt verwendet", "welcomePage.moreRecent": "Weitere Informationen...", "welcomePage.noRecentFolders": "Keine kürzlich verwendeten Ordner", diff --git a/i18n/deu/src/vs/workbench/services/configuration/node/configuration.i18n.json b/i18n/deu/src/vs/workbench/services/configuration/node/configuration.i18n.json index d135d2e6051..d6a37d8334e 100644 --- a/i18n/deu/src/vs/workbench/services/configuration/node/configuration.i18n.json +++ b/i18n/deu/src/vs/workbench/services/configuration/node/configuration.i18n.json @@ -13,6 +13,12 @@ "invalid.title": "configuration.title muss eine Zeichenfolge sein.", "vscode.extension.contributes.defaultConfiguration": "Trägt zu Konfigurationeinstellungen des Standard-Editors für die jeweilige Sprache bei.", "invalid.properties": "\"configuration.properties\" muss ein Objekt sein.", + "invalid.allOf": "\"configuration.allOf\" ist veraltet und sollte nicht mehr verwendet werden. Übergeben Sie stattdessen mehrere Konfigurationsabschnitte als Array an den Beitragspunkt \"configuration\".", + "workspaceConfig.folders.description": "Liste von Ordnern, die in den Arbeitsbereich geladen werden.", "workspaceConfig.path.description": "Ein Dateipfad, z. B. \" /root/folderA\" oder \"./folderA\" bei einem relativen Pfad, der in Bezug auf den Speicherort der Arbeitsbereichsdatei aufgelöst wird.", - "workspaceConfig.settings.description": "Arbeitsbereichseinstellungen" + "workspaceConfig.name.description": "Ein optionaler Name für den Ordner.", + "workspaceConfig.uri.description": "URI des Ordners", + "workspaceConfig.settings.description": "Arbeitsbereichseinstellungen", + "workspaceConfig.extensions.description": "Arbeitsbereichserweiterungen", + "unknownWorkspaceProperty": "Unbekannte Arbeitsbereichs-Konfigurationseigenschaft" } \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json b/i18n/deu/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json index 35397426d52..2420a104c15 100644 --- a/i18n/deu/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json +++ b/i18n/deu/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json @@ -4,13 +4,26 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { + "openTasksConfiguration": "Aufgabenkonfiguration öffnen", + "openLaunchConfiguration": "Startkonfiguration öffnen", "close": "Schließen", "open": "Einstellungen öffnen", + "saveAndRetry": "Speichern und wiederholen", "errorUnknownKey": "In {0} kann nicht geschrieben werden, weil {1} keine registrierte Konfiguration ist.", "errorInvalidFolderConfiguration": "In die Ordnereinstellungen kann nicht geschrieben werden, weil {0} den Gültigkeitsbereich für Ordnerressourcen nicht unterstützt.", "errorInvalidUserTarget": "In die Benutzereinstellungen kann nicht geschrieben werden, weil {0} den globalen Gültigkeitsbereich nicht unterstützt.", "errorInvalidFolderTarget": "In die Ordnereinstellungen kann nicht geschrieben werden, weil keine Ressource angegeben ist.", "errorNoWorkspaceOpened": "In {0} kann nicht geschrieben werden, weil kein Arbeitsbereich geöffnet ist. Öffnen Sie zuerst einen Arbeitsbereich, und versuchen Sie es noch mal.", + "errorInvalidTaskConfiguration": "In die Aufgabendatei kann nicht geschrieben werden. Öffnen Sie die Datei **Aufgaben**, um Fehler/Warnungen darin zu beheben, und versuchen Sie es noch mal.", + "errorInvalidLaunchConfiguration": "In die Startdatei kann nicht geschrieben werden. Öffnen Sie die Datei **Starten**, um Fehler/Warnungen in der Datei zu beheben, und versuchen Sie es noch mal.", + "errorInvalidConfiguration": "In die Benutzereinstellungen kann nicht geschrieben werden. Öffnen Sie die Datei **Benutzereinstellungen**, um Fehler/Warnungen darin zu korrigieren, und versuchen Sie es noch mal.", + "errorInvalidConfigurationWorkspace": "In die Arbeitsbereichseinstellungen kann nicht geschrieben werden. Öffnen Sie die Datei **Arbeitsbereichseinstellungen**, um Fehler/Warnungen darin zu korrigieren, und versuchen Sie es noch mal.", + "errorInvalidConfigurationFolder": "In die Ordnereinstellungen kann nicht geschrieben werden. Öffnen Sie die Datei **Ordnereinstellungen** unter **{0}**, um Fehler/Warnungen darin zu korrigieren, und versuchen Sie es noch mal.", + "errorTasksConfigurationFileDirty": "In die Aufgabendatei kann nicht geschrieben werden, da sie geändert wurde. Speichern Sie die Datei **Aufgabenkonfiguration**, und versuchen Sie es noch mal.", + "errorLaunchConfigurationFileDirty": "In die Startdatei kann nicht geschrieben werden, da sie geändert wurde. Speichern Sie die Datei **Startkonfiguration**, und versuchen Sie es noch mal.", + "errorConfigurationFileDirty": "In die Einstellungen kann nicht geschrieben werden, da die Datei geändert wurde. Speichern Sie die Datei **Benutzereinstellungen**, und versuchen Sie es noch mal.", + "errorConfigurationFileDirtyWorkspace": "In die Arbeitsbereichseinstellungen kann nicht geschrieben werden, da die Datei geändert wurde. Speichern Sie die Datei **Arbeitsbereichseinstellungen**, und versuchen Sie es noch mal.", + "errorConfigurationFileDirtyFolder": "In die Ordnereinstellungen kann nicht geschrieben werden, da die Datei geändert wurde. Speichern Sie die Datei **Ordnereinstellungen** unter **{0}**, und versuchen Sie es noch mal.", "userTarget": "Benutzereinstellungen", "workspaceTarget": "Arbeitsbereichseinstellungen", "folderTarget": "Ordnereinstellungen" diff --git a/i18n/deu/src/vs/workbench/services/files/node/fileService.i18n.json b/i18n/deu/src/vs/workbench/services/files/node/fileService.i18n.json index 31c6c3ed3e6..82912560d86 100644 --- a/i18n/deu/src/vs/workbench/services/files/node/fileService.i18n.json +++ b/i18n/deu/src/vs/workbench/services/files/node/fileService.i18n.json @@ -10,6 +10,7 @@ "fileTooLargeError": "Die Datei ist zu groß, um sie zu öffnen.", "fileBinaryError": "Die Datei scheint eine Binärdatei zu sein und kann nicht als Text geöffnet werden.", "fileNotFoundError": "Die Datei wurde nicht gefunden ({0}).", + "fileExists": "Die zu erstellende Datei ist bereits vorhanden ({0}). ", "fileMoveConflict": "Verschieben/Kopieren kann nicht ausgeführt werden. Die Datei ist am Ziel bereits vorhanden.", "unableToMoveCopyError": "Der Verschiebe-/Kopiervorgang kann nicht ausgeführt werden. Die Datei würde den Ordner ersetzen, in dem sie enthalten ist.", "foldersCopyError": "Ordner können nicht in den Arbeitsbereich kopiert werden. Bitte wählen Sie einzelne Dateien aus, um sie zu kopieren.", diff --git a/i18n/ptb/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json b/i18n/ptb/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json index 790bb0abf97..fd2c0fd6d01 100644 --- a/i18n/ptb/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json +++ b/i18n/ptb/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json @@ -11,6 +11,7 @@ "endOfLineLineFeed": "LF", "endOfLineCarriageReturnLineFeed": "CRLF", "tabFocusModeEnabled": "Tabulação Move o Foco", + "screenReaderDetected": "Leitor de tela otimizado", "screenReaderDetectedExtra": "Se você não estiver usando um leitor de tela, por favor altere a configuração `editor.accessibilitySupport` para \"desligado\".", "disableTabMode": "Desativar o modo de acessibilidade", "gotoLine": "Ir para linha", @@ -47,8 +48,10 @@ "guessedEncoding": "Adivinhado a partir do conteúdo", "pickEncodingForReopen": "Selecione a codificaçãodo arquivo para reabrir o arquivo.", "pickEncodingForSave": "Selecione a codificação do arquivo para Salvar Com", + "screenReaderDetectedExplanation.title": "Leitor de tela otimizado", "screenReaderDetectedExplanation.question": "Você está usando um leitor de tela para operar o VS Code?", "screenReaderDetectedExplanation.answerYes": "Sim", "screenReaderDetectedExplanation.answerNo": "Não", - "screenReaderDetectedExplanation.body1": "O VS Code agora está otimizado para uso com um leitor de tela." + "screenReaderDetectedExplanation.body1": "O VS Code agora está otimizado para uso com um leitor de tela.", + "screenReaderDetectedExplanation.body2": "Alguns recursos do editor terão comportamento diferente: por exemplo, a palavra envoltura, dobradura, auto fechamento de colchetes, etc." } \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/browser/parts/views/viewsRegistry.i18n.json b/i18n/ptb/src/vs/workbench/browser/parts/views/viewsRegistry.i18n.json index 8b6ad71cd4e..b7201e3d4af 100644 --- a/i18n/ptb/src/vs/workbench/browser/parts/views/viewsRegistry.i18n.json +++ b/i18n/ptb/src/vs/workbench/browser/parts/views/viewsRegistry.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "duplicateId": "Uma exibição com id '{0}' já está registrada na localização '{1}'" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/electron-browser/main.contribution.i18n.json b/i18n/ptb/src/vs/workbench/electron-browser/main.contribution.i18n.json index b53f01cbe3b..4f521d06910 100644 --- a/i18n/ptb/src/vs/workbench/electron-browser/main.contribution.i18n.json +++ b/i18n/ptb/src/vs/workbench/electron-browser/main.contribution.i18n.json @@ -10,12 +10,14 @@ "workspaces": "Espaços de trabalho", "developer": "Desenvolvedor", "showEditorTabs": "Controla se os editores abertos devem ou não serem exibidos em abas.", + "workbench.editor.labelFormat.default": "Mostrar o nome do arquivo. Quando as abas estão habilitadas e dois arquivos têm o mesmo nome em um grupo são adicionadas as seções de diferenciação do caminho de cada arquivo. Quando as abas estão desativadas, o caminho relativo para a raiz do espaço de trabalho é mostrado se o editor está ativo.", "workbench.editor.labelFormat.short": "Mostrar o nome do arquivo seguido pelo nome do diretório.", "workbench.editor.labelFormat.medium": "Mostrar o nome do arquivo seguido pelo seu caminho relativo à raiz do espaço de trabalho.", "workbench.editor.labelFormat.long": "Mostrar o nome do arquivo seguido pelo seu caminho absoluto.", "tabDescription": "Controla o formato do rótulo para um editor. Alterar essa configuração pode por exemplo tornar mais fácil entender a localização de um arquivo:\n- curto: 'parent'\n- médio: 'workspace/src/parent'\n- longa: '/ home/user/workspace/src/parent'\n- padrão: '... /parent, quando outra guia compartilha o mesmo título, ou o caminho relativo do espaço de trabalho se as guias estão desabilitadas", "editorTabCloseButton": "Controla a posição dos botões de fechar das abas do editor ou os desabilita quando configurados para 'desligado'.", "showIcons": "Controla se os editores abertos devem ou não ser exibidos com um ícone. Requer um tema de ícone para ser habilitado. ", + "enablePreview": "Controla se editores abertos mostram uma visualização. Editores de visualização são reutilizados até que eles sejam mantidos (por exemplo, através do duplo clique ou edição) e aparecerem com um estilo de fonte em itálico.", "enablePreviewFromQuickOpen": "Controla se os editores abertos da Abertura Rápida são exibidos como visualização. Os editores de visualização são reutilizados até serem preservados (por exemplo, através de um duplo clique ou edição).", "editorOpenPositioning": "Controla onde os editores serão abertos. Escolha 'esquerda' ou 'direita' para abrir os editores à esquerda ou à direita do \neditor ativo. Selecione 'primeiro' ou 'último' para abrir os editores independentemente do atual.", "revealIfOpen": "Controla se um editor é exibido em qualquer um dos grupos, se aberto. Se desabilitado, um editor será aberto preferencialmente no grupo de editores ativo. Se habilitado, um editor já aberto será exibido no grupo de editores ativo, ao invés de ser aberto novamente. Note que há alguns casos onde esta configuração é ignorada, por exemplo, quando for forçada a abertura de um editor em um grupo específico ou ao lado do grupo atualmente ativo.", diff --git a/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/debugService.i18n.json b/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/debugService.i18n.json index 86218bade61..aaf52e5dedb 100644 --- a/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/debugService.i18n.json +++ b/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/debugService.i18n.json @@ -12,6 +12,8 @@ "breakpointRemoved": "Ponto de interrupção removido, linha {0}, arquivo {1}", "compoundMustHaveConfigurations": "Composição deve ter o atributo \"configurations\" definido para iniciar várias configurações.", "configMissing": "Configuração '{0}' não tem 'launch.json'.", + "debugRequestNotSupported": "Configuração de depuração escolhido possui um valor de atributo não suportado '{0}': '{1}'.", + "debugRequesMissing": "Atributo '{0}' está faltando para a configuração de depuração escolhida.", "debugTypeNotSupported": "Tipo de depuração configurado '{0}' não é suportado.", "debugTypeMissing": "Falta a propriedade 'type' para a configuração de lançamento escolhida.", "preLaunchTaskErrors": "Erros de build foram detectados durante a preLaunchTask '{0}'.", diff --git a/i18n/ptb/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json b/i18n/ptb/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json index bbf9ec1405f..6a2871fd38f 100644 --- a/i18n/ptb/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json +++ b/i18n/ptb/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json @@ -5,10 +5,12 @@ // Do not edit this file. It is machine generated. { "reallyRecommended2": "A extensão {0} é recomendada para este tipo de arquivo.", + "reallyRecommendedExtensionPack": "O pacote de extensão '{0}' é recomendado para este tipo de arquivo.", "showRecommendations": "Mostrar Recomendações", "neverShowAgain": "Não mostrar novamente", "close": "Fechar", "workspaceRecommended": "Este espaço de trabalho possui recomendações de extensão.", + "ignoreExtensionRecommendations": "Você quer ignorar todas as recomendações de extensão?", "ignoreAll": "Sim, Ignorar Tudo", "no": "Não", "cancel": "Cancelar" diff --git a/i18n/ptb/src/vs/workbench/parts/files/browser/files.contribution.i18n.json b/i18n/ptb/src/vs/workbench/parts/files/browser/files.contribution.i18n.json index f64389d1f4a..8100b458672 100644 --- a/i18n/ptb/src/vs/workbench/parts/files/browser/files.contribution.i18n.json +++ b/i18n/ptb/src/vs/workbench/parts/files/browser/files.contribution.i18n.json @@ -19,6 +19,7 @@ "eol": "O caractere padrão de fim de linha. Use \\n para LF e \\r\\n para CRLF.", "trimTrailingWhitespace": "Quando habilitado, removerá espaços em branco à direita ao salvar um arquivo.", "insertFinalNewline": "Quando habilitado, inseririrá uma nova linha no final do arquivo quando salvá-lo.", + "trimFinalNewlines": "Quando habilitado, removerá todas as novas linhas após a nova linha no final do arquivo ao salvá-lo.", "files.autoSave.off": "Um arquivo sujo nunca é automaticamente salvo.", "files.autoSave.afterDelay": "Um arquivo sujo é salvo automaticamente após configurado em 'files.autoSaveDelay'.", "files.autoSave.onFocusChange": "Um arquivo sujo é salvo automaticamente quando o editor perde o foco.", diff --git a/i18n/ptb/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json b/i18n/ptb/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json index c7d151b5fb7..526a6233a3d 100644 --- a/i18n/ptb/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json +++ b/i18n/ptb/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json @@ -31,6 +31,7 @@ "TaskSystem.active": "Já existe uma tarefa sendo executada. Finalize-a antes de executar outra tarefa.", "TaskSystem.restartFailed": "Falha ao finalizar e reiniciar a tarefa {0}", "TaskSystem.configurationErrors": "Erro: A configuração da tarefa informada possui erros de validação e não pode ser utilizada. Por favor, corrija os erros primeiro.", + "taskService.ignoreingFolder": "Ignorar as configurações de tarefa para a pasta de trabalho {0}. Suporte a tarefas de espaço de trabalho de múltiplas pastas requer que todas as pastas usem a versão de tarefas 2.0.0\n", "TaskSystem.invalidTaskJson": "Erro: O conteúdo do arquivo tasks.json possui erros de sintaxe. Por favor, corrija-os antes de executar uma tarefa.\n", "TaskSystem.runningTask": "Há uma tarefa sendo executada. Deseja finalizá-la?", "TaskSystem.terminateTask": "&&Finalizar Tarefa", @@ -42,6 +43,7 @@ "recentlyUsed": "tarefas recentemente utilizadas", "configured": "tarefas configuradas", "detected": "tarefas detectadas", + "TaskService.ignoredFolder": "As seguintes pastas de espaço de trabalho serão ignoradas, uma vez que eles usam versão de tarefa 0.1.0: ", "TaskService.notAgain": "Não mostrar novamente", "TaskService.ok": "OK", "TaskService.pickRunTask": "Selecione a tarefa a ser executada", diff --git a/i18n/ptb/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json b/i18n/ptb/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json index f4e46e76613..fc58c32d09c 100644 --- a/i18n/ptb/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json +++ b/i18n/ptb/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json @@ -8,11 +8,22 @@ "openLaunchConfiguration": "Abrir Configuração de Execução", "close": "Fechar", "open": "Abrir configurações", + "saveAndRetry": "Salvar e tentar novamente", "errorUnknownKey": "Não é possível gravar {0} porque {1} não é uma configuração registrada.", "errorInvalidFolderConfiguration": "Não é possível gravar as configurações da pasta porque {0} não suporta o escopo de recurso de pasta.", "errorInvalidUserTarget": "Não é possível gravar as configurações do usuário porque {0} não oferece suporte para o escopo global.", "errorInvalidFolderTarget": "Não é possível gravar as configurações da pasta porque nenhum recurso é fornecido.", "errorNoWorkspaceOpened": "Não é possível gravar {0} porque nenhum espaço de trabalho está aberto. Por favor, abra um espaço de trabalho primeiro e tente novamente.", + "errorInvalidTaskConfiguration": "Não foi possível gravar no arquivo de tarefas. Por favor abra o arquivo **Tasks** para corrigir os erros/avisos e tente novamente.", + "errorInvalidLaunchConfiguration": "Não foi possível gravar no arquivo de lançamento. Por favor abra o arquivo **Launch** para corrigir os erros/avisos e tente novamente.", + "errorInvalidConfiguration": "Não é possível gravar em configurações do usuário. Por favor abra o arquivo **Configurações do Usuário** para corrigir erros/avisos nele e tente novamente.", + "errorInvalidConfigurationWorkspace": "Não é possível gravar em configurações de espaço de trabalho. Por favor abra o arquivo **Configurações do Espaço de Trabalho** para corrigir erros/avisos no arquivo e tente novamente.", + "errorInvalidConfigurationFolder": "Não é possível gravar nas configurações de pasta. Por favor abra o arquivo **Configurações de Pasta** sob a pasta **{0}** para corrigir erros/avisos no arquivo e tente novamente.", + "errorTasksConfigurationFileDirty": "Não é possível gravar no arquivo de tarefas porque o arquivo está sujo. Por favor, salve o arquivo **Configurações de Tarefa** e tente novamente.", + "errorLaunchConfigurationFileDirty": "Não é possível gravar no arquivo de início porque o arquivo está sujo. Por favor, salve o arquivo **Configuração de Lançamento** e tente novamente.", + "errorConfigurationFileDirty": "Não é possível gravar em configurações do usuário porque o arquivo está sujo. Por favor, salve o arquivo **Configurações do Usuário** e tente novamente.", + "errorConfigurationFileDirtyWorkspace": "Não é possível gravar em configurações de espaço de trabalho porque o arquivo está sujo. Por favor, salve o arquivo **Configurações do Espaço de Trabalho** e tente novamente.", + "errorConfigurationFileDirtyFolder": "Não é possível gravar em configurações de pasta porque o arquivo está sujo. Por favor, salve o arquivo **Configurações de Pasta** sob na pasta **{0}** e tente novamente.", "userTarget": "Configurações de Usuário", "workspaceTarget": "Configurações de Espaço de Trabalho", "folderTarget": "Configurações de pasta" From aafdfaec2a2e3d178344e381d9987ca73c5c607c Mon Sep 17 00:00:00 2001 From: Ramya Achutha Rao Date: Wed, 4 Oct 2017 10:37:10 -0700 Subject: [PATCH 032/158] Use strict version-identifier for @types/node in emmet #35561 --- extensions/emmet/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/emmet/package.json b/extensions/emmet/package.json index 033625c277f..9251a0cfac0 100644 --- a/extensions/emmet/package.json +++ b/extensions/emmet/package.json @@ -262,7 +262,7 @@ "compile": "gulp compile-extension:emmet" }, "devDependencies": { - "@types/node": "^7.0.4", + "@types/node": "7.0.43", "vscode": "1.0.1" }, "dependencies": { From 3af9e4e975a375f221c8c8b1bc3481b7240fbede Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Wed, 4 Oct 2017 10:32:27 -0700 Subject: [PATCH 033/158] Revert "Move terminal command registration to new file" This reverts commit 33dac9c9eb6fd8728eeef44dda3a7a17b2d5f182. --- .../electron-browser/terminal.contribution.ts | 104 +++++++++++++++- .../electron-browser/terminalCommands.ts | 116 ------------------ 2 files changed, 99 insertions(+), 121 deletions(-) delete mode 100644 src/vs/workbench/parts/terminal/electron-browser/terminalCommands.ts diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.ts b/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.ts index d7b5b1f5b25..ceb6cca22b9 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.ts +++ b/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.ts @@ -11,18 +11,20 @@ import * as debugActions from 'vs/workbench/parts/debug/browser/debugActions'; import * as nls from 'vs/nls'; import * as panel from 'vs/workbench/browser/panel'; import * as platform from 'vs/base/common/platform'; -import * as terminalCommands from 'vs/workbench/parts/terminal/electron-browser/terminalCommands'; import { Extensions, IConfigurationRegistry } from 'vs/platform/configuration/common/configurationRegistry'; -import { ITerminalService, TERMINAL_PANEL_ID, TERMINAL_DEFAULT_RIGHT_CLICK_COPY_PASTE, TerminalCursorStyle } from 'vs/workbench/parts/terminal/common/terminal'; +import { ITerminalService, KEYBINDING_CONTEXT_TERMINAL_FOCUS, KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_INPUT_FOCUSED, KEYBINDING_CONTEXT_TERMINAL_TEXT_SELECTED, TERMINAL_PANEL_ID, TERMINAL_DEFAULT_RIGHT_CLICK_COPY_PASTE, KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_VISIBLE, TerminalCursorStyle } from 'vs/workbench/parts/terminal/common/terminal'; import { TERMINAL_DEFAULT_SHELL_LINUX, TERMINAL_DEFAULT_SHELL_OSX, TERMINAL_DEFAULT_SHELL_WINDOWS } from 'vs/workbench/parts/terminal/electron-browser/terminal'; import { IWorkbenchActionRegistry, Extensions as ActionExtensions } from 'vs/workbench/common/actions'; -import { KillTerminalAction, CopyTerminalSelectionAction, CreateNewTerminalAction, FocusActiveTerminalAction, FocusNextTerminalAction, FocusPreviousTerminalAction, FocusTerminalAtIndexAction, RunSelectedTextInTerminalAction, RunActiveFileInTerminalAction, ScrollDownTerminalAction, ScrollDownPageTerminalAction, ScrollToBottomTerminalAction, ScrollUpTerminalAction, ScrollUpPageTerminalAction, ScrollToTopTerminalAction, TerminalPasteAction, ToggleTerminalAction, ClearTerminalAction, SelectAllTerminalAction, FocusTerminalFindWidgetAction, HideTerminalFindWidgetAction, ShowNextFindTermTerminalFindWidgetAction, ShowPreviousFindTermTerminalFindWidgetAction, DeleteWordLeftTerminalAction, DeleteWordRightTerminalAction, QuickOpenActionTermContributor, QuickOpenTermAction, TERMINAL_PICKER_PREFIX } from 'vs/workbench/parts/terminal/electron-browser/terminalActions'; +import { KeyCode, KeyMod } from 'vs/base/common/keyCodes'; +import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; +import { KillTerminalAction, CopyTerminalSelectionAction, CreateNewTerminalAction, FocusActiveTerminalAction, FocusNextTerminalAction, FocusPreviousTerminalAction, FocusTerminalAtIndexAction, SelectDefaultShellWindowsTerminalAction, RunSelectedTextInTerminalAction, RunActiveFileInTerminalAction, ScrollDownTerminalAction, ScrollDownPageTerminalAction, ScrollToBottomTerminalAction, ScrollUpTerminalAction, ScrollUpPageTerminalAction, ScrollToTopTerminalAction, TerminalPasteAction, ToggleTerminalAction, ClearTerminalAction, AllowWorkspaceShellTerminalCommand, DisallowWorkspaceShellTerminalCommand, RenameTerminalAction, SelectAllTerminalAction, FocusTerminalFindWidgetAction, HideTerminalFindWidgetAction, ShowNextFindTermTerminalFindWidgetAction, ShowPreviousFindTermTerminalFindWidgetAction, DeleteWordLeftTerminalAction, DeleteWordRightTerminalAction, QuickOpenActionTermContributor, QuickOpenTermAction, TERMINAL_PICKER_PREFIX } from 'vs/workbench/parts/terminal/electron-browser/terminalActions'; import { Registry } from 'vs/platform/registry/common/platform'; import { ShowAllCommandsAction } from 'vs/workbench/parts/quickopen/browser/commandsHandler'; import { SyncActionDescriptor } from 'vs/platform/actions/common/actions'; import { TerminalService } from 'vs/workbench/parts/terminal/electron-browser/terminalService'; import { ToggleTabFocusModeAction } from 'vs/editor/contrib/toggleTabFocusMode/common/toggleTabFocusMode'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; +import { KeybindingsRegistry } from 'vs/platform/keybinding/common/keybindingsRegistry'; import { OpenNextRecentlyUsedEditorInGroupAction, OpenPreviousRecentlyUsedEditorInGroupAction, FocusActiveGroupAction, FocusFirstGroupAction, FocusSecondGroupAction, FocusThirdGroupAction } from 'vs/workbench/browser/parts/editor/editorActions'; import { EDITOR_FONT_DEFAULTS } from 'vs/editor/common/config/editorOptions'; import { registerColors } from './terminalColorRegistry'; @@ -264,7 +266,99 @@ registerSingleton(ITerminalService, TerminalService); ToggleTerminalAction.ID )); -terminalCommands.setup(); - +// On mac cmd+` is reserved to cycle between windows, that's why the keybindings use WinCtrl +const category = nls.localize('terminalCategory', "Terminal"); +let actionRegistry = Registry.as(ActionExtensions.WorkbenchActions); +actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(KillTerminalAction, KillTerminalAction.ID, KillTerminalAction.LABEL), 'Terminal: Kill the Active Terminal Instance', category); +actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(CopyTerminalSelectionAction, CopyTerminalSelectionAction.ID, CopyTerminalSelectionAction.LABEL, { + primary: KeyMod.CtrlCmd | KeyCode.KEY_C, + linux: { primary: KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.KEY_C } +}, ContextKeyExpr.and(KEYBINDING_CONTEXT_TERMINAL_TEXT_SELECTED, KEYBINDING_CONTEXT_TERMINAL_FOCUS)), 'Terminal: Copy Selection', category); +actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(CreateNewTerminalAction, CreateNewTerminalAction.ID, CreateNewTerminalAction.LABEL, { + primary: KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.US_BACKTICK, + mac: { primary: KeyMod.WinCtrl | KeyMod.Shift | KeyCode.US_BACKTICK } +}), 'Terminal: Create New Integrated Terminal', category); +actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(FocusActiveTerminalAction, FocusActiveTerminalAction.ID, FocusActiveTerminalAction.LABEL), 'Terminal: Focus Terminal', category); +actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(FocusNextTerminalAction, FocusNextTerminalAction.ID, FocusNextTerminalAction.LABEL), 'Terminal: Focus Next Terminal', category); +actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(FocusPreviousTerminalAction, FocusPreviousTerminalAction.ID, FocusPreviousTerminalAction.LABEL), 'Terminal: Focus Previous Terminal', category); +for (let i = 1; i < 10; i++) { + actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(FocusTerminalAtIndexAction, FocusTerminalAtIndexAction.getId(i), FocusTerminalAtIndexAction.getLabel(i)), 'Terminal: Focus Terminal ' + i, category); +} +actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(TerminalPasteAction, TerminalPasteAction.ID, TerminalPasteAction.LABEL, { + primary: KeyMod.CtrlCmd | KeyCode.KEY_V, + linux: { primary: KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.KEY_V }, + // Don't apply to Mac since cmd+v works + mac: { primary: null } +}, KEYBINDING_CONTEXT_TERMINAL_FOCUS), 'Terminal: Paste into Active Terminal', category); +actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(SelectAllTerminalAction, SelectAllTerminalAction.ID, SelectAllTerminalAction.LABEL, { + // Don't use ctrl+a by default as that would override the common go to start + // of prompt shell binding + primary: null, + // Technically this doesn't need to be here as it will fall back to this + // behavior anyway when handed to xterm.js, having this handled by VS Code + // makes it easier for users to see how it works though. + mac: { primary: KeyMod.CtrlCmd | KeyCode.KEY_A } +}, KEYBINDING_CONTEXT_TERMINAL_FOCUS), 'Terminal: Select All', category); +actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(RunSelectedTextInTerminalAction, RunSelectedTextInTerminalAction.ID, RunSelectedTextInTerminalAction.LABEL), 'Terminal: Run Selected Text In Active Terminal', category); +actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(RunActiveFileInTerminalAction, RunActiveFileInTerminalAction.ID, RunActiveFileInTerminalAction.LABEL), 'Terminal: Run Active File In Active Terminal', category); +actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(ToggleTerminalAction, ToggleTerminalAction.ID, ToggleTerminalAction.LABEL, { + primary: KeyMod.CtrlCmd | KeyCode.US_BACKTICK, + mac: { primary: KeyMod.WinCtrl | KeyCode.US_BACKTICK } +}), 'View: Toggle Integrated Terminal', nls.localize('viewCategory', "View")); +actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(ScrollDownTerminalAction, ScrollDownTerminalAction.ID, ScrollDownTerminalAction.LABEL, { + primary: KeyMod.CtrlCmd | KeyCode.DownArrow, + linux: { primary: KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.DownArrow } +}, KEYBINDING_CONTEXT_TERMINAL_FOCUS), 'Terminal: Scroll Down (Line)', category); +actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(ScrollDownPageTerminalAction, ScrollDownPageTerminalAction.ID, ScrollDownPageTerminalAction.LABEL, { + primary: KeyMod.Shift | KeyCode.PageDown, + mac: { primary: KeyCode.PageDown } +}, KEYBINDING_CONTEXT_TERMINAL_FOCUS), 'Terminal: Scroll Down (Page)', category); +actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(ScrollToBottomTerminalAction, ScrollToBottomTerminalAction.ID, ScrollToBottomTerminalAction.LABEL, { + primary: KeyMod.CtrlCmd | KeyCode.End, + linux: { primary: KeyMod.Shift | KeyCode.End } +}, KEYBINDING_CONTEXT_TERMINAL_FOCUS), 'Terminal: Scroll to Bottom', category); +actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(ScrollUpTerminalAction, ScrollUpTerminalAction.ID, ScrollUpTerminalAction.LABEL, { + primary: KeyMod.CtrlCmd | KeyCode.UpArrow, + linux: { primary: KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.UpArrow }, +}, KEYBINDING_CONTEXT_TERMINAL_FOCUS), 'Terminal: Scroll Up (Line)', category); +actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(ScrollUpPageTerminalAction, ScrollUpPageTerminalAction.ID, ScrollUpPageTerminalAction.LABEL, { + primary: KeyMod.Shift | KeyCode.PageUp, + mac: { primary: KeyCode.PageUp } +}, KEYBINDING_CONTEXT_TERMINAL_FOCUS), 'Terminal: Scroll Up (Page)', category); +actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(ScrollToTopTerminalAction, ScrollToTopTerminalAction.ID, ScrollToTopTerminalAction.LABEL, { + primary: KeyMod.CtrlCmd | KeyCode.Home, + linux: { primary: KeyMod.Shift | KeyCode.Home } +}, KEYBINDING_CONTEXT_TERMINAL_FOCUS), 'Terminal: Scroll to Top', category); +actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(ClearTerminalAction, ClearTerminalAction.ID, ClearTerminalAction.LABEL, { + primary: KeyMod.CtrlCmd | KeyCode.KEY_K, + linux: { primary: null } +}, KEYBINDING_CONTEXT_TERMINAL_FOCUS, KeybindingsRegistry.WEIGHT.workbenchContrib(1)), 'Terminal: Clear', category); +if (platform.isWindows) { + actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(SelectDefaultShellWindowsTerminalAction, SelectDefaultShellWindowsTerminalAction.ID, SelectDefaultShellWindowsTerminalAction.LABEL), 'Terminal: Select Default Shell', category); +} +actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(AllowWorkspaceShellTerminalCommand, AllowWorkspaceShellTerminalCommand.ID, AllowWorkspaceShellTerminalCommand.LABEL), 'Terminal: Allow Workspace Shell Configuration', category); +actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(DisallowWorkspaceShellTerminalCommand, DisallowWorkspaceShellTerminalCommand.ID, DisallowWorkspaceShellTerminalCommand.LABEL), 'Terminal: Disallow Workspace Shell Configuration', category); +actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(RenameTerminalAction, RenameTerminalAction.ID, RenameTerminalAction.LABEL), 'Terminal: Rename', category); +actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(FocusTerminalFindWidgetAction, FocusTerminalFindWidgetAction.ID, FocusTerminalFindWidgetAction.LABEL, { + primary: KeyMod.CtrlCmd | KeyCode.KEY_F +}, KEYBINDING_CONTEXT_TERMINAL_FOCUS), 'Terminal: Focus Find Widget', category); +actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(HideTerminalFindWidgetAction, HideTerminalFindWidgetAction.ID, HideTerminalFindWidgetAction.LABEL, { + primary: KeyCode.Escape, + secondary: [KeyMod.Shift | KeyCode.Escape] +}, ContextKeyExpr.and(KEYBINDING_CONTEXT_TERMINAL_FOCUS, KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_VISIBLE)), 'Terminal: Hide Find Widget', category); +actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(ShowNextFindTermTerminalFindWidgetAction, ShowNextFindTermTerminalFindWidgetAction.ID, ShowNextFindTermTerminalFindWidgetAction.LABEL, { + primary: KeyMod.Alt | KeyCode.DownArrow +}, ContextKeyExpr.and(KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_INPUT_FOCUSED, KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_VISIBLE)), 'Terminal: Show Next Find Term', category); +actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(ShowPreviousFindTermTerminalFindWidgetAction, ShowPreviousFindTermTerminalFindWidgetAction.ID, ShowPreviousFindTermTerminalFindWidgetAction.LABEL, { + primary: KeyMod.Alt | KeyCode.UpArrow +}, ContextKeyExpr.and(KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_INPUT_FOCUSED, KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_VISIBLE)), 'Terminal: Show Previous Find Term', category); +actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(DeleteWordLeftTerminalAction, DeleteWordLeftTerminalAction.ID, DeleteWordLeftTerminalAction.LABEL, { + primary: KeyMod.CtrlCmd | KeyCode.Backspace, + mac: { primary: KeyMod.Alt | KeyCode.Backspace } +}, KEYBINDING_CONTEXT_TERMINAL_FOCUS), 'Terminal: Delete Word Left', category); +actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(DeleteWordRightTerminalAction, DeleteWordRightTerminalAction.ID, DeleteWordRightTerminalAction.LABEL, { + primary: KeyMod.CtrlCmd | KeyCode.Delete, + mac: { primary: KeyMod.Alt | KeyCode.Delete } +}, KEYBINDING_CONTEXT_TERMINAL_FOCUS), 'Terminal: Delete Word Right', category); registerColors(); diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminalCommands.ts b/src/vs/workbench/parts/terminal/electron-browser/terminalCommands.ts deleted file mode 100644 index bec1911afd0..00000000000 --- a/src/vs/workbench/parts/terminal/electron-browser/terminalCommands.ts +++ /dev/null @@ -1,116 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -import * as nls from 'vs/nls'; -import * as platform from 'vs/base/common/platform'; -import { KEYBINDING_CONTEXT_TERMINAL_FOCUS, KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_INPUT_FOCUSED, KEYBINDING_CONTEXT_TERMINAL_TEXT_SELECTED, KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_VISIBLE } from 'vs/workbench/parts/terminal/common/terminal'; -import { IWorkbenchActionRegistry, Extensions as ActionExtensions } from 'vs/workbench/common/actions'; -import { KeyCode, KeyMod } from 'vs/base/common/keyCodes'; -import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; -import { KillTerminalAction, CopyTerminalSelectionAction, CreateNewTerminalAction, FocusActiveTerminalAction, FocusNextTerminalAction, FocusPreviousTerminalAction, FocusTerminalAtIndexAction, SelectDefaultShellWindowsTerminalAction, RunSelectedTextInTerminalAction, RunActiveFileInTerminalAction, ScrollDownTerminalAction, ScrollDownPageTerminalAction, ScrollToBottomTerminalAction, ScrollUpTerminalAction, ScrollUpPageTerminalAction, ScrollToTopTerminalAction, TerminalPasteAction, ToggleTerminalAction, ClearTerminalAction, AllowWorkspaceShellTerminalCommand, DisallowWorkspaceShellTerminalCommand, RenameTerminalAction, SelectAllTerminalAction, FocusTerminalFindWidgetAction, HideTerminalFindWidgetAction, ShowNextFindTermTerminalFindWidgetAction, ShowPreviousFindTermTerminalFindWidgetAction, DeleteWordLeftTerminalAction, DeleteWordRightTerminalAction } from 'vs/workbench/parts/terminal/electron-browser/terminalActions'; -import { Registry } from 'vs/platform/registry/common/platform'; -import { SyncActionDescriptor } from 'vs/platform/actions/common/actions'; -import { KeybindingsRegistry } from 'vs/platform/keybinding/common/keybindingsRegistry'; - -export function setup(): void { - registerCommands(); -} - -function registerCommands(): void { - // On mac cmd+` is reserved to cycle between windows, that's why the keybindings use WinCtrl - const category = nls.localize('terminalCategory', "Terminal"); - let actionRegistry = Registry.as(ActionExtensions.WorkbenchActions); - actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(KillTerminalAction, KillTerminalAction.ID, KillTerminalAction.LABEL), 'Terminal: Kill the Active Terminal Instance', category); - actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(CopyTerminalSelectionAction, CopyTerminalSelectionAction.ID, CopyTerminalSelectionAction.LABEL, { - primary: KeyMod.CtrlCmd | KeyCode.KEY_C, - linux: { primary: KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.KEY_C } - }, ContextKeyExpr.and(KEYBINDING_CONTEXT_TERMINAL_TEXT_SELECTED, KEYBINDING_CONTEXT_TERMINAL_FOCUS)), 'Terminal: Copy Selection', category); - actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(CreateNewTerminalAction, CreateNewTerminalAction.ID, CreateNewTerminalAction.LABEL, { - primary: KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.US_BACKTICK, - mac: { primary: KeyMod.WinCtrl | KeyMod.Shift | KeyCode.US_BACKTICK } - }), 'Terminal: Create New Integrated Terminal', category); - actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(FocusActiveTerminalAction, FocusActiveTerminalAction.ID, FocusActiveTerminalAction.LABEL), 'Terminal: Focus Terminal', category); - actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(FocusNextTerminalAction, FocusNextTerminalAction.ID, FocusNextTerminalAction.LABEL), 'Terminal: Focus Next Terminal', category); - actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(FocusPreviousTerminalAction, FocusPreviousTerminalAction.ID, FocusPreviousTerminalAction.LABEL), 'Terminal: Focus Previous Terminal', category); - for (let i = 1; i < 10; i++) { - actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(FocusTerminalAtIndexAction, FocusTerminalAtIndexAction.getId(i), FocusTerminalAtIndexAction.getLabel(i)), 'Terminal: Focus Terminal ' + i, category); - } - actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(TerminalPasteAction, TerminalPasteAction.ID, TerminalPasteAction.LABEL, { - primary: KeyMod.CtrlCmd | KeyCode.KEY_V, - linux: { primary: KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.KEY_V }, - // Don't apply to Mac since cmd+v works - mac: { primary: null } - }, KEYBINDING_CONTEXT_TERMINAL_FOCUS), 'Terminal: Paste into Active Terminal', category); - actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(SelectAllTerminalAction, SelectAllTerminalAction.ID, SelectAllTerminalAction.LABEL, { - // Don't use ctrl+a by default as that would override the common go to start - // of prompt shell binding - primary: null, - // Technically this doesn't need to be here as it will fall back to this - // behavior anyway when handed to xterm.js, having this handled by VS Code - // makes it easier for users to see how it works though. - mac: { primary: KeyMod.CtrlCmd | KeyCode.KEY_A } - }, KEYBINDING_CONTEXT_TERMINAL_FOCUS), 'Terminal: Select All', category); - actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(RunSelectedTextInTerminalAction, RunSelectedTextInTerminalAction.ID, RunSelectedTextInTerminalAction.LABEL), 'Terminal: Run Selected Text In Active Terminal', category); - actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(RunActiveFileInTerminalAction, RunActiveFileInTerminalAction.ID, RunActiveFileInTerminalAction.LABEL), 'Terminal: Run Active File In Active Terminal', category); - actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(ToggleTerminalAction, ToggleTerminalAction.ID, ToggleTerminalAction.LABEL, { - primary: KeyMod.CtrlCmd | KeyCode.US_BACKTICK, - mac: { primary: KeyMod.WinCtrl | KeyCode.US_BACKTICK } - }), 'View: Toggle Integrated Terminal', nls.localize('viewCategory', "View")); - actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(ScrollDownTerminalAction, ScrollDownTerminalAction.ID, ScrollDownTerminalAction.LABEL, { - primary: KeyMod.CtrlCmd | KeyCode.DownArrow, - linux: { primary: KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.DownArrow } - }, KEYBINDING_CONTEXT_TERMINAL_FOCUS), 'Terminal: Scroll Down (Line)', category); - actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(ScrollDownPageTerminalAction, ScrollDownPageTerminalAction.ID, ScrollDownPageTerminalAction.LABEL, { - primary: KeyMod.Shift | KeyCode.PageDown, - mac: { primary: KeyCode.PageDown } - }, KEYBINDING_CONTEXT_TERMINAL_FOCUS), 'Terminal: Scroll Down (Page)', category); - actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(ScrollToBottomTerminalAction, ScrollToBottomTerminalAction.ID, ScrollToBottomTerminalAction.LABEL, { - primary: KeyMod.CtrlCmd | KeyCode.End, - linux: { primary: KeyMod.Shift | KeyCode.End } - }, KEYBINDING_CONTEXT_TERMINAL_FOCUS), 'Terminal: Scroll to Bottom', category); - actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(ScrollUpTerminalAction, ScrollUpTerminalAction.ID, ScrollUpTerminalAction.LABEL, { - primary: KeyMod.CtrlCmd | KeyCode.UpArrow, - linux: { primary: KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.UpArrow }, - }, KEYBINDING_CONTEXT_TERMINAL_FOCUS), 'Terminal: Scroll Up (Line)', category); - actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(ScrollUpPageTerminalAction, ScrollUpPageTerminalAction.ID, ScrollUpPageTerminalAction.LABEL, { - primary: KeyMod.Shift | KeyCode.PageUp, - mac: { primary: KeyCode.PageUp } - }, KEYBINDING_CONTEXT_TERMINAL_FOCUS), 'Terminal: Scroll Up (Page)', category); - actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(ScrollToTopTerminalAction, ScrollToTopTerminalAction.ID, ScrollToTopTerminalAction.LABEL, { - primary: KeyMod.CtrlCmd | KeyCode.Home, - linux: { primary: KeyMod.Shift | KeyCode.Home } - }, KEYBINDING_CONTEXT_TERMINAL_FOCUS), 'Terminal: Scroll to Top', category); - actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(ClearTerminalAction, ClearTerminalAction.ID, ClearTerminalAction.LABEL, { - primary: KeyMod.CtrlCmd | KeyCode.KEY_K, - linux: { primary: null } - }, KEYBINDING_CONTEXT_TERMINAL_FOCUS, KeybindingsRegistry.WEIGHT.workbenchContrib(1)), 'Terminal: Clear', category); - if (platform.isWindows) { - actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(SelectDefaultShellWindowsTerminalAction, SelectDefaultShellWindowsTerminalAction.ID, SelectDefaultShellWindowsTerminalAction.LABEL), 'Terminal: Select Default Shell', category); - } - actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(AllowWorkspaceShellTerminalCommand, AllowWorkspaceShellTerminalCommand.ID, AllowWorkspaceShellTerminalCommand.LABEL), 'Terminal: Allow Workspace Shell Configuration', category); - actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(DisallowWorkspaceShellTerminalCommand, DisallowWorkspaceShellTerminalCommand.ID, DisallowWorkspaceShellTerminalCommand.LABEL), 'Terminal: Disallow Workspace Shell Configuration', category); - actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(RenameTerminalAction, RenameTerminalAction.ID, RenameTerminalAction.LABEL), 'Terminal: Rename', category); - actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(FocusTerminalFindWidgetAction, FocusTerminalFindWidgetAction.ID, FocusTerminalFindWidgetAction.LABEL, { - primary: KeyMod.CtrlCmd | KeyCode.KEY_F - }, KEYBINDING_CONTEXT_TERMINAL_FOCUS), 'Terminal: Focus Find Widget', category); - actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(HideTerminalFindWidgetAction, HideTerminalFindWidgetAction.ID, HideTerminalFindWidgetAction.LABEL, { - primary: KeyCode.Escape, - secondary: [KeyMod.Shift | KeyCode.Escape] - }, ContextKeyExpr.and(KEYBINDING_CONTEXT_TERMINAL_FOCUS, KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_VISIBLE)), 'Terminal: Hide Find Widget', category); - actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(ShowNextFindTermTerminalFindWidgetAction, ShowNextFindTermTerminalFindWidgetAction.ID, ShowNextFindTermTerminalFindWidgetAction.LABEL, { - primary: KeyMod.Alt | KeyCode.DownArrow - }, ContextKeyExpr.and(KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_INPUT_FOCUSED, KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_VISIBLE)), 'Terminal: Show Next Find Term', category); - actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(ShowPreviousFindTermTerminalFindWidgetAction, ShowPreviousFindTermTerminalFindWidgetAction.ID, ShowPreviousFindTermTerminalFindWidgetAction.LABEL, { - primary: KeyMod.Alt | KeyCode.UpArrow - }, ContextKeyExpr.and(KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_INPUT_FOCUSED, KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_VISIBLE)), 'Terminal: Show Previous Find Term', category); - actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(DeleteWordLeftTerminalAction, DeleteWordLeftTerminalAction.ID, DeleteWordLeftTerminalAction.LABEL, { - primary: KeyMod.CtrlCmd | KeyCode.Backspace, - mac: { primary: KeyMod.Alt | KeyCode.Backspace } - }, KEYBINDING_CONTEXT_TERMINAL_FOCUS), 'Terminal: Delete Word Left', category); - actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(DeleteWordRightTerminalAction, DeleteWordRightTerminalAction.ID, DeleteWordRightTerminalAction.LABEL, { - primary: KeyMod.CtrlCmd | KeyCode.Delete, - mac: { primary: KeyMod.Alt | KeyCode.Delete } - }, KEYBINDING_CONTEXT_TERMINAL_FOCUS), 'Terminal: Delete Word Right', category); -} \ No newline at end of file From b950ad2985afa7c0d965de3a481a8c28297a2fb4 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Wed, 4 Oct 2017 10:57:46 -0700 Subject: [PATCH 034/158] Convert terminal focus by index actions to commands Fixes #35520 --- .../electron-browser/terminal.contribution.ts | 27 +++++++++-------- .../electron-browser/terminalActions.ts | 28 ----------------- .../electron-browser/terminalCommands.ts | 30 +++++++++++++++++++ 3 files changed, 44 insertions(+), 41 deletions(-) create mode 100644 src/vs/workbench/parts/terminal/electron-browser/terminalCommands.ts diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.ts b/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.ts index ceb6cca22b9..f5d947c4492 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.ts +++ b/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.ts @@ -11,13 +11,14 @@ import * as debugActions from 'vs/workbench/parts/debug/browser/debugActions'; import * as nls from 'vs/nls'; import * as panel from 'vs/workbench/browser/panel'; import * as platform from 'vs/base/common/platform'; +import * as terminalCommands from 'vs/workbench/parts/terminal/electron-browser/terminalCommands'; import { Extensions, IConfigurationRegistry } from 'vs/platform/configuration/common/configurationRegistry'; import { ITerminalService, KEYBINDING_CONTEXT_TERMINAL_FOCUS, KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_INPUT_FOCUSED, KEYBINDING_CONTEXT_TERMINAL_TEXT_SELECTED, TERMINAL_PANEL_ID, TERMINAL_DEFAULT_RIGHT_CLICK_COPY_PASTE, KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_VISIBLE, TerminalCursorStyle } from 'vs/workbench/parts/terminal/common/terminal'; import { TERMINAL_DEFAULT_SHELL_LINUX, TERMINAL_DEFAULT_SHELL_OSX, TERMINAL_DEFAULT_SHELL_WINDOWS } from 'vs/workbench/parts/terminal/electron-browser/terminal'; import { IWorkbenchActionRegistry, Extensions as ActionExtensions } from 'vs/workbench/common/actions'; import { KeyCode, KeyMod } from 'vs/base/common/keyCodes'; import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; -import { KillTerminalAction, CopyTerminalSelectionAction, CreateNewTerminalAction, FocusActiveTerminalAction, FocusNextTerminalAction, FocusPreviousTerminalAction, FocusTerminalAtIndexAction, SelectDefaultShellWindowsTerminalAction, RunSelectedTextInTerminalAction, RunActiveFileInTerminalAction, ScrollDownTerminalAction, ScrollDownPageTerminalAction, ScrollToBottomTerminalAction, ScrollUpTerminalAction, ScrollUpPageTerminalAction, ScrollToTopTerminalAction, TerminalPasteAction, ToggleTerminalAction, ClearTerminalAction, AllowWorkspaceShellTerminalCommand, DisallowWorkspaceShellTerminalCommand, RenameTerminalAction, SelectAllTerminalAction, FocusTerminalFindWidgetAction, HideTerminalFindWidgetAction, ShowNextFindTermTerminalFindWidgetAction, ShowPreviousFindTermTerminalFindWidgetAction, DeleteWordLeftTerminalAction, DeleteWordRightTerminalAction, QuickOpenActionTermContributor, QuickOpenTermAction, TERMINAL_PICKER_PREFIX } from 'vs/workbench/parts/terminal/electron-browser/terminalActions'; +import { KillTerminalAction, CopyTerminalSelectionAction, CreateNewTerminalAction, FocusActiveTerminalAction, FocusNextTerminalAction, FocusPreviousTerminalAction, SelectDefaultShellWindowsTerminalAction, RunSelectedTextInTerminalAction, RunActiveFileInTerminalAction, ScrollDownTerminalAction, ScrollDownPageTerminalAction, ScrollToBottomTerminalAction, ScrollUpTerminalAction, ScrollUpPageTerminalAction, ScrollToTopTerminalAction, TerminalPasteAction, ToggleTerminalAction, ClearTerminalAction, AllowWorkspaceShellTerminalCommand, DisallowWorkspaceShellTerminalCommand, RenameTerminalAction, SelectAllTerminalAction, FocusTerminalFindWidgetAction, HideTerminalFindWidgetAction, ShowNextFindTermTerminalFindWidgetAction, ShowPreviousFindTermTerminalFindWidgetAction, DeleteWordLeftTerminalAction, DeleteWordRightTerminalAction, QuickOpenActionTermContributor, QuickOpenTermAction, TERMINAL_PICKER_PREFIX } from 'vs/workbench/parts/terminal/electron-browser/terminalActions'; import { Registry } from 'vs/platform/registry/common/platform'; import { ShowAllCommandsAction } from 'vs/workbench/parts/quickopen/browser/commandsHandler'; import { SyncActionDescriptor } from 'vs/platform/actions/common/actions'; @@ -191,15 +192,15 @@ configurationRegistry.registerConfiguration({ FocusActiveTerminalAction.ID, FocusPreviousTerminalAction.ID, FocusNextTerminalAction.ID, - FocusTerminalAtIndexAction.getId(1), - FocusTerminalAtIndexAction.getId(2), - FocusTerminalAtIndexAction.getId(3), - FocusTerminalAtIndexAction.getId(4), - FocusTerminalAtIndexAction.getId(5), - FocusTerminalAtIndexAction.getId(6), - FocusTerminalAtIndexAction.getId(7), - FocusTerminalAtIndexAction.getId(8), - FocusTerminalAtIndexAction.getId(9), + 'workbench.action.terminal.focusAtIndex1', + 'workbench.action.terminal.focusAtIndex2', + 'workbench.action.terminal.focusAtIndex3', + 'workbench.action.terminal.focusAtIndex4', + 'workbench.action.terminal.focusAtIndex5', + 'workbench.action.terminal.focusAtIndex6', + 'workbench.action.terminal.focusAtIndex7', + 'workbench.action.terminal.focusAtIndex8', + 'workbench.action.terminal.focusAtIndex9', TerminalPasteAction.ID, RunSelectedTextInTerminalAction.ID, RunActiveFileInTerminalAction.ID, @@ -281,9 +282,6 @@ actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(CreateNewTermina actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(FocusActiveTerminalAction, FocusActiveTerminalAction.ID, FocusActiveTerminalAction.LABEL), 'Terminal: Focus Terminal', category); actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(FocusNextTerminalAction, FocusNextTerminalAction.ID, FocusNextTerminalAction.LABEL), 'Terminal: Focus Next Terminal', category); actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(FocusPreviousTerminalAction, FocusPreviousTerminalAction.ID, FocusPreviousTerminalAction.LABEL), 'Terminal: Focus Previous Terminal', category); -for (let i = 1; i < 10; i++) { - actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(FocusTerminalAtIndexAction, FocusTerminalAtIndexAction.getId(i), FocusTerminalAtIndexAction.getLabel(i)), 'Terminal: Focus Terminal ' + i, category); -} actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(TerminalPasteAction, TerminalPasteAction.ID, TerminalPasteAction.LABEL, { primary: KeyMod.CtrlCmd | KeyCode.KEY_V, linux: { primary: KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.KEY_V }, @@ -360,5 +358,8 @@ actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(DeleteWordRightT primary: KeyMod.CtrlCmd | KeyCode.Delete, mac: { primary: KeyMod.Alt | KeyCode.Delete } }, KEYBINDING_CONTEXT_TERMINAL_FOCUS), 'Terminal: Delete Word Right', category); + +terminalCommands.setup(); + registerColors(); diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminalActions.ts b/src/vs/workbench/parts/terminal/electron-browser/terminalActions.ts index 94021883d7f..b38714c7e04 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminalActions.ts +++ b/src/vs/workbench/parts/terminal/electron-browser/terminalActions.ts @@ -256,34 +256,6 @@ export class FocusNextTerminalAction extends Action { } } -export class FocusTerminalAtIndexAction extends Action { - private static ID_PREFIX = 'workbench.action.terminal.focusAtIndex'; - - constructor( - id: string, label: string, - @ITerminalService private terminalService: ITerminalService - ) { - super(id, label); - } - - public run(event?: any): TPromise { - this.terminalService.setActiveInstanceByIndex(this.getTerminalNumber() - 1); - return this.terminalService.showPanel(true); - } - - public static getId(n: number): string { - return FocusTerminalAtIndexAction.ID_PREFIX + n; - } - - public static getLabel(n: number): string { - return nls.localize('workbench.action.terminal.focusAtIndex', 'Focus Terminal {0}', n); - } - - private getTerminalNumber(): number { - return parseInt(this.id.substr(FocusTerminalAtIndexAction.ID_PREFIX.length)); - } -} - export class FocusPreviousTerminalAction extends Action { public static ID = 'workbench.action.terminal.focusPrevious'; diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminalCommands.ts b/src/vs/workbench/parts/terminal/electron-browser/terminalCommands.ts new file mode 100644 index 00000000000..828588d03b1 --- /dev/null +++ b/src/vs/workbench/parts/terminal/electron-browser/terminalCommands.ts @@ -0,0 +1,30 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { KeybindingsRegistry } from 'vs/platform/keybinding/common/keybindingsRegistry'; +import { ITerminalService } from 'vs/workbench/parts/terminal/common/terminal'; + +export function setup(): void { + registerOpenTerminalAtIndexCommands(); +} + +function registerOpenTerminalAtIndexCommands(): void { + for (let i = 0; i < 9; i++) { + const terminalIndex = i; + const visibleIndex = i + 1; + + KeybindingsRegistry.registerCommandAndKeybindingRule({ + id: `workbench.action.terminal.focusAtIndex${visibleIndex}`, + weight: KeybindingsRegistry.WEIGHT.workbenchContrib(), + when: void 0, + primary: null, + handler: accessor => { + const terminalService = accessor.get(ITerminalService); + terminalService.setActiveInstanceByIndex(terminalIndex); + return terminalService.showPanel(true); + } + }); + } +} \ No newline at end of file From dc256e0675a08a71e05d07d82f2f5794898772ca Mon Sep 17 00:00:00 2001 From: Rob Lourens Date: Tue, 3 Oct 2017 22:33:24 -0700 Subject: [PATCH 035/158] Only generate config.json for master and release branches --- build/gulpfile.vscode.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/build/gulpfile.vscode.js b/build/gulpfile.vscode.js index cd494ee886f..fe31d24cb18 100644 --- a/build/gulpfile.vscode.js +++ b/build/gulpfile.vscode.js @@ -449,6 +449,12 @@ gulp.task('upload-vscode-sourcemaps', ['minify-vscode'], () => { const allConfigDetailsPath = path.join(os.tmpdir(), 'configuration.json'); gulp.task('upload-vscode-configuration', ['generate-vscode-configuration'], () => { + const branch = process.env.BUILD_SOURCEBRANCH; + if (!branch.endsWith('/master') && !branch.indexOf('/release/') >= 0) { + console.log(`Only runs on master and release branches, not ${branch}`); + return; + } + if (!fs.existsSync(allConfigDetailsPath)) { console.error(`configuration file at ${allConfigDetailsPath} does not exist`); return; From 5348cd831e6fcfeb604d2e8e7473b5a87098dc60 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Wed, 4 Oct 2017 11:48:37 -0700 Subject: [PATCH 036/158] Fix terminal links sometimes not getting applied Fixes #35552 --- npm-shrinkwrap.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index 094d0fac680..d6d05275089 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -574,7 +574,7 @@ "xterm": { "version": "2.9.1", "from": "Tyriar/xterm.js#vscode-release/1.18", - "resolved": "git+https://github.com/Tyriar/xterm.js.git#45eadc82ffeac0dde3bb6e6b7e1b7635d2d9577d" + "resolved": "git+https://github.com/Tyriar/xterm.js.git#1f5d0a878dd1e187c992535302d9f272eb9c26f5" }, "yauzl": { "version": "2.8.0", From 2e2613f7739c31832496f617356f5fb8eadc2ca1 Mon Sep 17 00:00:00 2001 From: Rob Lourens Date: Wed, 4 Oct 2017 14:46:16 -0700 Subject: [PATCH 037/158] bump node-debug (loc) --- build/gulpfile.vscode.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/gulpfile.vscode.js b/build/gulpfile.vscode.js index fe31d24cb18..0d4d70aa0e5 100644 --- a/build/gulpfile.vscode.js +++ b/build/gulpfile.vscode.js @@ -45,7 +45,7 @@ const nodeModules = ['electron', 'original-fs'] // Build const builtInExtensions = [ - { name: 'ms-vscode.node-debug', version: '1.17.17' }, + { name: 'ms-vscode.node-debug', version: '1.17.18' }, { name: 'ms-vscode.node-debug2', version: '1.17.6' } ]; From 88d120e0d9e784e03a2ac2128d7457df48dab55f Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Thu, 5 Oct 2017 08:10:26 +0200 Subject: [PATCH 038/158] Wrong window put to focus in this case (fixes #35295) --- src/vs/code/electron-main/windows.ts | 38 ++++++++++++++++++++-------- 1 file changed, 28 insertions(+), 10 deletions(-) diff --git a/src/vs/code/electron-main/windows.ts b/src/vs/code/electron-main/windows.ts index 67dd97a9d4e..60fb222d226 100644 --- a/src/vs/code/electron-main/windows.ts +++ b/src/vs/code/electron-main/windows.ts @@ -420,24 +420,42 @@ export class WindowsManager implements IWindowsMainService { // Open based on config const usedWindows = this.doOpen(openConfig, workspacesToOpen, workspacesToRestore, foldersToOpen, foldersToRestore, emptyToRestore, emptyToOpen, filesToOpen, filesToCreate, filesToDiff, filesToWait, foldersToAdd); - // Make sure to pass focus to one of the windows if we open multiple + // Make sure to pass focus to the most relevant of the windows if we open multiple if (usedWindows.length > 1) { - let focusLast = true; + let focusLastActive = this.windowsState.lastActiveWindow && !openConfig.forceEmpty && !openConfig.cli._.length && (!openConfig.pathsToOpen || !openConfig.pathsToOpen.length); + let focusLastOpened = true; + let focusLastWindow = true; - // Only focus the last active window if the user did not open a specific path via - // CLI or API. In those cases we do not want windows to get focus from previous - // session but actually one of the windows the user explicitly asked to open. - const focusLastActive = !openConfig.forceEmpty && !openConfig.cli._.length && (!openConfig.pathsToOpen || !openConfig.pathsToOpen.length); - if (focusLastActive && this.windowsState.lastActiveWindow) { + // 1.) focus last active window if we are not instructed to open any paths + if (focusLastActive) { const lastActiveWindw = usedWindows.filter(w => w.backupPath === this.windowsState.lastActiveWindow.backupPath); if (lastActiveWindw.length) { lastActiveWindw[0].focus(); - focusLast = false; + focusLastOpened = false; + focusLastWindow = false; } } - // Otherwise: focus last window we opened - if (focusLast) { + // 2.) if instructed to open paths, focus last window which is not restored + if (focusLastOpened) { + for (let i = usedWindows.length - 1; i >= 0; i--) { + const usedWindow = usedWindows[i]; + if ( + (usedWindow.openedWorkspace && workspacesToRestore.some(workspace => workspace.id === usedWindow.openedWorkspace.id)) || // skip over restored workspace + (usedWindow.openedFolderPath && foldersToRestore.some(folder => folder === usedWindow.openedFolderPath)) || // skip over restored folder + (usedWindow.backupPath && emptyToRestore.some(empty => empty === basename(usedWindow.backupPath))) // skip over restored empty window + ) { + continue; + } + + usedWindow.focus(); + focusLastWindow = false; + break; + } + } + + // 3.) finally, always ensure to have at least last used window focused + if (focusLastWindow) { usedWindows[usedWindows.length - 1].focus(); } } From ea2b47053aaa768bbb4b94c7961f4f9bdbdbf1e1 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Thu, 5 Oct 2017 09:31:49 +0200 Subject: [PATCH 039/158] remove unecessary warning fixes #35577 --- src/vs/platform/environment/node/environmentService.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/platform/environment/node/environmentService.ts b/src/vs/platform/environment/node/environmentService.ts index 0270370c755..d442c7ee2d5 100644 --- a/src/vs/platform/environment/node/environmentService.ts +++ b/src/vs/platform/environment/node/environmentService.ts @@ -144,7 +144,7 @@ export class EnvironmentService implements IEnvironmentService { try { fs.writeFileSync(machineIdPath, this.machineUUID, 'utf8'); } catch (err) { - console.warn('Could not store machine ID'); + // noop } } From 1c9777dbcc5cd5963ed0c38bb1f664510353bd21 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Thu, 5 Oct 2017 09:47:42 +0200 Subject: [PATCH 040/158] tests - less output when running --- .../test/node/configuration.test.ts | 58 ++++--------------- 1 file changed, 11 insertions(+), 47 deletions(-) diff --git a/src/vs/workbench/services/configuration/test/node/configuration.test.ts b/src/vs/workbench/services/configuration/test/node/configuration.test.ts index 8073bb82a98..ea5d59653ca 100644 --- a/src/vs/workbench/services/configuration/test/node/configuration.test.ts +++ b/src/vs/workbench/services/configuration/test/node/configuration.test.ts @@ -150,6 +150,17 @@ suite('WorkspaceConfigurationService - Node', () => { } }); + configurationRegistry.registerConfiguration({ + 'id': '_test', + 'type': 'object', + 'properties': { + 'workspaceLookup.service.testSetting': { + 'type': 'string', + 'default': 'isSet' + } + } + }); + createWorkspace((workspaceDir, globalSettingsFile, cleanUp) => { return createService(workspaceDir, globalSettingsFile).then(service => { const config = service.getConfiguration(); @@ -213,18 +224,6 @@ suite('WorkspaceConfigurationService - Node', () => { }; } - const configurationRegistry = Registry.as(ConfigurationExtensions.Configuration); - configurationRegistry.registerConfiguration({ - 'id': '_test_workspace', - 'type': 'object', - 'properties': { - 'workspace.service.testSetting': { - 'type': 'string', - 'default': 'isSet' - } - } - }); - createWorkspace((workspaceDir, globalSettingsFile, cleanUp) => { return createService(workspaceDir, globalSettingsFile).then(service => { fs.writeFileSync(globalSettingsFile, '{ "workspace.service.testSetting": "isChanged" }'); @@ -357,18 +356,6 @@ suite('WorkspaceConfigurationService - Node', () => { test('lookup', (done: () => void) => { - const configurationRegistry = Registry.as(ConfigurationExtensions.Configuration); - configurationRegistry.registerConfiguration({ - 'id': '_test', - 'type': 'object', - 'properties': { - 'workspaceLookup.service.testSetting': { - 'type': 'string', - 'default': 'isSet' - } - } - }); - createWorkspace((workspaceDir, globalSettingsFile, cleanUp) => { return createService(workspaceDir, globalSettingsFile).then(service => { let res = service.lookup('something.missing'); @@ -414,17 +401,6 @@ suite('WorkspaceConfigurationService - Node', () => { }); test('keys', (done: () => void) => { - const configurationRegistry = Registry.as(ConfigurationExtensions.Configuration); - configurationRegistry.registerConfiguration({ - 'id': '_test', - 'type': 'object', - 'properties': { - 'workspaceLookup.service.testSetting': { - 'type': 'string', - 'default': 'isSet' - } - } - }); function contains(array: string[], key: string): boolean { return array.indexOf(key) >= 0; @@ -482,18 +458,6 @@ suite('WorkspaceConfigurationService - Node', () => { }); test('values', (done: () => void) => { - const configurationRegistry = Registry.as(ConfigurationExtensions.Configuration); - configurationRegistry.registerConfiguration({ - 'id': '_test', - 'type': 'object', - 'properties': { - 'workspaceLookup.service.testSetting': { - 'type': 'string', - 'default': 'isSet' - } - } - }); - createWorkspace((workspaceDir, globalSettingsFile, cleanUp) => { return createService(workspaceDir, globalSettingsFile).then(service => { let values = service.values(); From c25c04856a1da46a580823c0eeb8a330154e59c7 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Thu, 5 Oct 2017 10:21:59 +0200 Subject: [PATCH 041/158] deliver missing changes --- src/vs/editor/standalone/test/browser/simpleServices.test.ts | 3 ++- src/vs/platform/keybinding/common/abstractKeybindingService.ts | 1 + .../keybinding/test/common/abstractKeybindingService.test.ts | 3 ++- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/vs/editor/standalone/test/browser/simpleServices.test.ts b/src/vs/editor/standalone/test/browser/simpleServices.test.ts index 12aaaad2825..e2a6120ec59 100644 --- a/src/vs/editor/standalone/test/browser/simpleServices.test.ts +++ b/src/vs/editor/standalone/test/browser/simpleServices.test.ts @@ -11,6 +11,7 @@ import { InstantiationService } from 'vs/platform/instantiation/common/instantia import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection'; import { KeyCode } from 'vs/base/common/keyCodes'; import { IKeyboardEvent } from 'vs/platform/keybinding/common/keybinding'; +import { NullTelemetryService } from 'vs/platform/telemetry/common/telemetryUtils'; suite('StandaloneKeybindingService', () => { @@ -35,7 +36,7 @@ suite('StandaloneKeybindingService', () => { let domElement = document.createElement('div'); - let keybindingService = new TestStandaloneKeybindingService(contextKeyService, commandService, messageService, domElement); + let keybindingService = new TestStandaloneKeybindingService(contextKeyService, commandService, NullTelemetryService, messageService, domElement); let commandInvoked = false; keybindingService.addDynamicKeybinding('testCommand', KeyCode.F9, () => { diff --git a/src/vs/platform/keybinding/common/abstractKeybindingService.ts b/src/vs/platform/keybinding/common/abstractKeybindingService.ts index c933039914b..85e8ad8165a 100644 --- a/src/vs/platform/keybinding/common/abstractKeybindingService.ts +++ b/src/vs/platform/keybinding/common/abstractKeybindingService.ts @@ -47,6 +47,7 @@ export abstract class AbstractKeybindingService implements IKeybindingService { ) { this._contextKeyService = contextKeyService; this._commandService = commandService; + this._telemetryService = telemetryService; this._statusService = statusService; this._messageService = messageService; diff --git a/src/vs/platform/keybinding/test/common/abstractKeybindingService.test.ts b/src/vs/platform/keybinding/test/common/abstractKeybindingService.test.ts index f5cc9fb7984..e0ce67f7b53 100644 --- a/src/vs/platform/keybinding/test/common/abstractKeybindingService.test.ts +++ b/src/vs/platform/keybinding/test/common/abstractKeybindingService.test.ts @@ -19,6 +19,7 @@ import { TPromise } from 'vs/base/common/winjs.base'; import { ResolvedKeybindingItem } from 'vs/platform/keybinding/common/resolvedKeybindingItem'; import { OS } from 'vs/base/common/platform'; import { IKeyboardEvent } from 'vs/platform/keybinding/common/keybinding'; +import { NullTelemetryService } from 'vs/platform/telemetry/common/telemetryUtils'; function createContext(ctx: any) { return { @@ -40,7 +41,7 @@ suite('AbstractKeybindingService', () => { messageService: IMessageService, statusService?: IStatusbarService ) { - super(contextKeyService, commandService, messageService, statusService); + super(contextKeyService, commandService, NullTelemetryService, messageService, statusService); this._resolver = resolver; } From 4f3937f04e15254fb9cc6dc34af3b23587c474f6 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Thu, 5 Oct 2017 10:27:16 +0200 Subject: [PATCH 042/158] expose "Save All Files" command --- .../workbench/parts/files/browser/fileActions.contribution.ts | 2 +- src/vs/workbench/parts/files/browser/fileActions.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/parts/files/browser/fileActions.contribution.ts b/src/vs/workbench/parts/files/browser/fileActions.contribution.ts index c64ab4ad996..4ef7d6dbee0 100644 --- a/src/vs/workbench/parts/files/browser/fileActions.contribution.ts +++ b/src/vs/workbench/parts/files/browser/fileActions.contribution.ts @@ -191,7 +191,7 @@ const registry = Registry.as(ActionExtensions.Workbenc registry.registerWorkbenchAction(new SyncActionDescriptor(GlobalCopyPathAction, GlobalCopyPathAction.ID, GlobalCopyPathAction.LABEL, { primary: KeyChord(KeyMod.CtrlCmd | KeyCode.KEY_K, KeyCode.KEY_P) }), 'Files: Copy Path of Active File', category); registry.registerWorkbenchAction(new SyncActionDescriptor(SaveFileAction, SaveFileAction.ID, SaveFileAction.LABEL, { primary: KeyMod.CtrlCmd | KeyCode.KEY_S }), 'Files: Save', category); registry.registerWorkbenchAction(new SyncActionDescriptor(SaveAllAction, SaveAllAction.ID, SaveAllAction.LABEL, { primary: void 0, mac: { primary: KeyMod.CtrlCmd | KeyMod.Alt | KeyCode.KEY_S }, win: { primary: KeyChord(KeyMod.CtrlCmd | KeyCode.KEY_K, KeyCode.KEY_S) } }), 'Files: Save All', category); -registry.registerWorkbenchAction(new SyncActionDescriptor(SaveFilesAction, SaveFilesAction.ID, null /* only for programmatic trigger */), null); +registry.registerWorkbenchAction(new SyncActionDescriptor(SaveFilesAction, SaveFilesAction.ID, SaveFilesAction.LABEL), 'Files: Save All Files', category); registry.registerWorkbenchAction(new SyncActionDescriptor(RevertFileAction, RevertFileAction.ID, RevertFileAction.LABEL), 'Files: Revert File', category); registry.registerWorkbenchAction(new SyncActionDescriptor(GlobalNewFileAction, GlobalNewFileAction.ID, GlobalNewFileAction.LABEL), 'Files: New File', category); registry.registerWorkbenchAction(new SyncActionDescriptor(GlobalNewFolderAction, GlobalNewFolderAction.ID, GlobalNewFolderAction.LABEL), 'Files: New Folder', category); diff --git a/src/vs/workbench/parts/files/browser/fileActions.ts b/src/vs/workbench/parts/files/browser/fileActions.ts index 03004325482..b7d894b6eee 100644 --- a/src/vs/workbench/parts/files/browser/fileActions.ts +++ b/src/vs/workbench/parts/files/browser/fileActions.ts @@ -1652,7 +1652,7 @@ export class SaveAllInGroupAction extends BaseSaveAllAction { export class SaveFilesAction extends BaseSaveAllAction { public static ID = 'workbench.action.files.saveFiles'; - public static LABEL = nls.localize('saveFiles', "Save Dirty Files"); + public static LABEL = nls.localize('saveFiles', "Save All Files"); protected getSaveAllArguments(): boolean { return this.includeUntitled(); From 846bb83d19aafb433ba3f716df91ca202651895c Mon Sep 17 00:00:00 2001 From: Dirk Baeumer Date: Thu, 5 Oct 2017 11:03:55 +0200 Subject: [PATCH 043/158] Enables #35333 --- .../parts/tasks/electron-browser/task.contribution.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/vs/workbench/parts/tasks/electron-browser/task.contribution.ts b/src/vs/workbench/parts/tasks/electron-browser/task.contribution.ts index 66fe980eaf3..33f2fc8435b 100644 --- a/src/vs/workbench/parts/tasks/electron-browser/task.contribution.ts +++ b/src/vs/workbench/parts/tasks/electron-browser/task.contribution.ts @@ -797,6 +797,10 @@ class TaskService extends EventEmitter implements ITaskService { } public getTask(folder: IWorkspaceFolder | string, alias: string): TPromise { + let name = Types.isString(folder) ? folder : folder.name; + if (this.ignoredWorkspaceFolders.some(ignored => ignored.name === name)) { + return TPromise.wrapError(new Error(nls.localize('TaskServer.folderIgnored', 'The folder {0} is ignored since it uses task version 0.1.0', name))); + } return this.getGroupedTasks().then((map) => { let values = map.get(folder); if (!values) { From 36c73271e75b9f73325859f834b13b70ba4db35a Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Thu, 5 Oct 2017 12:47:45 +0200 Subject: [PATCH 044/158] Workspaces: add a command to open a folder as workspace in separate window (fixes #35619) --- .../browser/actions/workspaceActions.ts | 47 ++++++++++++++++++- .../electron-browser/main.contribution.ts | 3 +- .../workspace/common/workspaceEditing.ts | 5 ++ .../workspace/node/workspaceEditingService.ts | 15 +++--- 4 files changed, 61 insertions(+), 9 deletions(-) diff --git a/src/vs/workbench/browser/actions/workspaceActions.ts b/src/vs/workbench/browser/actions/workspaceActions.ts index b154a0b6f21..42c24fad003 100644 --- a/src/vs/workbench/browser/actions/workspaceActions.ts +++ b/src/vs/workbench/browser/actions/workspaceActions.ts @@ -9,14 +9,14 @@ import { TPromise } from 'vs/base/common/winjs.base'; import { Action } from 'vs/base/common/actions'; import nls = require('vs/nls'); import { distinct } from 'vs/base/common/arrays'; -import { IWindowService } from 'vs/platform/windows/common/windows'; +import { IWindowService, IWindowsService } from 'vs/platform/windows/common/windows'; import { ITelemetryData } from 'vs/platform/telemetry/common/telemetry'; import { IWorkspaceContextService, WorkbenchState, IWorkspaceFolder } from 'vs/platform/workspace/common/workspace'; import { IWorkspaceEditingService } from 'vs/workbench/services/workspace/common/workspaceEditing'; import URI from 'vs/base/common/uri'; import { IViewletService } from 'vs/workbench/services/viewlet/browser/viewlet'; import { IInstantiationService, ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; -import { WORKSPACE_FILTER } from 'vs/platform/workspaces/common/workspaces'; +import { WORKSPACE_FILTER, IWorkspacesService } from 'vs/platform/workspaces/common/workspaces'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { isLinux } from 'vs/base/common/platform'; import { dirname } from 'vs/base/common/paths'; @@ -320,6 +320,49 @@ export class OpenWorkspaceConfigFileAction extends Action { } } +export class OpenFolderAsWorkspaceInNewWindowAction extends Action { + + public static ID = 'workbench.action.openFolderAsWorkspaceInNewWindow'; + public static LABEL = nls.localize('openFolderAsWorkspaceInNewWindow', "Open Folder as Workspace in New Window"); + + constructor( + id: string, + label: string, + @IWorkspaceContextService private workspaceContextService: IWorkspaceContextService, + @IWorkspaceEditingService private workspaceEditingService: IWorkspaceEditingService, + @IWindowsService private windowsService: IWindowsService, + @ICommandService private commandService: ICommandService, + @IWorkspacesService private workspacesService: IWorkspacesService + ) { + super(id, label); + } + + public run(): TPromise { + const folders = this.workspaceContextService.getWorkspace().folders; + + let folderPromise: TPromise; + if (folders.length === 0) { + folderPromise = TPromise.as(null); + } else if (folders.length === 1) { + folderPromise = TPromise.as(folders[0]); + } else { + folderPromise = this.commandService.executeCommand(PICK_WORKSPACE_FOLDER_COMMAND); + } + + return folderPromise.then(folder => { + if (!folder) { + return void 0; // need at least one folder + } + + return this.workspacesService.createWorkspace([folder.uri.fsPath]).then(newWorkspace => { + return this.workspaceEditingService.copyWorkspaceSettings(newWorkspace).then(() => { + return this.windowsService.openWindow([newWorkspace.configPath], { forceNewWindow: true }); + }); + }); + }); + } +} + export const PICK_WORKSPACE_FOLDER_COMMAND = '_workbench.pickWorkspaceFolder'; CommandsRegistry.registerCommand(PICK_WORKSPACE_FOLDER_COMMAND, function (accessor: ServicesAccessor, args?: [IPickOptions, CancellationToken]) { diff --git a/src/vs/workbench/electron-browser/main.contribution.ts b/src/vs/workbench/electron-browser/main.contribution.ts index 93bac904d3c..dc469437580 100644 --- a/src/vs/workbench/electron-browser/main.contribution.ts +++ b/src/vs/workbench/electron-browser/main.contribution.ts @@ -18,7 +18,7 @@ import { CloseEditorAction, KeybindingsReferenceAction, OpenDocumentationUrlActi import { MessagesVisibleContext } from 'vs/workbench/electron-browser/workbench'; import { IJSONSchema } from 'vs/base/common/jsonSchema'; import { registerCommands } from 'vs/workbench/electron-browser/commands'; -import { AddRootFolderAction, GlobalRemoveRootFolderAction, OpenWorkspaceAction, SaveWorkspaceAsAction, OpenWorkspaceConfigFileAction } from 'vs/workbench/browser/actions/workspaceActions'; +import { AddRootFolderAction, GlobalRemoveRootFolderAction, OpenWorkspaceAction, SaveWorkspaceAsAction, OpenWorkspaceConfigFileAction, OpenFolderAsWorkspaceInNewWindowAction } from 'vs/workbench/browser/actions/workspaceActions'; import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; import { inQuickOpenContext, getQuickNavigateHandler } from 'vs/workbench/browser/parts/quickopen/quickopen'; import { KeybindingsRegistry } from 'vs/platform/keybinding/common/keybindingsRegistry'; @@ -92,6 +92,7 @@ if (product.quality !== 'stable') { workbenchActionsRegistry.registerWorkbenchAction(new SyncActionDescriptor(OpenWorkspaceAction, OpenWorkspaceAction.ID, OpenWorkspaceAction.LABEL), 'Workspaces: Open Workspace...', workspacesCategory); workbenchActionsRegistry.registerWorkbenchAction(new SyncActionDescriptor(SaveWorkspaceAsAction, SaveWorkspaceAsAction.ID, SaveWorkspaceAsAction.LABEL), 'Workspaces: Save Workspace As...', workspacesCategory); workbenchActionsRegistry.registerWorkbenchAction(new SyncActionDescriptor(OpenWorkspaceConfigFileAction, OpenWorkspaceConfigFileAction.ID, OpenWorkspaceConfigFileAction.LABEL), 'Workspaces: Open Workspace Configuration File', workspacesCategory); + workbenchActionsRegistry.registerWorkbenchAction(new SyncActionDescriptor(OpenFolderAsWorkspaceInNewWindowAction, OpenFolderAsWorkspaceInNewWindowAction.ID, OpenFolderAsWorkspaceInNewWindowAction.LABEL), 'Workspaces: Open Folder as Workspace in New Window', workspacesCategory); } // Developer related actions diff --git a/src/vs/workbench/services/workspace/common/workspaceEditing.ts b/src/vs/workbench/services/workspace/common/workspaceEditing.ts index 7a9a1783ee2..9530e812b94 100644 --- a/src/vs/workbench/services/workspace/common/workspaceEditing.ts +++ b/src/vs/workbench/services/workspace/common/workspaceEditing.ts @@ -35,6 +35,11 @@ export interface IWorkspaceEditingService { * saves the workspace to the provided path and opens it. requires a workspace to be opened. */ saveAndEnterWorkspace(path: string): TPromise; + + /** + * copies current workspace settings to the target workspace. + */ + copyWorkspaceSettings(toWorkspace: IWorkspaceIdentifier): TPromise; } export const IWorkspaceMigrationService = createDecorator('workspaceMigrationService'); diff --git a/src/vs/workbench/services/workspace/node/workspaceEditingService.ts b/src/vs/workbench/services/workspace/node/workspaceEditingService.ts index aa99ca9f75a..1769020d70c 100644 --- a/src/vs/workbench/services/workspace/node/workspaceEditingService.ts +++ b/src/vs/workbench/services/workspace/node/workspaceEditingService.ts @@ -165,9 +165,16 @@ export class WorkspaceEditingService implements IWorkspaceEditingService { } private migrate(toWorkspace: IWorkspaceIdentifier): TPromise { + + // Storage (UI State) migration this.migrateStorage(toWorkspace); - return this.migrateConfiguration(toWorkspace); + // Settings migration (only if we come from a folder workspace) + if (this.contextService.getWorkbenchState() === WorkbenchState.FOLDER) { + return this.copyWorkspaceSettings(toWorkspace); + } + + return TPromise.as(void 0); } private migrateStorage(toWorkspace: IWorkspaceIdentifier): void { @@ -178,11 +185,7 @@ export class WorkspaceEditingService implements IWorkspaceEditingService { storageImpl.setWorkspaceId(newWorkspaceId); } - private migrateConfiguration(toWorkspace: IWorkspaceIdentifier): TPromise { - if (this.contextService.getWorkbenchState() !== WorkbenchState.FOLDER) { - return TPromise.as(void 0); // return early if not a folder workspace is opened - } - + public copyWorkspaceSettings(toWorkspace: IWorkspaceIdentifier): TPromise { const configurationProperties = Registry.as(ConfigurationExtensions.Configuration).getConfigurationProperties(); const targetWorkspaceConfiguration = {}; for (const key of this.workspaceConfigurationService.keys().workspace) { From fd2db46fd196387555e35a1d30799337e2688f07 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Thu, 5 Oct 2017 13:08:17 +0200 Subject: [PATCH 045/158] fixes #35537 --- src/vs/workbench/browser/parts/views/viewsViewlet.ts | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/browser/parts/views/viewsViewlet.ts b/src/vs/workbench/browser/parts/views/viewsViewlet.ts index e849116bb98..29e5639eacd 100644 --- a/src/vs/workbench/browser/parts/views/viewsViewlet.ts +++ b/src/vs/workbench/browser/parts/views/viewsViewlet.ts @@ -211,9 +211,8 @@ export class ViewsViewlet extends PanelViewlet { private viewHeaderContextMenuListeners: IDisposable[] = []; private viewletSettings: object; private readonly viewsContextKeys: Set = new Set(); - private viewsViewletPanels: ViewsViewletPanel[] = []; - + private didLayout = false; protected viewsStates: Map = new Map(); private areExtensionsReady: boolean = false; @@ -272,6 +271,11 @@ export class ViewsViewlet extends PanelViewlet { layout(dimension: Dimension): void { super.layout(dimension); + if (!this.didLayout) { + this.didLayout = true; + this._resizePanels(); + } + for (const view of this.viewsViewletPanels) { let viewState = this.updateViewStateSize(view); this.viewsStates.set(view.id, viewState); @@ -416,6 +420,10 @@ export class ViewsViewlet extends PanelViewlet { } private _resizePanels(): void { + if (!this.didLayout) { + return; + } + for (const panel of this.viewsViewletPanels) { const viewState = this.viewsStates.get(panel.id); const size = (viewState && viewState.size) || 200; From e697723f948f0d3a8c8118eee51c614a8cc321da Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Thu, 5 Oct 2017 14:43:47 +0200 Subject: [PATCH 046/158] tweak WinJS.Promise definition --- src/vs/base/common/winjs.base.d.ts | 4 ++-- src/vs/monaco.d.ts | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/vs/base/common/winjs.base.d.ts b/src/vs/base/common/winjs.base.d.ts index 54cfd1ada1c..a0ec0a59013 100644 --- a/src/vs/base/common/winjs.base.d.ts +++ b/src/vs/base/common/winjs.base.d.ts @@ -13,7 +13,7 @@ export declare class Promise { resolve: (value: T | PromiseLike) => void, reject: (reason: any) => void, progress: (progress: TProgress) => void) => void, - oncancel?: () => void); + oncancel?: () => void); public then( onfulfilled?: ((value: T) => TResult1 | PromiseLike) | null, @@ -29,7 +29,7 @@ export declare class Promise { public static as(value: null): Promise; public static as(value: undefined): Promise; - public static as>(value: TPromise): TPromise; + public static as>(value: SomePromise): SomePromise; public static as(value: T): Promise; public static is(value: any): value is PromiseLike; diff --git a/src/vs/monaco.d.ts b/src/vs/monaco.d.ts index 15c5bef831a..c43c2f05b34 100644 --- a/src/vs/monaco.d.ts +++ b/src/vs/monaco.d.ts @@ -61,7 +61,7 @@ declare module monaco { public static as(value: null): Promise; public static as(value: undefined): Promise; - public static as>(value: TPromise): TPromise; + public static as>(value: SomePromise): SomePromise; public static as(value: T): Promise; public static is(value: any): value is PromiseLike; From ee4faf5274343ced098e73cfed6db7dbd2b349ed Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Thu, 5 Oct 2017 14:54:26 +0200 Subject: [PATCH 047/158] redefine IIterator to be a ES6 iterator --- src/vs/base/common/iterator.ts | 14 +++++++++----- src/vs/base/common/linkedList.ts | 4 +++- src/vs/base/parts/tree/browser/treeViewModel.ts | 10 +++++----- 3 files changed, 17 insertions(+), 11 deletions(-) diff --git a/src/vs/base/common/iterator.ts b/src/vs/base/common/iterator.ts index 0b19d5e56ae..f930237759c 100644 --- a/src/vs/base/common/iterator.ts +++ b/src/vs/base/common/iterator.ts @@ -5,11 +5,15 @@ 'use strict'; -export interface IIterator { +export interface IIterator { + next(): { done: boolean, value: E }; +} + +export interface INextIterator { next(): T; } -export class ArrayIterator implements IIterator { +export class ArrayIterator implements INextIterator { private items: T[]; protected start: number; @@ -73,16 +77,16 @@ export class ArrayNavigator extends ArrayIterator implements INavigator } -export class MappedIterator implements IIterator { +export class MappedIterator implements INextIterator { - constructor(protected iterator: IIterator, protected fn: (item: T) => R) { + constructor(protected iterator: INextIterator, protected fn: (item: T) => R) { // noop } next() { return this.fn(this.iterator.next()); } } -export interface INavigator extends IIterator { +export interface INavigator extends INextIterator { current(): T; previous(): T; parent(): T; diff --git a/src/vs/base/common/linkedList.ts b/src/vs/base/common/linkedList.ts index a75c81ac4a0..a6be2dc2ee1 100644 --- a/src/vs/base/common/linkedList.ts +++ b/src/vs/base/common/linkedList.ts @@ -5,6 +5,8 @@ 'use strict'; +import { IIterator } from 'vs/base/common/iterator'; + class Node { element: E; next: Node; @@ -87,7 +89,7 @@ export class LinkedList { }; } - iterator() { + iterator(): IIterator { let _done: boolean; let _value: E; let element = { diff --git a/src/vs/base/parts/tree/browser/treeViewModel.ts b/src/vs/base/parts/tree/browser/treeViewModel.ts index f0434f5488a..fb4e6530932 100644 --- a/src/vs/base/parts/tree/browser/treeViewModel.ts +++ b/src/vs/base/parts/tree/browser/treeViewModel.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { EventEmitter } from 'vs/base/common/eventEmitter'; -import { IIterator, ArrayIterator } from 'vs/base/common/iterator'; +import { INextIterator, ArrayIterator } from 'vs/base/common/iterator'; import { Item } from './treeModel'; export interface IViewItem { @@ -30,7 +30,7 @@ export class HeightMap extends EventEmitter { return !last ? 0 : last.top + last.height; } - public onInsertItems(iterator: IIterator, afterItemId: string = null): number { + public onInsertItems(iterator: INextIterator, afterItemId: string = null): number { var item: Item; var viewItem: IViewItem; var i: number, j: number; @@ -90,7 +90,7 @@ export class HeightMap extends EventEmitter { } // Contiguous items - public onRemoveItems(iterator: IIterator): void { + public onRemoveItems(iterator: INextIterator): void { var itemId: string; var viewItem: IViewItem; var startIndex: number = null; @@ -139,7 +139,7 @@ export class HeightMap extends EventEmitter { } // Ordered, but not necessarily contiguous items - public onRefreshItems(iterator: IIterator): void { + public onRefreshItems(iterator: INextIterator): void { var item: Item; var viewItem: IViewItem; var newHeight: number; @@ -240,4 +240,4 @@ export class HeightMap extends EventEmitter { this.heightMap = null; this.indexes = null; } -} \ No newline at end of file +} From e7eb00f6120c6a1a14c8c56dec23c3c266cbcc35 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Thu, 5 Oct 2017 15:06:25 +0200 Subject: [PATCH 048/158] workspaces - allow to create workspace with URI --- .../platform/workspaces/common/workspaces.ts | 4 +++ .../workspaces/common/workspacesIpc.ts | 24 ++++++++++--- .../electron-main/workspacesMainService.ts | 34 ++++++++++++++----- .../workspacesMainService.test.ts | 28 +++++++++++++-- .../browser/actions/workspaceActions.ts | 2 +- .../workspace/node/workspaceEditingService.ts | 6 +++- 6 files changed, 81 insertions(+), 17 deletions(-) diff --git a/src/vs/platform/workspaces/common/workspaces.ts b/src/vs/platform/workspaces/common/workspaces.ts index adaac16ff0b..0d43185ab21 100644 --- a/src/vs/platform/workspaces/common/workspaces.ts +++ b/src/vs/platform/workspaces/common/workspaces.ts @@ -15,6 +15,7 @@ import { IEnvironmentService } from 'vs/platform/environment/common/environment' import Event from 'vs/base/common/event'; import { tildify, getPathLabel } from 'vs/base/common/labels'; import { IWorkspaceFolder } from 'vs/platform/workspace/common/workspace'; +import URI from 'vs/base/common/uri'; export const IWorkspacesMainService = createDecorator('workspacesMainService'); export const IWorkspacesService = createDecorator('workspacesService'); @@ -83,7 +84,9 @@ export interface IWorkspacesMainService extends IWorkspacesService { onUntitledWorkspaceDeleted: Event; saveWorkspace(workspace: IWorkspaceIdentifier, target: string): TPromise; + createWorkspaceSync(folders?: string[]): IWorkspaceIdentifier; + createWorkspaceSync(resources?: URI[]): IWorkspaceIdentifier; resolveWorkspace(path: string): TPromise; resolveWorkspaceSync(path: string): IResolvedWorkspace; @@ -101,6 +104,7 @@ export interface IWorkspacesService { _serviceBrand: any; createWorkspace(folders?: string[]): TPromise; + createWorkspace(resources?: URI[]): TPromise; } export function getWorkspaceLabel(workspace: (IWorkspaceIdentifier | ISingleFolderWorkspaceIdentifier), environmentService: IEnvironmentService, options?: { verbose: boolean }): string { diff --git a/src/vs/platform/workspaces/common/workspacesIpc.ts b/src/vs/platform/workspaces/common/workspacesIpc.ts index 45c495b242f..f45e19db6ee 100644 --- a/src/vs/platform/workspaces/common/workspacesIpc.ts +++ b/src/vs/platform/workspaces/common/workspacesIpc.ts @@ -8,9 +8,10 @@ import { TPromise } from 'vs/base/common/winjs.base'; import { IChannel } from 'vs/base/parts/ipc/common/ipc'; import { IWorkspacesService, IWorkspaceIdentifier } from 'vs/platform/workspaces/common/workspaces'; +import URI from 'vs/base/common/uri'; export interface IWorkspacesChannel extends IChannel { - call(command: 'createWorkspace', arg: [string[]]): TPromise; + call(command: 'createWorkspace', arg: [(string | URI)[]]): TPromise; call(command: string, arg?: any): TPromise; } @@ -20,7 +21,20 @@ export class WorkspacesChannel implements IWorkspacesChannel { call(command: string, arg?: any): TPromise { switch (command) { - case 'createWorkspace': return this.service.createWorkspace(arg); + case 'createWorkspace': { + let folders: any[]; + if (Array.isArray(arg)) { + folders = arg.map(folder => { + if (typeof folder === 'string') { + return folder; + } + + return URI.revive(folder); + }); + } + + return this.service.createWorkspace(folders); + }; } return void 0; @@ -33,7 +47,9 @@ export class WorkspacesChannelClient implements IWorkspacesService { constructor(private channel: IWorkspacesChannel) { } - createWorkspace(folders?: string[]): TPromise { - return this.channel.call('createWorkspace', folders); + createWorkspace(folders?: string[]): TPromise; + createWorkspace(resources?: URI[]): TPromise; + createWorkspace(arg1?: any[]): TPromise { + return this.channel.call('createWorkspace', arg1); } } \ No newline at end of file diff --git a/src/vs/platform/workspaces/electron-main/workspacesMainService.ts b/src/vs/platform/workspaces/electron-main/workspacesMainService.ts index 432850ff32d..261dc966699 100644 --- a/src/vs/platform/workspaces/electron-main/workspacesMainService.ts +++ b/src/vs/platform/workspaces/electron-main/workspacesMainService.ts @@ -5,7 +5,7 @@ 'use strict'; -import { IWorkspacesMainService, IWorkspaceIdentifier, WORKSPACE_EXTENSION, IWorkspaceSavedEvent, UNTITLED_WORKSPACE_NAME, IResolvedWorkspace, IStoredWorkspaceFolder, isRawFileWorkspaceFolder, isStoredWorkspaceFolder } from 'vs/platform/workspaces/common/workspaces'; +import { IWorkspacesMainService, IWorkspaceIdentifier, WORKSPACE_EXTENSION, IWorkspaceSavedEvent, UNTITLED_WORKSPACE_NAME, IResolvedWorkspace, IStoredWorkspaceFolder, isRawFileWorkspaceFolder, isStoredWorkspaceFolder, IRawFileWorkspaceFolder, IRawUriWorkspaceFolder } from 'vs/platform/workspaces/common/workspaces'; import { TPromise } from 'vs/base/common/winjs.base'; import { isParent } from 'vs/platform/files/common/files'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; @@ -120,16 +120,20 @@ export class WorkspacesMainService implements IWorkspacesMainService { return isParent(path, this.environmentService.workspacesHome, !isLinux /* ignore case */); } - public createWorkspace(folders: string[]): TPromise { - const { workspace, configParent, storedWorkspace } = this.createUntitledWorkspace(folders); + public createWorkspace(folders: string[]): TPromise; + public createWorkspace(resources: URI[]): TPromise; + public createWorkspace(arg1: string[] | URI[]): TPromise { + const { workspace, configParent, storedWorkspace } = this.createUntitledWorkspace(arg1); return mkdirp(configParent).then(() => { return writeFile(workspace.configPath, JSON.stringify(storedWorkspace, null, '\t')).then(() => workspace); }); } - public createWorkspaceSync(folders: string[]): IWorkspaceIdentifier { - const { workspace, configParent, storedWorkspace } = this.createUntitledWorkspace(folders); + public createWorkspaceSync(folders: string[]): IWorkspaceIdentifier; + public createWorkspaceSync(resources: URI[]): IWorkspaceIdentifier; + public createWorkspaceSync(arg1: string[] | URI[]): IWorkspaceIdentifier { + const { workspace, configParent, storedWorkspace } = this.createUntitledWorkspace(arg1); if (!existsSync(this.workspacesHome)) { mkdirSync(this.workspacesHome); @@ -142,15 +146,27 @@ export class WorkspacesMainService implements IWorkspacesMainService { return workspace; } - private createUntitledWorkspace(folders: string[]): { workspace: IWorkspaceIdentifier, configParent: string, storedWorkspace: IStoredWorkspace } { + private createUntitledWorkspace(folders: (string | URI)[]): { workspace: IWorkspaceIdentifier, configParent: string, storedWorkspace: IStoredWorkspace } { const randomId = (Date.now() + Math.round(Math.random() * 1000)).toString(); const untitledWorkspaceConfigFolder = join(this.workspacesHome, randomId); const untitledWorkspaceConfigPath = join(untitledWorkspaceConfigFolder, UNTITLED_WORKSPACE_NAME); const storedWorkspace: IStoredWorkspace = { - folders: folders.map(folder => ({ - path: folder - })) + folders: folders.map(folder => { + + // File path + if (typeof folder === 'string') { + return { path: folder } as IRawFileWorkspaceFolder; + } + + // File URI + else if (folder.scheme === 'file') { + return { path: folder.fsPath } as IRawFileWorkspaceFolder; + } + + // Any URI + return { uri: folder.toString(true) } as IRawUriWorkspaceFolder; + }) }; return { diff --git a/src/vs/platform/workspaces/test/electron-main/workspacesMainService.test.ts b/src/vs/platform/workspaces/test/electron-main/workspacesMainService.test.ts index 918dd0ef819..f98a2cdc7db 100644 --- a/src/vs/platform/workspaces/test/electron-main/workspacesMainService.test.ts +++ b/src/vs/platform/workspaces/test/electron-main/workspacesMainService.test.ts @@ -14,7 +14,7 @@ import pfs = require('vs/base/node/pfs'); import { EnvironmentService } from 'vs/platform/environment/node/environmentService'; import { parseArgs } from 'vs/platform/environment/node/argv'; import { WorkspacesMainService, IStoredWorkspace } from 'vs/platform/workspaces/electron-main/workspacesMainService'; -import { WORKSPACE_EXTENSION, IWorkspaceSavedEvent, IWorkspaceIdentifier, IRawFileWorkspaceFolder } from 'vs/platform/workspaces/common/workspaces'; +import { WORKSPACE_EXTENSION, IWorkspaceSavedEvent, IWorkspaceIdentifier, IRawFileWorkspaceFolder, IRawUriWorkspaceFolder } from 'vs/platform/workspaces/common/workspaces'; import { LogMainService } from 'vs/platform/log/common/log'; import URI from 'vs/base/common/uri'; @@ -73,7 +73,7 @@ suite('WorkspacesMainService', () => { }); }); - test('createWorkspaceSync (folders)', () => { + test('createWorkspaceSync (folders as paths)', () => { const workspace = service.createWorkspaceSync([process.cwd(), os.tmpdir()]); assert.ok(workspace); assert.ok(fs.existsSync(workspace.configPath)); @@ -85,6 +85,30 @@ suite('WorkspacesMainService', () => { assert.equal((ws.folders[1]).path, os.tmpdir()); }); + test('createWorkspaceSync (folders as file URIs)', () => { + const workspace = service.createWorkspaceSync([URI.file(process.cwd()), URI.file(os.tmpdir())]); + assert.ok(workspace); + assert.ok(fs.existsSync(workspace.configPath)); + assert.ok(service.isUntitledWorkspace(workspace)); + + const ws = JSON.parse(fs.readFileSync(workspace.configPath).toString()) as IStoredWorkspace; + assert.equal(ws.folders.length, 2); // + assert.equal((ws.folders[0]).path, process.cwd()); + assert.equal((ws.folders[1]).path, os.tmpdir()); + }); + + test('createWorkspaceSync (folders as other resource URIs)', () => { + const workspace = service.createWorkspaceSync([URI.from({ scheme: 'myScheme', path: process.cwd() }), URI.from({ scheme: 'myScheme', path: os.tmpdir() })]); + assert.ok(workspace); + assert.ok(fs.existsSync(workspace.configPath)); + assert.ok(service.isUntitledWorkspace(workspace)); + + const ws = JSON.parse(fs.readFileSync(workspace.configPath).toString()) as IStoredWorkspace; + assert.equal(ws.folders.length, 2); // + assert.equal((ws.folders[0]).uri, URI.from({ scheme: 'myScheme', path: process.cwd() }).toString()); + assert.equal((ws.folders[1]).uri, URI.from({ scheme: 'myScheme', path: os.tmpdir() })); + }); + test('resolveWorkspaceSync', done => { return service.createWorkspace([process.cwd(), os.tmpdir()]).then(workspace => { assert.ok(service.resolveWorkspaceSync(workspace.configPath)); diff --git a/src/vs/workbench/browser/actions/workspaceActions.ts b/src/vs/workbench/browser/actions/workspaceActions.ts index 42c24fad003..99385465bd6 100644 --- a/src/vs/workbench/browser/actions/workspaceActions.ts +++ b/src/vs/workbench/browser/actions/workspaceActions.ts @@ -354,7 +354,7 @@ export class OpenFolderAsWorkspaceInNewWindowAction extends Action { return void 0; // need at least one folder } - return this.workspacesService.createWorkspace([folder.uri.fsPath]).then(newWorkspace => { + return this.workspacesService.createWorkspace([folder.uri]).then(newWorkspace => { return this.workspaceEditingService.copyWorkspaceSettings(newWorkspace).then(() => { return this.windowsService.openWindow([newWorkspace.configPath], { forceNewWindow: true }); }); diff --git a/src/vs/workbench/services/workspace/node/workspaceEditingService.ts b/src/vs/workbench/services/workspace/node/workspaceEditingService.ts index 1769020d70c..b96adb83aca 100644 --- a/src/vs/workbench/services/workspace/node/workspaceEditingService.ts +++ b/src/vs/workbench/services/workspace/node/workspaceEditingService.ts @@ -64,11 +64,15 @@ export class WorkspaceEditingService implements IWorkspaceEditingService { return; // already existing } + // File resource: use "path" property if (folderToAdd.scheme === Schemas.file) { storedFoldersToAdd.push({ path: massageFolderPathForWorkspace(folderToAdd.fsPath, workspaceConfigFolder, currentStoredFolders) }); - } else { + } + + // Any other resource: use "uri" property + else { storedFoldersToAdd.push({ uri: folderToAdd.toString(true) }); From 39130b09e65865fd2fcaf0d4cb8dd3c6fb6da7a6 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Thu, 5 Oct 2017 15:09:33 +0200 Subject: [PATCH 049/158] :lipstick: --- src/vs/code/electron-main/windows.ts | 8 ++++---- src/vs/platform/windows/common/windows.ts | 4 ++-- src/vs/platform/windows/common/windowsIpc.ts | 4 ++-- src/vs/platform/windows/electron-browser/windowService.ts | 4 ++-- src/vs/platform/windows/electron-main/windows.ts | 2 +- src/vs/platform/windows/electron-main/windowsService.ts | 4 ++-- src/vs/platform/workspaces/common/workspaces.ts | 8 ++++---- src/vs/platform/workspaces/common/workspacesIpc.ts | 8 ++++---- .../services/workspace/common/workspaceEditing.ts | 2 +- .../services/workspace/node/workspaceEditingService.ts | 4 ++-- src/vs/workbench/test/workbenchTestServices.ts | 4 ++-- 11 files changed, 26 insertions(+), 26 deletions(-) diff --git a/src/vs/code/electron-main/windows.ts b/src/vs/code/electron-main/windows.ts index 60fb222d226..1262489e565 100644 --- a/src/vs/code/electron-main/windows.ts +++ b/src/vs/code/electron-main/windows.ts @@ -1324,8 +1324,8 @@ export class WindowsManager implements IWindowsMainService { return this.workspacesManager.saveAndEnterWorkspace(win, path).then(result => this.doEnterWorkspace(win, result)); } - public createAndEnterWorkspace(win: CodeWindow, folders?: string[], path?: string): TPromise { - return this.workspacesManager.createAndEnterWorkspace(win, folders, path).then(result => this.doEnterWorkspace(win, result)); + public createAndEnterWorkspace(win: CodeWindow, folderPaths?: string[], path?: string): TPromise { + return this.workspacesManager.createAndEnterWorkspace(win, folderPaths, path).then(result => this.doEnterWorkspace(win, result)); } private doEnterWorkspace(win: CodeWindow, result: IEnterWorkspaceResult): IEnterWorkspaceResult { @@ -1686,12 +1686,12 @@ class WorkspacesManager { return this.doSaveAndOpenWorkspace(window, window.openedWorkspace, path); } - public createAndEnterWorkspace(window: CodeWindow, folders?: string[], path?: string): TPromise { + public createAndEnterWorkspace(window: CodeWindow, folderPaths?: string[], path?: string): TPromise { if (!window || !window.win || window.readyState !== ReadyState.READY || !this.isValidTargetWorkspacePath(window, path)) { return TPromise.as(null); // return early if the window is not ready or disposed } - return this.workspacesService.createWorkspace(folders).then(workspace => { + return this.workspacesService.createWorkspace(folderPaths).then(workspace => { return this.doSaveAndOpenWorkspace(window, workspace, path); }); } diff --git a/src/vs/platform/windows/common/windows.ts b/src/vs/platform/windows/common/windows.ts index 6be7162905c..7b73cdba8f6 100644 --- a/src/vs/platform/windows/common/windows.ts +++ b/src/vs/platform/windows/common/windows.ts @@ -48,7 +48,7 @@ export interface IWindowsService { toggleDevTools(windowId: number): TPromise; closeWorkspace(windowId: number): TPromise; openWorkspace(windowId: number): TPromise; - createAndEnterWorkspace(windowId: number, folders?: string[], path?: string): TPromise; + createAndEnterWorkspace(windowId: number, folderPaths?: string[], path?: string): TPromise; saveAndEnterWorkspace(windowId: number, path: string): TPromise; toggleFullScreen(windowId: number): TPromise; setRepresentedFilename(windowId: number, fileName: string): TPromise; @@ -116,7 +116,7 @@ export interface IWindowService { closeWorkspace(): TPromise; openWorkspace(): TPromise; updateTouchBar(items: ICommandAction[][]): TPromise; - createAndEnterWorkspace(folders?: string[], path?: string): TPromise; + createAndEnterWorkspace(folderPaths?: string[], path?: string): TPromise; saveAndEnterWorkspace(path: string): TPromise; toggleFullScreen(): TPromise; setRepresentedFilename(fileName: string): TPromise; diff --git a/src/vs/platform/windows/common/windowsIpc.ts b/src/vs/platform/windows/common/windowsIpc.ts index a99c9fc5fe4..237fadf835f 100644 --- a/src/vs/platform/windows/common/windowsIpc.ts +++ b/src/vs/platform/windows/common/windowsIpc.ts @@ -174,8 +174,8 @@ export class WindowsChannelClient implements IWindowsService { return this.channel.call('openWorkspace', windowId); } - createAndEnterWorkspace(windowId: number, folders?: string[], path?: string): TPromise { - return this.channel.call('createAndEnterWorkspace', [windowId, folders, path]); + createAndEnterWorkspace(windowId: number, folderPaths?: string[], path?: string): TPromise { + return this.channel.call('createAndEnterWorkspace', [windowId, folderPaths, path]); } saveAndEnterWorkspace(windowId: number, path: string): TPromise { diff --git a/src/vs/platform/windows/electron-browser/windowService.ts b/src/vs/platform/windows/electron-browser/windowService.ts index adcffdff958..08008298b52 100644 --- a/src/vs/platform/windows/electron-browser/windowService.ts +++ b/src/vs/platform/windows/electron-browser/windowService.ts @@ -71,8 +71,8 @@ export class WindowService implements IWindowService { return this.windowsService.openWorkspace(this.windowId); } - createAndEnterWorkspace(folders?: string[], path?: string): TPromise { - return this.windowsService.createAndEnterWorkspace(this.windowId, folders, path); + createAndEnterWorkspace(folderPaths?: string[], path?: string): TPromise { + return this.windowsService.createAndEnterWorkspace(this.windowId, folderPaths, path); } saveAndEnterWorkspace(path: string): TPromise { diff --git a/src/vs/platform/windows/electron-main/windows.ts b/src/vs/platform/windows/electron-main/windows.ts index b8396d068fb..ba04b4766e7 100644 --- a/src/vs/platform/windows/electron-main/windows.ts +++ b/src/vs/platform/windows/electron-main/windows.ts @@ -61,7 +61,7 @@ export interface IWindowsMainService { ready(initialUserEnv: IProcessEnvironment): void; reload(win: ICodeWindow, cli?: ParsedArgs): void; openWorkspace(win?: ICodeWindow): void; - createAndEnterWorkspace(win: ICodeWindow, folders?: string[], path?: string): TPromise; + createAndEnterWorkspace(win: ICodeWindow, folderPaths?: string[], path?: string): TPromise; saveAndEnterWorkspace(win: ICodeWindow, path: string): TPromise; closeWorkspace(win: ICodeWindow): void; open(openConfig: IOpenConfiguration): ICodeWindow[]; diff --git a/src/vs/platform/windows/electron-main/windowsService.ts b/src/vs/platform/windows/electron-main/windowsService.ts index ca30a357874..2c3ac1c8934 100644 --- a/src/vs/platform/windows/electron-main/windowsService.ts +++ b/src/vs/platform/windows/electron-main/windowsService.ts @@ -135,11 +135,11 @@ export class WindowsService implements IWindowsService, IDisposable { return TPromise.as(null); } - createAndEnterWorkspace(windowId: number, folders?: string[], path?: string): TPromise { + createAndEnterWorkspace(windowId: number, folderPaths?: string[], path?: string): TPromise { const codeWindow = this.windowsMainService.getWindowById(windowId); if (codeWindow) { - return this.windowsMainService.createAndEnterWorkspace(codeWindow, folders, path); + return this.windowsMainService.createAndEnterWorkspace(codeWindow, folderPaths, path); } return TPromise.as(null); diff --git a/src/vs/platform/workspaces/common/workspaces.ts b/src/vs/platform/workspaces/common/workspaces.ts index 0d43185ab21..f0e4c85463f 100644 --- a/src/vs/platform/workspaces/common/workspaces.ts +++ b/src/vs/platform/workspaces/common/workspaces.ts @@ -85,8 +85,8 @@ export interface IWorkspacesMainService extends IWorkspacesService { saveWorkspace(workspace: IWorkspaceIdentifier, target: string): TPromise; - createWorkspaceSync(folders?: string[]): IWorkspaceIdentifier; - createWorkspaceSync(resources?: URI[]): IWorkspaceIdentifier; + createWorkspaceSync(folderPaths?: string[]): IWorkspaceIdentifier; + createWorkspaceSync(folderResources?: URI[]): IWorkspaceIdentifier; resolveWorkspace(path: string): TPromise; resolveWorkspaceSync(path: string): IResolvedWorkspace; @@ -103,8 +103,8 @@ export interface IWorkspacesMainService extends IWorkspacesService { export interface IWorkspacesService { _serviceBrand: any; - createWorkspace(folders?: string[]): TPromise; - createWorkspace(resources?: URI[]): TPromise; + createWorkspace(folderPaths?: string[]): TPromise; + createWorkspace(folderResources?: URI[]): TPromise; } export function getWorkspaceLabel(workspace: (IWorkspaceIdentifier | ISingleFolderWorkspaceIdentifier), environmentService: IEnvironmentService, options?: { verbose: boolean }): string { diff --git a/src/vs/platform/workspaces/common/workspacesIpc.ts b/src/vs/platform/workspaces/common/workspacesIpc.ts index f45e19db6ee..31235b7a905 100644 --- a/src/vs/platform/workspaces/common/workspacesIpc.ts +++ b/src/vs/platform/workspaces/common/workspacesIpc.ts @@ -19,7 +19,7 @@ export class WorkspacesChannel implements IWorkspacesChannel { constructor(private service: IWorkspacesService) { } - call(command: string, arg?: any): TPromise { + public call(command: string, arg?: any): TPromise { switch (command) { case 'createWorkspace': { let folders: any[]; @@ -47,9 +47,9 @@ export class WorkspacesChannelClient implements IWorkspacesService { constructor(private channel: IWorkspacesChannel) { } - createWorkspace(folders?: string[]): TPromise; - createWorkspace(resources?: URI[]): TPromise; - createWorkspace(arg1?: any[]): TPromise { + public createWorkspace(folderPaths?: string[]): TPromise; + public createWorkspace(folderResources?: URI[]): TPromise; + public createWorkspace(arg1?: any[]): TPromise { return this.channel.call('createWorkspace', arg1); } } \ No newline at end of file diff --git a/src/vs/workbench/services/workspace/common/workspaceEditing.ts b/src/vs/workbench/services/workspace/common/workspaceEditing.ts index 9530e812b94..56f6b473db2 100644 --- a/src/vs/workbench/services/workspace/common/workspaceEditing.ts +++ b/src/vs/workbench/services/workspace/common/workspaceEditing.ts @@ -29,7 +29,7 @@ export interface IWorkspaceEditingService { * creates a new workspace with the provided folders and opens it. if path is provided * the workspace will be saved into that location. */ - createAndEnterWorkspace(folders?: string[], path?: string): TPromise; + createAndEnterWorkspace(folderPaths?: string[], path?: string): TPromise; /** * saves the workspace to the provided path and opens it. requires a workspace to be opened. diff --git a/src/vs/workbench/services/workspace/node/workspaceEditingService.ts b/src/vs/workbench/services/workspace/node/workspaceEditingService.ts index b96adb83aca..934b4c70a19 100644 --- a/src/vs/workbench/services/workspace/node/workspaceEditingService.ts +++ b/src/vs/workbench/services/workspace/node/workspaceEditingService.ts @@ -133,8 +133,8 @@ export class WorkspaceEditingService implements IWorkspaceEditingService { }); } - public createAndEnterWorkspace(folders?: string[], path?: string): TPromise { - return this.doEnterWorkspace(() => this.windowService.createAndEnterWorkspace(folders, path)); + public createAndEnterWorkspace(folderPaths?: string[], path?: string): TPromise { + return this.doEnterWorkspace(() => this.windowService.createAndEnterWorkspace(folderPaths, path)); } public saveAndEnterWorkspace(path: string): TPromise { diff --git a/src/vs/workbench/test/workbenchTestServices.ts b/src/vs/workbench/test/workbenchTestServices.ts index ada172ca08d..d2f8ef1366e 100644 --- a/src/vs/workbench/test/workbenchTestServices.ts +++ b/src/vs/workbench/test/workbenchTestServices.ts @@ -903,7 +903,7 @@ export class TestWindowService implements IWindowService { return TPromise.as(void 0); } - createAndEnterWorkspace(folders?: string[], path?: string): TPromise { + createAndEnterWorkspace(folderPaths?: string[], path?: string): TPromise { return TPromise.as(void 0); } @@ -1051,7 +1051,7 @@ export class TestWindowsService implements IWindowsService { return TPromise.as(void 0); } - createAndEnterWorkspace(windowId: number, folders?: string[], path?: string): TPromise { + createAndEnterWorkspace(windowId: number, folderPaths?: string[], path?: string): TPromise { return TPromise.as(void 0); } From d3e23ae22383417d2e356eb78053d0a354c60f51 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Thu, 5 Oct 2017 15:12:54 +0200 Subject: [PATCH 050/158] make TST#findSuperstr return another TST --- src/vs/base/common/map.ts | 26 +++++++++---------- src/vs/base/test/common/map.test.ts | 15 ++++++----- .../electron-browser/remoteFileService.ts | 3 +-- 3 files changed, 21 insertions(+), 23 deletions(-) diff --git a/src/vs/base/common/map.ts b/src/vs/base/common/map.ts index 2a03c10f6e5..72284c76d1a 100644 --- a/src/vs/base/common/map.ts +++ b/src/vs/base/common/map.ts @@ -418,35 +418,33 @@ export class TernarySearchTree { } else { return node.element || candidate; } - } - findSuperstr(key: string): E[] { + findSuperstr(key: string): TernarySearchTree { const segements = this._segments.reset(key); - const bucket: E[] = []; - this._findSuperstr(this._root, segements.next(), segements, bucket); - return bucket.length ? bucket : undefined; + return this._findSuperstr(this._root, segements.next(), segements); } - private _findSuperstr(node: TernarySearchTreeNode, key: string, segments: IKeySegements, bucket: E[]): void { + private _findSuperstr(node: TernarySearchTreeNode, key: string, segments: IKeySegements): TernarySearchTree { if (!node) { - return; + return undefined; } else if (node.str > key) { // left - this._findSuperstr(node.left, key, segments, bucket); + return this._findSuperstr(node.left, key, segments); } else if (node.str < key) { // right - this._findSuperstr(node.right, key, segments, bucket); + return this._findSuperstr(node.right, key, segments); } else if (segments.hasNext()) { // mid - this._findSuperstr(node.mid, segments.next(), segments, bucket); + return this._findSuperstr(node.mid, segments.next(), segments); } else { // collect - if (node.element) { - bucket.push(node.element); + if (!node.mid) { + return undefined; } - this._forEach(node.mid, [], (entry) => bucket.push(entry[1])); - + let ret = new TernarySearchTree(this._segments); + ret._root = node.mid; + return ret; } } diff --git a/src/vs/base/test/common/map.test.ts b/src/vs/base/test/common/map.test.ts index b5549e82132..e53c60a028b 100644 --- a/src/vs/base/test/common/map.test.ts +++ b/src/vs/base/test/common/map.test.ts @@ -453,15 +453,16 @@ suite('Map', () => { map.set('/usr/foo', 4); const elements = map.findSuperstr('/user'); - const [first, second, third] = elements.sort(); - assert.equal(elements.length, 3); - assert.equal(first, 1); - assert.equal(second, 2); - assert.equal(third, 3); + assertTernarySearchTree(elements, ['foo/bar', 1], ['foo', 2], ['foo/flip/flop', 3]); + // assert.equal(elements.length, 3); + assert.equal(elements.get('foo/bar'), 1); + assert.equal(elements.get('foo'), 2); + assert.equal(elements.get('foo/flip/flop'), 3); - assert.deepEqual(map.findSuperstr('/usr'), [4]); - assert.deepEqual(map.findSuperstr('/usr/foo'), [4]); + assertTernarySearchTree(map.findSuperstr('/usr'), ['foo', 4]); + assert.equal(map.findSuperstr('/usr/foo'), undefined); + assert.equal(map.get('/usr/foo'), 4); assert.equal(map.findSuperstr('/not'), undefined); assert.equal(map.findSuperstr('/us'), undefined); diff --git a/src/vs/workbench/services/files/electron-browser/remoteFileService.ts b/src/vs/workbench/services/files/electron-browser/remoteFileService.ts index c86a09cbae7..1b4f1bcd61d 100644 --- a/src/vs/workbench/services/files/electron-browser/remoteFileService.ts +++ b/src/vs/workbench/services/files/electron-browser/remoteFileService.ts @@ -72,8 +72,7 @@ export function toDeepIFileStat(provider: IFileSystemProvider, tuple: [URI, ISta } return toIFileStat(provider, tuple, candidate => { - const sub = trie.findSuperstr(candidate[0].toString()); - return !!sub; + return Boolean(trie.findSuperstr(candidate[0].toString()) || trie.get(candidate[0].toString())); }); } From 873db2909ddf0fc90bac124fef37d2070e9f9635 Mon Sep 17 00:00:00 2001 From: isidor Date: Thu, 5 Oct 2017 15:40:37 +0200 Subject: [PATCH 051/158] PanelAction -> OpenPanelAction --- src/vs/workbench/browser/parts/panel/panelActions.ts | 2 +- src/vs/workbench/browser/parts/panel/panelPart.ts | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/vs/workbench/browser/parts/panel/panelActions.ts b/src/vs/workbench/browser/parts/panel/panelActions.ts index e4a27f10a31..238b3b33b11 100644 --- a/src/vs/workbench/browser/parts/panel/panelActions.ts +++ b/src/vs/workbench/browser/parts/panel/panelActions.ts @@ -16,7 +16,7 @@ import { IPanelService, IPanelIdentifier } from 'vs/workbench/services/panel/com import { IPartService, Parts } from 'vs/workbench/services/part/common/partService'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; -export class PanelAction extends Action { +export class OpenPanelAction extends Action { constructor( private panel: IPanelIdentifier, diff --git a/src/vs/workbench/browser/parts/panel/panelPart.ts b/src/vs/workbench/browser/parts/panel/panelPart.ts index 9e761d9263e..1608bfe44d2 100644 --- a/src/vs/workbench/browser/parts/panel/panelPart.ts +++ b/src/vs/workbench/browser/parts/panel/panelPart.ts @@ -23,7 +23,7 @@ import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { ActionsOrientation, ActionBar } from 'vs/base/browser/ui/actionbar/actionbar'; -import { ClosePanelAction, PanelAction, ToggleMaximizedPanelAction } from 'vs/workbench/browser/parts/panel/panelActions'; +import { ClosePanelAction, OpenPanelAction, ToggleMaximizedPanelAction } from 'vs/workbench/browser/parts/panel/panelActions'; import { IThemeService, registerThemingParticipant, ITheme, ICssStyleCollector } from 'vs/platform/theme/common/themeService'; import { PANEL_BACKGROUND, PANEL_BORDER, PANEL_ACTIVE_TITLE_FOREGROUND, PANEL_INACTIVE_TITLE_FOREGROUND, PANEL_ACTIVE_TITLE_BORDER } from 'vs/workbench/common/theme'; import { activeContrastBorder, focusBorder, contrastBorder, editorBackground } from 'vs/platform/theme/common/colorRegistry'; @@ -37,7 +37,7 @@ export class PanelPart extends CompositePart implements IPanelService { private blockOpeningPanel: boolean; private panelSwitcherBar: ActionBar; - private panelIdToActions: { [panelId: string]: PanelAction; }; + private panelIdToActions: { [panelId: string]: OpenPanelAction; }; constructor( id: string, @@ -183,7 +183,7 @@ export class PanelPart extends CompositePart implements IPanelService { const panels = this.getPanels(); this.panelSwitcherBar.push(panels.map(panel => { - const action = this.instantiationService.createInstance(PanelAction, panel); + const action = this.instantiationService.createInstance(OpenPanelAction, panel); this.panelIdToActions[panel.id] = action; this.toUnbind.push(action); From 2129f4220aae7c3f81e66d92f8df480397682ff6 Mon Sep 17 00:00:00 2001 From: isidor Date: Thu, 5 Oct 2017 15:52:56 +0200 Subject: [PATCH 052/158] open folder settings in context menu fixes #35583 --- .../browser/actions/workspaceActions.ts | 21 +++++++++++++++++++ .../files/browser/fileActions.contribution.ts | 10 ++++++--- 2 files changed, 28 insertions(+), 3 deletions(-) diff --git a/src/vs/workbench/browser/actions/workspaceActions.ts b/src/vs/workbench/browser/actions/workspaceActions.ts index 99385465bd6..ea253e70218 100644 --- a/src/vs/workbench/browser/actions/workspaceActions.ts +++ b/src/vs/workbench/browser/actions/workspaceActions.ts @@ -226,6 +226,27 @@ export class RemoveRootFolderAction extends Action { } } +export class OpenFolderSettingsAction extends Action { + + static ID = 'workbench.action.openFolderSettings'; + static LABEL = nls.localize('openFolderSettings', "Open Folder Settings"); + + constructor( + private rootUri: URI, + id: string, + label: string, + @IWorkspaceContextService private contextService: IWorkspaceContextService, + @ICommandService private commandService: ICommandService + ) { + super(id, label); + } + + public run(): TPromise { + const workspaceFolder = this.contextService.getWorkspaceFolder(this.rootUri); + return this.commandService.executeCommand('_workbench.action.openFolderSettings', workspaceFolder); + } +} + export class SaveWorkspaceAsAction extends BaseWorkspacesAction { static ID = 'workbench.action.saveWorkspaceAs'; diff --git a/src/vs/workbench/parts/files/browser/fileActions.contribution.ts b/src/vs/workbench/parts/files/browser/fileActions.contribution.ts index 4ef7d6dbee0..aa587300cc4 100644 --- a/src/vs/workbench/parts/files/browser/fileActions.contribution.ts +++ b/src/vs/workbench/parts/files/browser/fileActions.contribution.ts @@ -19,7 +19,7 @@ import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { FileStat, Model } from 'vs/workbench/parts/files/common/explorerModel'; import { KeyMod, KeyChord, KeyCode } from 'vs/base/common/keyCodes'; -import { OpenFolderAction, OpenFileFolderAction, AddRootFolderAction, RemoveRootFolderAction } from 'vs/workbench/browser/actions/workspaceActions'; +import { OpenFolderAction, OpenFileFolderAction, AddRootFolderAction, RemoveRootFolderAction, OpenFolderSettingsAction } from 'vs/workbench/browser/actions/workspaceActions'; import { copyFocusedFilesExplorerViewItem, revealInOSFocusedFilesExplorerItem, openFocusedExplorerItemSideBySideCommand, copyPathOfFocusedExplorerItem, copyPathCommand, revealInExplorerCommand, revealInOSCommand, openFolderPickerCommand, openWindowCommand, openFileInNewWindowCommand, deleteFocusedFilesExplorerViewItemCommand, moveFocusedFilesExplorerViewItemToTrashCommand, renameFocusedFilesExplorerViewItemCommand } from 'vs/workbench/parts/files/browser/fileCommands'; import { CommandsRegistry, ICommandHandler } from 'vs/platform/commands/common/commands'; import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; @@ -96,10 +96,14 @@ class FilesViewerActionContributor extends ActionBarContributor { addRootFolderAction.order = 52; actions.push(addRootFolderAction); + const openFolderSettingsActions = this.instantiationService.createInstance(OpenFolderSettingsAction, stat.resource, OpenFolderSettingsAction.ID, OpenFolderSettingsAction.LABEL); + openFolderSettingsActions.order = 53; + actions.push(openFolderSettingsActions); const removeRootFolderAction = this.instantiationService.createInstance(RemoveRootFolderAction, stat.resource, RemoveRootFolderAction.ID, RemoveRootFolderAction.LABEL); - removeRootFolderAction.order = 53; + removeRootFolderAction.order = 54; actions.push(removeRootFolderAction); - actions.push(new Separator(null, 54)); + + actions.push(new Separator(null, 55)); } // Copy File/Folder From 8a3b7168688c1ff26a09dac90f507811bbfaa468 Mon Sep 17 00:00:00 2001 From: isidor Date: Thu, 5 Oct 2017 16:33:44 +0200 Subject: [PATCH 053/158] explorer: load roots sequentally fixes #34738 --- .../parts/files/browser/views/explorerView.ts | 35 +++++++------------ 1 file changed, 12 insertions(+), 23 deletions(-) diff --git a/src/vs/workbench/parts/files/browser/views/explorerView.ts b/src/vs/workbench/parts/files/browser/views/explorerView.ts index d5b7388c0e0..eb9f3dbdc9b 100644 --- a/src/vs/workbench/parts/files/browser/views/explorerView.ts +++ b/src/vs/workbench/parts/files/browser/views/explorerView.ts @@ -734,11 +734,7 @@ export class ExplorerView extends ViewsViewletPanel { } private doRefresh(targetsToExpand: URI[] = []): TPromise { - const targetsToResolve: { root: FileStat, resource: URI, options: { resolveTo: URI[] } }[] = []; - this.model.roots.forEach(root => { - const rootAndTargets = { root, resource: root.resource, options: { resolveTo: [] } }; - targetsToResolve.push(rootAndTargets); - }); + const targetsToResolve = this.model.roots.map(root => ({ root, resource: root.resource, options: { resolveTo: [] } })); // First time refresh: Receive target through active editor input or selection and also include settings from previous session if (!this.isCreated) { @@ -768,24 +764,11 @@ export class ExplorerView extends ViewsViewletPanel { } // Load Root Stat with given target path configured - const promise = this.fileService.resolveFiles(targetsToResolve).then(results => { + const promise = TPromise.join(targetsToResolve.map((target, index) => this.fileService.resolveFile(target.resource, target.options).then(result => { // Convert to model - const modelStats = results.map((result, index) => { - if (result.success) { - return FileStat.create(result.stat, targetsToResolve[index].root, targetsToResolve[index].options.resolveTo); - } - - return FileStat.create({ - resource: targetsToResolve[index].resource, - name: resources.basenameOrAuthority(targetsToResolve[index].resource), - mtime: 0, - etag: undefined, - isDirectory: true, - hasChildren: false - }, targetsToResolve[index].root); - }); + const modelStat = FileStat.create(result, target.root, target.options.resolveTo); // Subsequent refresh: Merge stat into our local model and refresh tree - modelStats.forEach((modelStat, index) => FileStat.mergeLocalWithDisk(modelStat, this.model.roots[index])); + FileStat.mergeLocalWithDisk(modelStat, this.model.roots[index]); const input = this.contextService.getWorkbenchState() === WorkbenchState.FOLDER ? this.model.roots[0] : this.model; let statsToExpand: FileStat[] = this.explorerViewer.getExpandedElements().concat(targetsToExpand.map(target => this.model.findClosest(target))); @@ -793,7 +776,6 @@ export class ExplorerView extends ViewsViewletPanel { return this.explorerViewer.refresh().then(() => sequence(statsToExpand.map(e => () => this.explorerViewer.expand(e)))); } - // Display roots only when multi folder workspace // Make sure to expand all folders that where expanded in the previous session if (input === this.model) { @@ -801,7 +783,14 @@ export class ExplorerView extends ViewsViewletPanel { statsToExpand = this.model.roots.concat(statsToExpand); } return this.explorerViewer.setInput(input).then(() => sequence(statsToExpand.map(e => () => this.explorerViewer.expand(e)))); - }, e => TPromise.wrapError(e)); + }, e => FileStat.create({ + resource: target.resource, + name: resources.basenameOrAuthority(target.resource), + mtime: 0, + etag: undefined, + isDirectory: true, + hasChildren: false + }, target.root)))); this.progressService.showWhile(promise, this.partService.isCreated() ? 800 : 3200 /* less ugly initial startup */); From 76b23090fdd3b1aa94dd3a24dbbe24f76dce4fae Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Thu, 5 Oct 2017 17:06:56 +0200 Subject: [PATCH 054/158] fix tests --- .../test/electron-main/workspacesMainService.test.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/vs/platform/workspaces/test/electron-main/workspacesMainService.test.ts b/src/vs/platform/workspaces/test/electron-main/workspacesMainService.test.ts index f98a2cdc7db..3adce81a073 100644 --- a/src/vs/platform/workspaces/test/electron-main/workspacesMainService.test.ts +++ b/src/vs/platform/workspaces/test/electron-main/workspacesMainService.test.ts @@ -80,7 +80,7 @@ suite('WorkspacesMainService', () => { assert.ok(service.isUntitledWorkspace(workspace)); const ws = JSON.parse(fs.readFileSync(workspace.configPath).toString()) as IStoredWorkspace; - assert.equal(ws.folders.length, 2); // + assert.equal(ws.folders.length, 2); assert.equal((ws.folders[0]).path, process.cwd()); assert.equal((ws.folders[1]).path, os.tmpdir()); }); @@ -92,7 +92,7 @@ suite('WorkspacesMainService', () => { assert.ok(service.isUntitledWorkspace(workspace)); const ws = JSON.parse(fs.readFileSync(workspace.configPath).toString()) as IStoredWorkspace; - assert.equal(ws.folders.length, 2); // + assert.equal(ws.folders.length, 2); assert.equal((ws.folders[0]).path, process.cwd()); assert.equal((ws.folders[1]).path, os.tmpdir()); }); @@ -104,9 +104,9 @@ suite('WorkspacesMainService', () => { assert.ok(service.isUntitledWorkspace(workspace)); const ws = JSON.parse(fs.readFileSync(workspace.configPath).toString()) as IStoredWorkspace; - assert.equal(ws.folders.length, 2); // - assert.equal((ws.folders[0]).uri, URI.from({ scheme: 'myScheme', path: process.cwd() }).toString()); - assert.equal((ws.folders[1]).uri, URI.from({ scheme: 'myScheme', path: os.tmpdir() })); + assert.equal(ws.folders.length, 2); + assert.equal((ws.folders[0]).uri, URI.from({ scheme: 'myScheme', path: process.cwd() }).toString(true)); + assert.equal((ws.folders[1]).uri, URI.from({ scheme: 'myScheme', path: os.tmpdir() }).toString(true)); }); test('resolveWorkspaceSync', done => { From c50042a6085f85c5d420411c2e65c3f8b326954c Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Thu, 5 Oct 2017 17:46:43 +0200 Subject: [PATCH 055/158] workspaces - make sure to always use massageFolderPathForWorkspace --- .../workspaces/electron-main/workspacesMainService.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vs/platform/workspaces/electron-main/workspacesMainService.ts b/src/vs/platform/workspaces/electron-main/workspacesMainService.ts index 261dc966699..c3b3bb22264 100644 --- a/src/vs/platform/workspaces/electron-main/workspacesMainService.ts +++ b/src/vs/platform/workspaces/electron-main/workspacesMainService.ts @@ -156,12 +156,12 @@ export class WorkspacesMainService implements IWorkspacesMainService { // File path if (typeof folder === 'string') { - return { path: folder } as IRawFileWorkspaceFolder; + return { path: massageFolderPathForWorkspace(folder, untitledWorkspaceConfigFolder, []) } as IRawFileWorkspaceFolder; } // File URI else if (folder.scheme === 'file') { - return { path: folder.fsPath } as IRawFileWorkspaceFolder; + return { path: massageFolderPathForWorkspace(folder.fsPath, untitledWorkspaceConfigFolder, []) } as IRawFileWorkspaceFolder; } // Any URI From 96168a883585cc02a44724c9ef69605ab778d67a Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Thu, 5 Oct 2017 15:21:15 +0200 Subject: [PATCH 056/158] workbenchThemeService: extract stores --- .../common/configurationRegistry.ts | 10 + .../themes/electron-browser/colorThemeData.ts | 91 +++--- .../electron-browser/colorThemeStore.ts | 141 +++++++++ .../electron-browser/fileIconThemeData.ts | 37 +++ .../electron-browser/fileIconThemeStore.ts | 138 ++++++++ .../electron-browser/workbenchThemeService.ts | 299 +++--------------- 6 files changed, 417 insertions(+), 299 deletions(-) create mode 100644 src/vs/workbench/services/themes/electron-browser/colorThemeStore.ts create mode 100644 src/vs/workbench/services/themes/electron-browser/fileIconThemeData.ts create mode 100644 src/vs/workbench/services/themes/electron-browser/fileIconThemeStore.ts diff --git a/src/vs/platform/configuration/common/configurationRegistry.ts b/src/vs/platform/configuration/common/configurationRegistry.ts index 0d3276bf69d..52d651b43d7 100644 --- a/src/vs/platform/configuration/common/configurationRegistry.ts +++ b/src/vs/platform/configuration/common/configurationRegistry.ts @@ -29,6 +29,12 @@ export interface IConfigurationRegistry { */ registerConfigurations(configurations: IConfigurationNode[], validate?: boolean): void; + /** + * Signal that the schema of a configuration setting has changes. It is currently only supported to change enumeration values. + * Property or default value changes are not allowed. + */ + notifyConfigurationSchemaUpdated(configuration: IConfigurationNode): void; + registerDefaultConfigurations(defaultConfigurations: IDefaultConfigurationExtension[]): void; /** @@ -126,6 +132,10 @@ class ConfigurationRegistry implements IConfigurationRegistry { this._onDidRegisterConfiguration.fire(this); } + public notifyConfigurationSchemaUpdated(configuration: IConfigurationNode) { + contributionRegistry.registerSchema(editorConfigurationSchemaId, this.editorConfigurationSchema); + } + public registerOverrideIdentifiers(overrideIdentifiers: string[]): void { this.overrideIdentifiers.push(...overrideIdentifiers); this.updateOverridePropertyPatternKey(); diff --git a/src/vs/workbench/services/themes/electron-browser/colorThemeData.ts b/src/vs/workbench/services/themes/electron-browser/colorThemeData.ts index ebdb67e5e07..2ff7e625cf4 100644 --- a/src/vs/workbench/services/themes/electron-browser/colorThemeData.ts +++ b/src/vs/workbench/services/themes/electron-browser/colorThemeData.ts @@ -2,6 +2,7 @@ * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ +'use strict'; import Paths = require('vs/base/common/paths'); import Json = require('vs/base/common/json'); @@ -36,7 +37,7 @@ const tokenGroupToScopesMap = { export class ColorThemeData implements IColorTheme { - constructor() { + private constructor() { } id: string; @@ -171,56 +172,60 @@ export class ColorThemeData implements IColorTheme { default: return 'dark'; } } -} -export function createUnloadedTheme(id: string): ColorThemeData { - let themeData = new ColorThemeData(); - themeData.id = id; - themeData.label = ''; - themeData.settingsId = null; - themeData.isLoaded = false; - themeData.themeTokenColors = [{ settings: {} }]; - return themeData; -} + // constructors -export function fromStorageData(input: string): ColorThemeData { - try { - let data = JSON.parse(input); - let theme = new ColorThemeData(); - for (let key in data) { - switch (key) { - case 'colorMap': - let colorMapData = data[key]; - for (let id in colorMapData) { - theme.colorMap[id] = Color.fromHex(colorMapData[id]); - } - break; - case 'themeTokenColors': - case 'id': case 'label': case 'settingsId': case 'extensionData': - theme[key] = data[key]; - break; + static createUnloadedTheme(id: string): ColorThemeData { + let themeData = new ColorThemeData(); + themeData.id = id; + themeData.label = ''; + themeData.settingsId = null; + themeData.isLoaded = false; + themeData.themeTokenColors = [{ settings: {} }]; + return themeData; + } + + static fromStorageData(input: string): ColorThemeData { + try { + let data = JSON.parse(input); + let theme = new ColorThemeData(); + for (let key in data) { + switch (key) { + case 'colorMap': + let colorMapData = data[key]; + for (let id in colorMapData) { + theme.colorMap[id] = Color.fromHex(colorMapData[id]); + } + break; + case 'themeTokenColors': + case 'id': case 'label': case 'settingsId': case 'extensionData': + theme[key] = data[key]; + break; + } } + return theme; + } catch (e) { + return null; } - return theme; - } catch (e) { - return null; + } + + static fromExtensionTheme(theme: IThemeExtensionPoint, normalizedAbsolutePath: string, extensionData: ExtensionData): ColorThemeData { + let baseTheme: string = theme['uiTheme'] || 'vs-dark'; + + let themeSelector = toCSSSelector(extensionData.extensionId + '-' + Paths.normalize(theme.path)); + let themeData = new ColorThemeData(); + themeData.id = `${baseTheme} ${themeSelector}`; + themeData.label = theme.label || Paths.basename(theme.path); + themeData.settingsId = theme.id || themeData.label; + themeData.description = theme.description; + themeData.path = normalizedAbsolutePath; + themeData.extensionData = extensionData; + themeData.isLoaded = false; + return themeData; } } -export function fromExtensionTheme(theme: IThemeExtensionPoint, normalizedAbsolutePath: string, extensionData: ExtensionData): ColorThemeData { - let baseTheme: string = theme['uiTheme'] || 'vs-dark'; - let themeSelector = toCSSSelector(extensionData.extensionId + '-' + Paths.normalize(theme.path)); - let themeData = new ColorThemeData(); - themeData.id = `${baseTheme} ${themeSelector}`; - themeData.label = theme.label || Paths.basename(theme.path); - themeData.settingsId = theme.id || themeData.label; - themeData.description = theme.description; - themeData.path = normalizedAbsolutePath; - themeData.extensionData = extensionData; - themeData.isLoaded = false; - return themeData; -} function toCSSSelector(str: string) { str = str.replace(/[^_\-a-zA-Z0-9]/g, '-'); diff --git a/src/vs/workbench/services/themes/electron-browser/colorThemeStore.ts b/src/vs/workbench/services/themes/electron-browser/colorThemeStore.ts new file mode 100644 index 00000000000..34751542947 --- /dev/null +++ b/src/vs/workbench/services/themes/electron-browser/colorThemeStore.ts @@ -0,0 +1,141 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +'use strict'; + +import nls = require('vs/nls'); + +import * as types from 'vs/base/common/types'; +import * as Paths from 'path'; +import { ExtensionsRegistry, ExtensionMessageCollector } from 'vs/platform/extensions/common/extensionsRegistry'; +import { IColorTheme, ExtensionData, IThemeExtensionPoint, VS_LIGHT_THEME, VS_DARK_THEME, VS_HC_THEME } from 'vs/workbench/services/themes/common/workbenchThemeService'; +import { ColorThemeData } from 'vs/workbench/services/themes/electron-browser/colorThemeData'; +import { IExtensionService } from 'vs/platform/extensions/common/extensions'; +import { TPromise } from 'vs/base/common/winjs.base'; +import Event, { Emitter } from 'vs/base/common/event'; + + +let themesExtPoint = ExtensionsRegistry.registerExtensionPoint('themes', [], { + description: nls.localize('vscode.extension.contributes.themes', 'Contributes textmate color themes.'), + type: 'array', + items: { + type: 'object', + defaultSnippets: [{ body: { label: '${1:label}', id: '${2:id}', uiTheme: VS_DARK_THEME, path: './themes/${3:id}.tmTheme.' } }], + properties: { + id: { + description: nls.localize('vscode.extension.contributes.themes.id', 'Id of the icon theme as used in the user settings.'), + type: 'string' + }, + label: { + description: nls.localize('vscode.extension.contributes.themes.label', 'Label of the color theme as shown in the UI.'), + type: 'string' + }, + uiTheme: { + description: nls.localize('vscode.extension.contributes.themes.uiTheme', 'Base theme defining the colors around the editor: \'vs\' is the light color theme, \'vs-dark\' is the dark color theme. \'hc-black\' is the dark high contrast theme.'), + enum: [VS_LIGHT_THEME, VS_DARK_THEME, VS_HC_THEME] + }, + path: { + description: nls.localize('vscode.extension.contributes.themes.path', 'Path of the tmTheme file. The path is relative to the extension folder and is typically \'./themes/themeFile.tmTheme\'.'), + type: 'string' + } + }, + required: ['path', 'uiTheme'] + } +}); + +export class ColorThemeStore { + + private extensionsColorThemes: ColorThemeData[]; + private onDidChangeEmitter: Emitter; + + public get onDidChange(): Event { return this.onDidChangeEmitter.event; } + + constructor( @IExtensionService private extensionService: IExtensionService) { + this.extensionsColorThemes = []; + this.onDidChangeEmitter = new Emitter(); + this.initialize(); + } + + + private initialize() { + themesExtPoint.setHandler((extensions) => { + for (let ext of extensions) { + let extensionData = { + extensionId: ext.description.id, + extensionPublisher: ext.description.publisher, + extensionName: ext.description.name, + extensionIsBuiltin: ext.description.isBuiltin + }; + this.onThemes(ext.description.extensionFolderPath, extensionData, ext.value, ext.collector); + } + this.onDidChangeEmitter.fire(this.extensionsColorThemes); + }); + } + + private onThemes(extensionFolderPath: string, extensionData: ExtensionData, themes: IThemeExtensionPoint[], collector: ExtensionMessageCollector): void { + if (!Array.isArray(themes)) { + collector.error(nls.localize( + 'reqarray', + "Extension point `{0}` must be an array.", + themesExtPoint.name + )); + return; + } + themes.forEach(theme => { + if (!theme.path || !types.isString(theme.path)) { + collector.error(nls.localize( + 'reqpath', + "Expected string in `contributes.{0}.path`. Provided value: {1}", + themesExtPoint.name, + String(theme.path) + )); + return; + } + let normalizedAbsolutePath = Paths.normalize(Paths.join(extensionFolderPath, theme.path)); + + if (normalizedAbsolutePath.indexOf(Paths.normalize(extensionFolderPath)) !== 0) { + collector.warn(nls.localize('invalid.path.1', "Expected `contributes.{0}.path` ({1}) to be included inside extension's folder ({2}). This might make the extension non-portable.", themesExtPoint.name, normalizedAbsolutePath, extensionFolderPath)); + } + let themeData = ColorThemeData.fromExtensionTheme(theme, normalizedAbsolutePath, extensionData); + this.extensionsColorThemes.push(themeData); + }); + } + + public findThemeData(themeId: string, defaultId?: string): TPromise { + return this.getColorThemes().then(allThemes => { + let defaultTheme: ColorThemeData = void 0; + for (let t of allThemes) { + if (t.id === themeId) { + return t; + } + if (t.id === defaultId) { + defaultTheme = t; + } + } + return defaultTheme; + }); + } + + public findThemeDataBySettingsId(settingsId: string, defaultId: string): TPromise { + return this.getColorThemes().then(allThemes => { + let defaultTheme: ColorThemeData = void 0; + for (let t of allThemes) { + if (t.settingsId === settingsId) { + return t; + } + if (t.id === defaultId) { + defaultTheme = t; + } + } + return defaultTheme; + }); + } + + public getColorThemes(): TPromise { + return this.extensionService.onReady().then(isReady => { + return this.extensionsColorThemes; + }); + } + +} diff --git a/src/vs/workbench/services/themes/electron-browser/fileIconThemeData.ts b/src/vs/workbench/services/themes/electron-browser/fileIconThemeData.ts new file mode 100644 index 00000000000..15fb7ef39b7 --- /dev/null +++ b/src/vs/workbench/services/themes/electron-browser/fileIconThemeData.ts @@ -0,0 +1,37 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +'use strict'; + +import Paths = require('vs/base/common/paths'); +import { ExtensionData, IThemeExtensionPoint, IFileIconTheme } from 'vs/workbench/services/themes/common/workbenchThemeService'; + +export class FileIconThemeData implements IFileIconTheme { + id: string; + label: string; + settingsId: string; + description?: string; + hasFileIcons?: boolean; + hasFolderIcons?: boolean; + isLoaded: boolean; + path?: string; + styleSheetContent?: string; + extensionData: ExtensionData; + + private constructor() { + } + + static fromExtensionTheme(iconTheme: IThemeExtensionPoint, normalizedAbsolutePath: string, extensionData: ExtensionData): FileIconThemeData { + let themeData = new FileIconThemeData(); + themeData.id = extensionData.extensionId + '-' + iconTheme.id; + themeData.label = iconTheme.label || Paths.basename(iconTheme.path); + themeData.settingsId = iconTheme.id; + themeData.description = iconTheme.description; + themeData.path = normalizedAbsolutePath; + themeData.extensionData = extensionData; + themeData.isLoaded = false; + return themeData; + } +} + diff --git a/src/vs/workbench/services/themes/electron-browser/fileIconThemeStore.ts b/src/vs/workbench/services/themes/electron-browser/fileIconThemeStore.ts new file mode 100644 index 00000000000..ff16ef134ff --- /dev/null +++ b/src/vs/workbench/services/themes/electron-browser/fileIconThemeStore.ts @@ -0,0 +1,138 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +'use strict'; + +import nls = require('vs/nls'); + +import * as types from 'vs/base/common/types'; +import * as Paths from 'path'; +import { ExtensionsRegistry, ExtensionMessageCollector } from 'vs/platform/extensions/common/extensionsRegistry'; +import { ExtensionData, IThemeExtensionPoint } from 'vs/workbench/services/themes/common/workbenchThemeService'; +import { ColorThemeData } from 'vs/workbench/services/themes/electron-browser/colorThemeData'; +import { IExtensionService } from 'vs/platform/extensions/common/extensions'; +import { TPromise } from 'vs/base/common/winjs.base'; +import Event, { Emitter } from 'vs/base/common/event'; +import { FileIconThemeData } from 'vs/workbench/services/themes/electron-browser/fileIconThemeData'; + +let iconThemeExtPoint = ExtensionsRegistry.registerExtensionPoint('iconThemes', [], { + description: nls.localize('vscode.extension.contributes.iconThemes', 'Contributes file icon themes.'), + type: 'array', + items: { + type: 'object', + defaultSnippets: [{ body: { id: '${1:id}', label: '${2:label}', path: './fileicons/${3:id}-icon-theme.json' } }], + properties: { + id: { + description: nls.localize('vscode.extension.contributes.iconThemes.id', 'Id of the icon theme as used in the user settings.'), + type: 'string' + }, + label: { + description: nls.localize('vscode.extension.contributes.iconThemes.label', 'Label of the icon theme as shown in the UI.'), + type: 'string' + }, + path: { + description: nls.localize('vscode.extension.contributes.iconThemes.path', 'Path of the icon theme definition file. The path is relative to the extension folder and is typically \'./icons/awesome-icon-theme.json\'.'), + type: 'string' + } + }, + required: ['path', 'id'] + } +}); +export class FileIconThemeStore { + + private knownIconThemes: FileIconThemeData[]; + private onDidChangeEmitter: Emitter; + + public get onDidChange(): Event { return this.onDidChangeEmitter.event; } + + constructor( @IExtensionService private extensionService: IExtensionService) { + this.knownIconThemes = []; + this.onDidChangeEmitter = new Emitter(); + this.initialize(); + } + + private initialize() { + iconThemeExtPoint.setHandler((extensions) => { + for (let ext of extensions) { + let extensionData = { + extensionId: ext.description.id, + extensionPublisher: ext.description.publisher, + extensionName: ext.description.name, + extensionIsBuiltin: ext.description.isBuiltin + }; + this.onIconThemes(ext.description.extensionFolderPath, extensionData, ext.value, ext.collector); + } + this.onDidChangeEmitter.fire(this.knownIconThemes); + }); + } + + private onIconThemes(extensionFolderPath: string, extensionData: ExtensionData, iconThemes: IThemeExtensionPoint[], collector: ExtensionMessageCollector): void { + if (!Array.isArray(iconThemes)) { + collector.error(nls.localize( + 'reqarray', + "Extension point `{0}` must be an array.", + iconThemeExtPoint.name + )); + return; + } + iconThemes.forEach(iconTheme => { + if (!iconTheme.path || !types.isString(iconTheme.path)) { + collector.error(nls.localize( + 'reqpath', + "Expected string in `contributes.{0}.path`. Provided value: {1}", + iconThemeExtPoint.name, + String(iconTheme.path) + )); + return; + } + if (!iconTheme.id || !types.isString(iconTheme.id)) { + collector.error(nls.localize( + 'reqid', + "Expected string in `contributes.{0}.id`. Provided value: {1}", + iconThemeExtPoint.name, + String(iconTheme.path) + )); + return; + } + let normalizedAbsolutePath = Paths.normalize(Paths.join(extensionFolderPath, iconTheme.path)); + + if (normalizedAbsolutePath.indexOf(Paths.normalize(extensionFolderPath)) !== 0) { + collector.warn(nls.localize('invalid.path.1', "Expected `contributes.{0}.path` ({1}) to be included inside extension's folder ({2}). This might make the extension non-portable.", iconThemeExtPoint.name, normalizedAbsolutePath, extensionFolderPath)); + } + + let themeData = ColorThemeData.fromExtensionTheme(iconTheme, normalizedAbsolutePath, extensionData); + this.knownIconThemes.push(themeData); + }); + + } + + public findThemeData(iconTheme: string): TPromise { + return this.getFileIconThemes().then(allIconSets => { + for (let iconSet of allIconSets) { + if (iconSet.id === iconTheme) { + return iconSet; + } + } + return null; + }); + } + + public findThemeBySettingsId(settingsId: string): TPromise { + return this.getFileIconThemes().then(allIconSets => { + for (let iconSet of allIconSets) { + if (iconSet.settingsId === settingsId) { + return iconSet; + } + } + return null; + }); + } + + public getFileIconThemes(): TPromise { + return this.extensionService.onReady().then(isReady => { + return this.knownIconThemes; + }); + } + +} diff --git a/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.ts b/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.ts index 7fb9b9a90c8..e9611ef6354 100644 --- a/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.ts +++ b/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.ts @@ -12,8 +12,7 @@ import Json = require('vs/base/common/json'); import * as types from 'vs/base/common/types'; import * as objects from 'vs/base/common/objects'; import { IExtensionService } from 'vs/platform/extensions/common/extensions'; -import { ExtensionsRegistry, ExtensionMessageCollector } from 'vs/platform/extensions/common/extensionsRegistry'; -import { IWorkbenchThemeService, IColorTheme, ITokenColorCustomizations, IFileIconTheme, ExtensionData, IThemeExtensionPoint, VS_LIGHT_THEME, VS_DARK_THEME, VS_HC_THEME, COLOR_THEME_SETTING, ICON_THEME_SETTING, CUSTOM_WORKBENCH_COLORS_SETTING, DEPRECATED_CUSTOM_COLORS_SETTING, CUSTOM_EDITOR_COLORS_SETTING, CUSTOM_EDITOR_SCOPE_COLORS_SETTING } from 'vs/workbench/services/themes/common/workbenchThemeService'; +import { IWorkbenchThemeService, IColorTheme, ITokenColorCustomizations, IFileIconTheme, ExtensionData, VS_LIGHT_THEME, VS_DARK_THEME, VS_HC_THEME, COLOR_THEME_SETTING, ICON_THEME_SETTING, CUSTOM_WORKBENCH_COLORS_SETTING, DEPRECATED_CUSTOM_COLORS_SETTING, CUSTOM_EDITOR_COLORS_SETTING, CUSTOM_EDITOR_SCOPE_COLORS_SETTING } from 'vs/workbench/services/themes/common/workbenchThemeService'; import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { Registry } from 'vs/platform/registry/common/platform'; @@ -26,7 +25,7 @@ import { IEnvironmentService } from 'vs/platform/environment/common/environment' import { IMessageService } from 'vs/platform/message/common/message'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import Severity from 'vs/base/common/severity'; -import { ColorThemeData, fromStorageData, fromExtensionTheme, createUnloadedTheme } from './colorThemeData'; +import { ColorThemeData } from './colorThemeData'; import { ITheme, Extensions as ThemingExtensions, IThemingRegistry } from 'vs/platform/theme/common/themeService'; import { editorBackground } from 'vs/platform/theme/common/colorRegistry'; import { Color } from 'vs/base/common/color'; @@ -41,6 +40,9 @@ import fileIconThemeSchema = require('vs/workbench/services/themes/common/fileIc import { IDisposable } from 'vs/base/common/lifecycle'; import { getParseErrorMessage } from 'vs/base/common/jsonErrorMessages'; import { IBroadcastService } from 'vs/platform/broadcast/electron-browser/broadcastService'; +import { ColorThemeStore } from 'vs/workbench/services/themes/electron-browser/colorThemeStore'; +import { FileIconThemeStore } from 'vs/workbench/services/themes/electron-browser/fileIconThemeStore'; +import { FileIconThemeData } from 'vs/workbench/services/themes/electron-browser/fileIconThemeData'; // implementation @@ -69,71 +71,6 @@ function validateThemeId(theme: string): string { return theme; } -let themesExtPoint = ExtensionsRegistry.registerExtensionPoint('themes', [], { - description: nls.localize('vscode.extension.contributes.themes', 'Contributes textmate color themes.'), - type: 'array', - items: { - type: 'object', - defaultSnippets: [{ body: { label: '${1:label}', id: '${2:id}', uiTheme: VS_DARK_THEME, path: './themes/${3:id}.tmTheme.' } }], - properties: { - id: { - description: nls.localize('vscode.extension.contributes.themes.id', 'Id of the icon theme as used in the user settings.'), - type: 'string' - }, - label: { - description: nls.localize('vscode.extension.contributes.themes.label', 'Label of the color theme as shown in the UI.'), - type: 'string' - }, - uiTheme: { - description: nls.localize('vscode.extension.contributes.themes.uiTheme', 'Base theme defining the colors around the editor: \'vs\' is the light color theme, \'vs-dark\' is the dark color theme. \'hc-black\' is the dark high contrast theme.'), - enum: [VS_LIGHT_THEME, VS_DARK_THEME, VS_HC_THEME] - }, - path: { - description: nls.localize('vscode.extension.contributes.themes.path', 'Path of the tmTheme file. The path is relative to the extension folder and is typically \'./themes/themeFile.tmTheme\'.'), - type: 'string' - } - }, - required: ['path', 'uiTheme'] - } -}); - -let iconThemeExtPoint = ExtensionsRegistry.registerExtensionPoint('iconThemes', [], { - description: nls.localize('vscode.extension.contributes.iconThemes', 'Contributes file icon themes.'), - type: 'array', - items: { - type: 'object', - defaultSnippets: [{ body: { id: '${1:id}', label: '${2:label}', path: './fileicons/${3:id}-icon-theme.json' } }], - properties: { - id: { - description: nls.localize('vscode.extension.contributes.iconThemes.id', 'Id of the icon theme as used in the user settings.'), - type: 'string' - }, - label: { - description: nls.localize('vscode.extension.contributes.iconThemes.label', 'Label of the icon theme as shown in the UI.'), - type: 'string' - }, - path: { - description: nls.localize('vscode.extension.contributes.iconThemes.path', 'Path of the icon theme definition file. The path is relative to the extension folder and is typically \'./icons/awesome-icon-theme.json\'.'), - type: 'string' - } - }, - required: ['path', 'id'] - } -}); - -interface IInternalIconThemeData extends IFileIconTheme { - id: string; - label: string; - settingsId: string; - description?: string; - hasFileIcons?: boolean; - hasFolderIcons?: boolean; - isLoaded: boolean; - path?: string; - styleSheetContent?: string; - extensionData: ExtensionData; -} - interface IconDefinition { iconPath: string; fontColor: string; @@ -187,7 +124,7 @@ const noFileIconTheme: IFileIconTheme = { export class WorkbenchThemeService implements IWorkbenchThemeService { _serviceBrand: any; - private extensionsColorThemes: ColorThemeData[]; + private colorThemeStore: ColorThemeStore; private colorCustomizations: IColorCustomizations; private tokenColorCustomizations: ITokenColorCustomizations; private numberOfColorCustomizations: number; @@ -195,7 +132,7 @@ export class WorkbenchThemeService implements IWorkbenchThemeService { private container: HTMLElement; private onColorThemeChange: Emitter; - private knownIconThemes: IInternalIconThemeData[]; + private iconThemeStore: FileIconThemeStore; private currentIconTheme: IFileIconTheme; private onFileIconThemeChange: Emitter; @@ -214,11 +151,11 @@ export class WorkbenchThemeService implements IWorkbenchThemeService { @IInstantiationService private instantiationService: IInstantiationService) { this.container = container; - this.extensionsColorThemes = []; + this.colorThemeStore = new ColorThemeStore(extensionService); this.colorCustomizations = {}; this.tokenColorCustomizations = {}; this.onFileIconThemeChange = new Emitter(); - this.knownIconThemes = []; + this.iconThemeStore = new FileIconThemeStore(extensionService); this.onColorThemeChange = new Emitter(); this.currentIconTheme = { @@ -239,46 +176,34 @@ export class WorkbenchThemeService implements IWorkbenchThemeService { let themeData = null; let persistedThemeData = this.storageService.get(PERSISTED_THEME_STORAGE_KEY); if (persistedThemeData) { - themeData = fromStorageData(persistedThemeData); + themeData = ColorThemeData.fromStorageData(persistedThemeData); } if (!themeData) { let isLightTheme = (Array.prototype.indexOf.call(document.body.classList, 'vs') >= 0); - themeData = createUnloadedTheme(isLightTheme ? VS_LIGHT_THEME : VS_DARK_THEME); + themeData = ColorThemeData.createUnloadedTheme(isLightTheme ? VS_LIGHT_THEME : VS_DARK_THEME); } themeData.setCustomColors(this.colorCustomizations); themeData.setCustomTokenColors(this.tokenColorCustomizations); this.updateDynamicCSSRules(themeData); this.applyTheme(themeData, null, true); - themesExtPoint.setHandler((extensions) => { - for (let ext of extensions) { - let extensionData = { - extensionId: ext.description.id, - extensionPublisher: ext.description.publisher, - extensionName: ext.description.name, - extensionIsBuiltin: ext.description.isBuiltin - }; - this.onThemes(ext.description.extensionFolderPath, extensionData, ext.value, ext.collector); - } - }); - - iconThemeExtPoint.setHandler((extensions) => { - for (let ext of extensions) { - let extensionData = { - extensionId: ext.description.id, - extensionPublisher: ext.description.publisher, - extensionName: ext.description.name, - extensionIsBuiltin: ext.description.isBuiltin - }; - this.onIconThemes(ext.description.extensionFolderPath, extensionData, ext.value, ext.collector); - } - }); - this.migrate().then(_ => { this.initialize().then(null, errors.onUnexpectedError).then(_ => { this.installConfigurationListener(); }); }); + + // update settings schema setting + this.colorThemeStore.onDidChange(themes => { + colorThemeSettingSchema.enum = themes.map(t => t.settingsId); + colorThemeSettingSchema.enumDescriptions = themes.map(t => themeData.description || ''); + configurationRegistry.notifyConfigurationSchemaUpdated(colorThemeSettingSchema); + }); + this.iconThemeStore.onDidChange(themes => { + iconThemeSettingSchema.enum = themes.map(t => t.settingsId); + iconThemeSettingSchema.enumDescriptions = themes.map(t => themeData.description || ''); + configurationRegistry.notifyConfigurationSchemaUpdated(iconThemeSettingSchema); + }); } public get onDidColorThemeChange(): Event { @@ -316,7 +241,7 @@ export class WorkbenchThemeService implements IWorkbenchThemeService { let promise = TPromise.as(null); if (!types.isUndefined(legacyColorThemeId)) { this.storageService.remove('workbench.theme', StorageScope.GLOBAL); - promise = this.findThemeData(legacyColorThemeId, DEFAULT_THEME_ID).then(theme => { + promise = this.colorThemeStore.findThemeData(legacyColorThemeId, DEFAULT_THEME_ID).then(theme => { let value = theme ? theme.settingsId : DEFAULT_THEME_SETTING_VALUE; return this.configurationWriter.writeConfiguration(COLOR_THEME_SETTING, value, ConfigurationTarget.USER).then(null, error => null); }); @@ -324,7 +249,7 @@ export class WorkbenchThemeService implements IWorkbenchThemeService { if (!types.isUndefined(legacyIconThemeId)) { this.storageService.remove('workbench.iconTheme', StorageScope.GLOBAL); promise = promise.then(_ => { - return this._findIconThemeData(legacyIconThemeId).then(theme => { + return this.iconThemeStore.findThemeData(legacyIconThemeId).then(theme => { let value = theme ? theme.settingsId : null; return this.configurationWriter.writeConfiguration(ICON_THEME_SETTING, value, ConfigurationTarget.USER).then(null, error => null); }); @@ -348,10 +273,10 @@ export class WorkbenchThemeService implements IWorkbenchThemeService { let iconThemeSetting = this.configurationService.lookup(ICON_THEME_SETTING).value || ''; return Promise.join([ - this.findThemeDataBySettingsId(colorThemeSetting, DEFAULT_THEME_ID).then(theme => { + this.colorThemeStore.findThemeDataBySettingsId(colorThemeSetting, DEFAULT_THEME_ID).then(theme => { return this.setColorTheme(theme && theme.id, null); }), - this.findIconThemeBySettingsId(iconThemeSetting).then(theme => { + this.iconThemeStore.findThemeBySettingsId(iconThemeSetting).then(theme => { return this.setFileIconTheme(theme && theme.id, null); }), ]); @@ -361,7 +286,7 @@ export class WorkbenchThemeService implements IWorkbenchThemeService { this.configurationService.onDidUpdateConfiguration(e => { let colorThemeSetting = this.configurationService.lookup(COLOR_THEME_SETTING).value; if (colorThemeSetting !== this.currentColorTheme.settingsId) { - this.findThemeDataBySettingsId(colorThemeSetting, null).then(theme => { + this.colorThemeStore.findThemeDataBySettingsId(colorThemeSetting, null).then(theme => { if (theme) { this.setColorTheme(theme.id, null); } @@ -370,7 +295,7 @@ export class WorkbenchThemeService implements IWorkbenchThemeService { let iconThemeSetting = this.configurationService.lookup(ICON_THEME_SETTING).value || ''; if (iconThemeSetting !== this.currentIconTheme.settingsId) { - this.findIconThemeBySettingsId(iconThemeSetting).then(theme => { + this.iconThemeStore.findThemeBySettingsId(iconThemeSetting).then(theme => { this.setFileIconTheme(theme && theme.id, null); }); } @@ -379,6 +304,14 @@ export class WorkbenchThemeService implements IWorkbenchThemeService { }); } + public getColorTheme(): IColorTheme { + return this.currentColorTheme; + } + + public getColorThemes(): TPromise { + return this.colorThemeStore.getColorThemes(); + } + public getTheme(): ITheme { return this.getColorTheme(); } @@ -393,8 +326,7 @@ export class WorkbenchThemeService implements IWorkbenchThemeService { themeId = validateThemeId(themeId); // migrate theme ids - - return this.findThemeData(themeId, DEFAULT_THEME_ID).then(themeData => { + return this.colorThemeStore.findThemeData(themeId, DEFAULT_THEME_ID).then(themeData => { if (themeData) { return themeData.ensureLoaded(this).then(_ => { if (themeId === this.currentColorTheme.id && !this.currentColorTheme.isLoaded && this.currentColorTheme.hasEqualData(themeData)) { @@ -471,46 +403,6 @@ export class WorkbenchThemeService implements IWorkbenchThemeService { return TPromise.as(this.currentColorTheme); } - public getColorTheme(): IColorTheme { - return this.currentColorTheme; - } - - private findThemeData(themeId: string, defaultId?: string): TPromise { - return this.getColorThemes().then(allThemes => { - let defaultTheme: ColorThemeData = void 0; - for (let t of allThemes) { - if (t.id === themeId) { - return t; - } - if (t.id === defaultId) { - defaultTheme = t; - } - } - return defaultTheme; - }); - } - - public findThemeDataBySettingsId(settingsId: string, defaultId: string): TPromise { - return this.getColorThemes().then(allThemes => { - let defaultTheme: ColorThemeData = void 0; - for (let t of allThemes) { - if (t.settingsId === settingsId) { - return t; - } - if (t.id === defaultId) { - defaultTheme = t; - } - } - return defaultTheme; - }); - } - - public getColorThemes(): TPromise { - return this.extensionService.onReady().then(isReady => { - return this.extensionsColorThemes; - }); - } - private hasCustomizationChanged(newColorCustomizations: IColorCustomizations, newColorIds: string[], newTokenColorCustomizations: ITokenColorCustomizations): boolean { if (newColorIds.length !== this.numberOfColorCustomizations) { return true; @@ -555,88 +447,6 @@ export class WorkbenchThemeService implements IWorkbenchThemeService { } } - private onThemes(extensionFolderPath: string, extensionData: ExtensionData, themes: IThemeExtensionPoint[], collector: ExtensionMessageCollector): void { - if (!Array.isArray(themes)) { - collector.error(nls.localize( - 'reqarray', - "Extension point `{0}` must be an array.", - themesExtPoint.name - )); - return; - } - themes.forEach(theme => { - if (!theme.path || !types.isString(theme.path)) { - collector.error(nls.localize( - 'reqpath', - "Expected string in `contributes.{0}.path`. Provided value: {1}", - themesExtPoint.name, - String(theme.path) - )); - return; - } - let normalizedAbsolutePath = Paths.normalize(Paths.join(extensionFolderPath, theme.path)); - - if (normalizedAbsolutePath.indexOf(Paths.normalize(extensionFolderPath)) !== 0) { - collector.warn(nls.localize('invalid.path.1', "Expected `contributes.{0}.path` ({1}) to be included inside extension's folder ({2}). This might make the extension non-portable.", themesExtPoint.name, normalizedAbsolutePath, extensionFolderPath)); - } - let themeData = fromExtensionTheme(theme, normalizedAbsolutePath, extensionData); - this.extensionsColorThemes.push(themeData); - - colorThemeSettingSchema.enum.push(themeData.settingsId); - colorThemeSettingSchema.enumDescriptions.push(themeData.description || ''); - }); - } - - private onIconThemes(extensionFolderPath: string, extensionData: ExtensionData, iconThemes: IThemeExtensionPoint[], collector: ExtensionMessageCollector): void { - if (!Array.isArray(iconThemes)) { - collector.error(nls.localize( - 'reqarray', - "Extension point `{0}` must be an array.", - themesExtPoint.name - )); - return; - } - iconThemes.forEach(iconTheme => { - if (!iconTheme.path || !types.isString(iconTheme.path)) { - collector.error(nls.localize( - 'reqpath', - "Expected string in `contributes.{0}.path`. Provided value: {1}", - themesExtPoint.name, - String(iconTheme.path) - )); - return; - } - if (!iconTheme.id || !types.isString(iconTheme.id)) { - collector.error(nls.localize( - 'reqid', - "Expected string in `contributes.{0}.id`. Provided value: {1}", - themesExtPoint.name, - String(iconTheme.path) - )); - return; - } - let normalizedAbsolutePath = Paths.normalize(Paths.join(extensionFolderPath, iconTheme.path)); - - if (normalizedAbsolutePath.indexOf(Paths.normalize(extensionFolderPath)) !== 0) { - collector.warn(nls.localize('invalid.path.1', "Expected `contributes.{0}.path` ({1}) to be included inside extension's folder ({2}). This might make the extension non-portable.", themesExtPoint.name, normalizedAbsolutePath, extensionFolderPath)); - } - - let themeData = { - id: extensionData.extensionId + '-' + iconTheme.id, - label: iconTheme.label || Paths.basename(iconTheme.path), - settingsId: iconTheme.id, - description: iconTheme.description, - path: normalizedAbsolutePath, - extensionData: extensionData, - isLoaded: false - }; - this.knownIconThemes.push(themeData); - - iconThemeSettingSchema.enum.push(themeData.settingsId); - iconThemeSettingSchema.enumDescriptions.push(themeData.description || ''); - }); - } - private themeExtensionsActivated = new Map(); private sendTelemetry(themeId: string, themeData: ExtensionData, themeType: string) { if (themeData) { @@ -664,9 +474,7 @@ export class WorkbenchThemeService implements IWorkbenchThemeService { } public getFileIconThemes(): TPromise { - return this.extensionService.onReady().then(isReady => { - return this.knownIconThemes; - }); + return this.iconThemeStore.getFileIconThemes(); } public getFileIconTheme() { @@ -678,7 +486,7 @@ export class WorkbenchThemeService implements IWorkbenchThemeService { if (iconTheme === this.currentIconTheme.id && this.currentIconTheme.isLoaded) { return this.writeFileIconConfiguration(settingsTarget); } - let onApply = (newIconTheme: IInternalIconThemeData) => { + let onApply = (newIconTheme: FileIconThemeData) => { if (newIconTheme) { this.currentIconTheme = newIconTheme; } else { @@ -699,7 +507,7 @@ export class WorkbenchThemeService implements IWorkbenchThemeService { return this.writeFileIconConfiguration(settingsTarget); }; - return this._findIconThemeData(iconTheme).then(iconThemeData => { + return this.iconThemeStore.findThemeData(iconTheme).then(iconThemeData => { return _applyIconTheme(iconThemeData, onApply); }); } @@ -718,31 +526,9 @@ export class WorkbenchThemeService implements IWorkbenchThemeService { } return this._configurationWriter; } - - private _findIconThemeData(iconTheme: string): TPromise { - return this.getFileIconThemes().then(allIconSets => { - for (let iconSet of allIconSets) { - if (iconSet.id === iconTheme) { - return iconSet; - } - } - return null; - }); - } - - private findIconThemeBySettingsId(settingsId: string): TPromise { - return this.getFileIconThemes().then(allIconSets => { - for (let iconSet of allIconSets) { - if (iconSet.settingsId === settingsId) { - return iconSet; - } - } - return null; - }); - } } -function _applyIconTheme(data: IInternalIconThemeData, onApply: (theme: IInternalIconThemeData) => TPromise): TPromise { +function _applyIconTheme(data: FileIconThemeData, onApply: (theme: FileIconThemeData) => TPromise): TPromise { if (!data) { _applyRules('', iconThemeRulesClassName); return TPromise.as(onApply(data)); @@ -992,6 +778,7 @@ const colorThemeSettingSchema: IJSONSchema = { enumDescriptions: [], errorMessage: nls.localize('colorThemeError', "Theme is unknown or not installed."), }; + const iconThemeSettingSchema: IJSONSchema = { type: ['string', 'null'], default: DEFAULT_ICON_THEME_SETTING_VALUE, From ef66c066ddb383fe038c8dcaf0a7042dac665cb3 Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Thu, 5 Oct 2017 15:25:37 +0200 Subject: [PATCH 057/158] Remove support for experimental.colorCustomizations --- .../themes/common/workbenchThemeService.ts | 1 - .../electron-browser/workbenchThemeService.ts | 14 ++------------ 2 files changed, 2 insertions(+), 13 deletions(-) diff --git a/src/vs/workbench/services/themes/common/workbenchThemeService.ts b/src/vs/workbench/services/themes/common/workbenchThemeService.ts index f943d4229c4..dfacea5a13c 100644 --- a/src/vs/workbench/services/themes/common/workbenchThemeService.ts +++ b/src/vs/workbench/services/themes/common/workbenchThemeService.ts @@ -20,7 +20,6 @@ export const VS_HC_THEME = 'hc-black'; export const COLOR_THEME_SETTING = 'workbench.colorTheme'; export const ICON_THEME_SETTING = 'workbench.iconTheme'; export const CUSTOM_WORKBENCH_COLORS_SETTING = 'workbench.colorCustomizations'; -export const DEPRECATED_CUSTOM_COLORS_SETTING = 'workbench.experimental.colorCustomizations'; export const CUSTOM_EDITOR_COLORS_SETTING = 'editor.tokenColorCustomizations'; export const CUSTOM_EDITOR_SCOPE_COLORS_SETTING = 'textMateRules'; diff --git a/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.ts b/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.ts index e9611ef6354..b11493aa447 100644 --- a/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.ts +++ b/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.ts @@ -12,7 +12,7 @@ import Json = require('vs/base/common/json'); import * as types from 'vs/base/common/types'; import * as objects from 'vs/base/common/objects'; import { IExtensionService } from 'vs/platform/extensions/common/extensions'; -import { IWorkbenchThemeService, IColorTheme, ITokenColorCustomizations, IFileIconTheme, ExtensionData, VS_LIGHT_THEME, VS_DARK_THEME, VS_HC_THEME, COLOR_THEME_SETTING, ICON_THEME_SETTING, CUSTOM_WORKBENCH_COLORS_SETTING, DEPRECATED_CUSTOM_COLORS_SETTING, CUSTOM_EDITOR_COLORS_SETTING, CUSTOM_EDITOR_SCOPE_COLORS_SETTING } from 'vs/workbench/services/themes/common/workbenchThemeService'; +import { IWorkbenchThemeService, IColorTheme, ITokenColorCustomizations, IFileIconTheme, ExtensionData, VS_LIGHT_THEME, VS_DARK_THEME, VS_HC_THEME, COLOR_THEME_SETTING, ICON_THEME_SETTING, CUSTOM_WORKBENCH_COLORS_SETTING, CUSTOM_EDITOR_COLORS_SETTING, CUSTOM_EDITOR_SCOPE_COLORS_SETTING } from 'vs/workbench/services/themes/common/workbenchThemeService'; import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { Registry } from 'vs/platform/registry/common/platform'; @@ -424,10 +424,6 @@ export class WorkbenchThemeService implements IWorkbenchThemeService { private updateColorCustomizations(notify = true): void { let newColorCustomizations = this.configurationService.lookup(CUSTOM_WORKBENCH_COLORS_SETTING).value || {}; let newColorIds = Object.keys(newColorCustomizations); - if (newColorIds.length === 0) { - newColorCustomizations = this.configurationService.lookup(DEPRECATED_CUSTOM_COLORS_SETTING).value || {}; - newColorIds = Object.keys(newColorCustomizations); - } let newTokenColorCustomizations = this.configurationService.lookup(CUSTOM_EDITOR_COLORS_SETTING).value || {}; @@ -801,11 +797,6 @@ const colorCustomizationsSchema: IJSONSchema = { }] }; -const deprecatedColorCustomizationsSchema: IJSONSchema = objects.mixin({ - deprecationMessage: nls.localize('workbenchColors.deprecated', "The setting is no longer experimental and has been renamed to 'workbench.colorCustomizations'"), - description: nls.localize('workbenchColors.deprecatedDescription', "Use 'workbench.colorCustomizations' instead") -}, colorCustomizationsSchema, false); - configurationRegistry.registerConfiguration({ id: 'workbench', order: 7.1, @@ -813,8 +804,7 @@ configurationRegistry.registerConfiguration({ properties: { [COLOR_THEME_SETTING]: colorThemeSettingSchema, [ICON_THEME_SETTING]: iconThemeSettingSchema, - [CUSTOM_WORKBENCH_COLORS_SETTING]: colorCustomizationsSchema, - [DEPRECATED_CUSTOM_COLORS_SETTING]: deprecatedColorCustomizationsSchema + [CUSTOM_WORKBENCH_COLORS_SETTING]: colorCustomizationsSchema } }); From 094a143f1a1b7e10df082b2827c8c584c3f599d7 Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Thu, 5 Oct 2017 15:38:44 +0200 Subject: [PATCH 058/158] Fill in default color value when completing --- src/vs/platform/theme/common/colorRegistry.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/platform/theme/common/colorRegistry.ts b/src/vs/platform/theme/common/colorRegistry.ts index 0d21ee0e7a9..d33b183817f 100644 --- a/src/vs/platform/theme/common/colorRegistry.ts +++ b/src/vs/platform/theme/common/colorRegistry.ts @@ -89,7 +89,7 @@ class ColorRegistry implements IColorRegistry { public registerColor(id: string, defaults: ColorDefaults, description: string): ColorIdentifier { let colorContribution = { id, description, defaults }; this.colorsById[id] = colorContribution; - this.colorSchema.properties[id] = { type: 'string', description, format: 'color', pattern: colorPattern, patternErrorMessage: colorPatternErrorMessage }; + this.colorSchema.properties[id] = { type: 'string', description, format: 'color', default: '#ff0000', pattern: colorPattern, patternErrorMessage: colorPatternErrorMessage }; this.colorReferenceSchema.enum.push(id); this.colorReferenceSchema.enumDescriptions.push(description); return id; From 0eb2ef0e1a24ce423864b8da581d43545a21d6ce Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Thu, 5 Oct 2017 15:39:13 +0200 Subject: [PATCH 059/158] Warn on mispelled color names --- .../services/themes/electron-browser/workbenchThemeService.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.ts b/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.ts index b11493aa447..8c1d7cf4804 100644 --- a/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.ts +++ b/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.ts @@ -787,6 +787,7 @@ const colorCustomizationsSchema: IJSONSchema = { type: ['object'], description: nls.localize('workbenchColors', "Overrides colors from the currently selected color theme."), properties: colorThemeSchema.colorsSchema.properties, + additionalProperties: false, default: {}, defaultSnippets: [{ body: { @@ -831,6 +832,7 @@ configurationRegistry.registerConfiguration({ [CUSTOM_EDITOR_COLORS_SETTING]: { description: nls.localize('editorColors', "Overrides editor colors and font style from the currently selected color theme."), default: {}, + additionalProperties: false, properties: { comments: tokenGroupSettings(nls.localize('editorColors.comments', "Sets the colors and styles for comments")), strings: tokenGroupSettings(nls.localize('editorColors.strings', "Sets the colors and styles for strings literals.")), From d6fed8a1b4d9d58aeb714c09c6a2433a69aac1fd Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Thu, 5 Oct 2017 16:32:25 +0200 Subject: [PATCH 060/158] File extension association is not respected when file extension and language id share the same icon . Fixes #27475 --- src/vs/workbench/browser/labels.ts | 1 + .../electron-browser/walkThroughPart.css | 2 +- .../electron-browser/workbenchThemeService.ts | 14 ++++++++++---- test/smoke/src/areas/explorer/explorer.ts | 6 +++--- 4 files changed, 15 insertions(+), 8 deletions(-) diff --git a/src/vs/workbench/browser/labels.ts b/src/vs/workbench/browser/labels.ts index afcd51a8b91..93a7498c27b 100644 --- a/src/vs/workbench/browser/labels.ts +++ b/src/vs/workbench/browser/labels.ts @@ -270,6 +270,7 @@ export function getIconClasses(modelService: IModelService, modeService: IModeSe for (let i = 1; i < dotSegments.length; i++) { classes.push(`${dotSegments.slice(i).join('.')}-ext-file-icon`); // add each combination of all found extensions if more than one } + classes.push(`ext-file-icon`); // extra segment to increase file-ext score // Configured Language let configuredLangId = getConfiguredLangId(modelService, resource); diff --git a/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.css b/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.css index 305fece6c6b..225f1c5415f 100644 --- a/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.css +++ b/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.css @@ -114,7 +114,7 @@ white-space: pre; } -.file-icons-enabled .show-file-icons .vs_code_editor_walkthrough\.md-name-file-icon.md-ext-file-icon.markdown-lang-file-icon.file-icon::before { +.file-icons-enabled .show-file-icons .vs_code_editor_walkthrough\.md-name-file-icon.md-ext-file-icon.ext-file-icon.markdown-lang-file-icon.file-icon::before { content: ' '; background-image: url('../../code-icon.svg'); } diff --git a/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.ts b/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.ts index 8c1d7cf4804..e765f4eec82 100644 --- a/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.ts +++ b/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.ts @@ -645,8 +645,11 @@ function _processIconThemeDocument(id: string, iconThemeDocumentPath: string, ic for (let fileExtension in fileExtensions) { let selectors: string[] = []; let segments = fileExtension.toLowerCase().split('.'); - for (let i = 0; i < segments.length; i++) { - selectors.push(`.${escapeCSS(segments.slice(i).join('.'))}-ext-file-icon`); + if (segments.length) { + for (let i = 0; i < segments.length; i++) { + selectors.push(`.${escapeCSS(segments.slice(i).join('.'))}-ext-file-icon`); + } + selectors.push('.ext-file-icon'); // extra segment to increase file-ext score } addSelector(`${qualifier} ${selectors.join('')}.file-icon::before`, fileExtensions[fileExtension]); result.hasFileIcons = true; @@ -659,8 +662,11 @@ function _processIconThemeDocument(id: string, iconThemeDocumentPath: string, ic fileName = fileName.toLowerCase(); selectors.push(`.${escapeCSS(fileName)}-name-file-icon`); let segments = fileName.split('.'); - for (let i = 1; i < segments.length; i++) { - selectors.push(`.${escapeCSS(segments.slice(i).join('.'))}-ext-file-icon`); + if (segments.length) { + for (let i = 1; i < segments.length; i++) { + selectors.push(`.${escapeCSS(segments.slice(i).join('.'))}-ext-file-icon`); + } + selectors.push('.ext-file-icon'); // extra segment to increase file-ext score } addSelector(`${qualifier} ${selectors.join('')}.file-icon::before`, fileNames[fileName]); result.hasFileIcons = true; diff --git a/test/smoke/src/areas/explorer/explorer.ts b/test/smoke/src/areas/explorer/explorer.ts index 3fdf04dd594..e799bc0f225 100644 --- a/test/smoke/src/areas/explorer/explorer.ts +++ b/test/smoke/src/areas/explorer/explorer.ts @@ -32,11 +32,11 @@ export class Explorer extends Viewlet { public getExtensionSelector(fileName: string): string { const extension = fileName.split('.')[1]; if (extension === 'js') { - return 'js-ext-file-icon javascript-lang-file-icon'; + return 'js-ext-file-icon ext-file-icon javascript-lang-file-icon'; } else if (extension === 'json') { - return 'json-ext-file-icon json-lang-file-icon'; + return 'json-ext-file-icon ext-file-icon json-lang-file-icon'; } else if (extension === 'md') { - return 'md-ext-file-icon markdown-lang-file-icon'; + return 'md-ext-file-icon ext-file-icon markdown-lang-file-icon'; } throw new Error('No class defined for this file extension'); } From 58f45b6460d31f34d3de9b60fd70c364523ef4a1 Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Thu, 5 Oct 2017 18:03:53 +0200 Subject: [PATCH 061/158] Move css generation to fileIconThemeData --- .../themes/electron-browser/colorThemeData.ts | 61 +++-- .../electron-browser/fileIconThemeData.ts | 258 +++++++++++++++++- .../electron-browser/fileIconThemeStore.ts | 3 +- .../electron-browser/workbenchThemeService.ts | 251 +---------------- 4 files changed, 294 insertions(+), 279 deletions(-) diff --git a/src/vs/workbench/services/themes/electron-browser/colorThemeData.ts b/src/vs/workbench/services/themes/electron-browser/colorThemeData.ts index 2ff7e625cf4..528d7fa234c 100644 --- a/src/vs/workbench/services/themes/electron-browser/colorThemeData.ts +++ b/src/vs/workbench/services/themes/electron-browser/colorThemeData.ts @@ -44,18 +44,20 @@ export class ColorThemeData implements IColorTheme { label: string; settingsId: string; description?: string; + isLoaded: boolean; + path?: string; + extensionData: ExtensionData; + get tokenColors(): ITokenColorizationRule[] { // Add the custom colors after the theme colors // so that they will override them return this.themeTokenColors.concat(this.customTokenColors); } - themeTokenColors: ITokenColorizationRule[] = []; - customTokenColors: ITokenColorizationRule[] = []; - isLoaded: boolean; - path?: string; - extensionData: ExtensionData; - colorMap: IColorMap = {}; - customColorMap: IColorMap = {}; + + private themeTokenColors: ITokenColorizationRule[] = []; + private customTokenColors: ITokenColorizationRule[] = []; + private colorMap: IColorMap = {}; + private customColorMap: IColorMap = {}; public getColor(colorId: ColorIdentifier, useDefault?: boolean): Color { let color = this.customColorMap[colorId]; @@ -120,18 +122,36 @@ export class ColorThemeData implements IColorTheme { public ensureLoaded(themeService: WorkbenchThemeService): TPromise { if (!this.isLoaded) { - this.themeTokenColors = []; - this.colorMap = {}; if (this.path) { return _loadColorThemeFromFile(this.path, this.themeTokenColors, this.colorMap).then(_ => { this.isLoaded = true; - _sanitizeTokenColors(this); + this.sanitizeTokenColors(); }); } } return TPromise.as(null); } + /** + * Place the default settings first and add add the token-info rules + */ + private sanitizeTokenColors() { + let hasDefaultTokens = false; + let updatedTokenColors: ITokenColorizationRule[] = [updateDefaultRuleSettings({ settings: {} }, this)]; + this.tokenColors.forEach(rule => { + if (rule.scope) { + if (rule.scope === 'token.info-token') { + hasDefaultTokens = true; + } + updatedTokenColors.push(rule); + } + }); + if (!hasDefaultTokens) { + updatedTokenColors.push(...defaultThemeColors[this.type]); + } + this.themeTokenColors = updatedTokenColors; + } + toThemeFile() { if (!this.isLoaded) { return ''; @@ -301,25 +321,7 @@ function _loadSyntaxTokensFromFile(themePath: string, resultRules: ITokenColoriz return TPromise.wrapError(new Error(nls.localize('error.cannotload', "Problems loading tmTheme file {0}: {1}", themePath, error.message))); }); } -/** - * Place the default settings first and add add the token-info rules - */ -function _sanitizeTokenColors(theme: ColorThemeData) { - let hasDefaultTokens = false; - let updatedTokenColors: ITokenColorizationRule[] = [updateDefaultRuleSettings({ settings: {} }, theme)]; - theme.tokenColors.forEach(rule => { - if (rule.scope) { - if (rule.scope === 'token.info-token') { - hasDefaultTokens = true; - } - updatedTokenColors.push(rule); - } - }); - if (!hasDefaultTokens) { - updatedTokenColors.push(...defaultThemeColors[theme.type]); - } - theme.themeTokenColors = updatedTokenColors; -} + function updateDefaultRuleSettings(defaultRule: ITokenColorizationRule, theme: ColorThemeData): ITokenColorizationRule { let foreground = theme.getColor(editorForeground) || theme.getDefault(editorForeground); @@ -329,7 +331,6 @@ function updateDefaultRuleSettings(defaultRule: ITokenColorizationRule, theme: C return defaultRule; } - let defaultThemeColors: { [baseTheme: string]: ITokenColorizationRule[] } = { 'light': [ { scope: 'token.info-token', settings: { foreground: '#316bcd' } }, diff --git a/src/vs/workbench/services/themes/electron-browser/fileIconThemeData.ts b/src/vs/workbench/services/themes/electron-browser/fileIconThemeData.ts index 15fb7ef39b7..fcdd7f82d21 100644 --- a/src/vs/workbench/services/themes/electron-browser/fileIconThemeData.ts +++ b/src/vs/workbench/services/themes/electron-browser/fileIconThemeData.ts @@ -4,8 +4,15 @@ *--------------------------------------------------------------------------------------------*/ 'use strict'; -import Paths = require('vs/base/common/paths'); +import URI from 'vs/base/common/uri'; +import nls = require('vs/nls'); +import * as Paths from 'path'; +import Json = require('vs/base/common/json'); import { ExtensionData, IThemeExtensionPoint, IFileIconTheme } from 'vs/workbench/services/themes/common/workbenchThemeService'; +import { TPromise } from 'vs/base/common/winjs.base'; +import pfs = require('vs/base/node/pfs'); +import { WorkbenchThemeService } from 'vs/workbench/services/themes/electron-browser/workbenchThemeService'; +import { getParseErrorMessage } from 'vs/base/common/jsonErrorMessages'; export class FileIconThemeData implements IFileIconTheme { id: string; @@ -16,12 +23,29 @@ export class FileIconThemeData implements IFileIconTheme { hasFolderIcons?: boolean; isLoaded: boolean; path?: string; - styleSheetContent?: string; extensionData: ExtensionData; + private styleSheetContent?: string; + private constructor() { } + public ensureLoaded(themeService: WorkbenchThemeService): TPromise { + if (!this.isLoaded) { + if (this.path) { + return _loadIconThemeDocument(this.path).then(iconThemeDocument => { + let result = _processIconThemeDocument(this.id, this.path, iconThemeDocument); + this.styleSheetContent = result.content; + this.hasFileIcons = result.hasFileIcons; + this.hasFolderIcons = result.hasFolderIcons; + this.isLoaded = true; + return this.styleSheetContent; + }); + } + } + return TPromise.as(this.styleSheetContent); + } + static fromExtensionTheme(iconTheme: IThemeExtensionPoint, normalizedAbsolutePath: string, extensionData: ExtensionData): FileIconThemeData { let themeData = new FileIconThemeData(); themeData.id = extensionData.extensionId + '-' + iconTheme.id; @@ -33,5 +57,235 @@ export class FileIconThemeData implements IFileIconTheme { themeData.isLoaded = false; return themeData; } + + private static _noIconTheme: FileIconThemeData = null; + + static noIconTheme(): FileIconThemeData { + let themeData = FileIconThemeData._noIconTheme; + if (!themeData) { + themeData = FileIconThemeData._noIconTheme = new FileIconThemeData(); + themeData.id = ''; + themeData.label = ''; + themeData.settingsId = null; + themeData.hasFileIcons = false; + themeData.hasFolderIcons = false; + themeData.isLoaded = true; + themeData.extensionData = null; + } + return themeData; + } } +interface IconDefinition { + iconPath: string; + fontColor: string; + fontCharacter: string; + fontSize: string; + fontId: string; +} + +interface FontDefinition { + id: string; + weight: string; + style: string; + size: string; + src: { path: string; format: string; }[]; +} + +interface IconsAssociation { + folder?: string; + file?: string; + folderExpanded?: string; + rootFolder?: string; + rootFolderExpanded?: string; + folderNames?: { [folderName: string]: string; }; + folderNamesExpanded?: { [folderName: string]: string; }; + fileExtensions?: { [extension: string]: string; }; + fileNames?: { [fileName: string]: string; }; + languageIds?: { [languageId: string]: string; }; +} + +interface IconThemeDocument extends IconsAssociation { + iconDefinitions: { [key: string]: IconDefinition }; + fonts: FontDefinition[]; + light?: IconsAssociation; + highContrast?: IconsAssociation; +} + +function _loadIconThemeDocument(fileSetPath: string): TPromise { + return pfs.readFile(fileSetPath).then(content => { + let errors: Json.ParseError[] = []; + let contentValue = Json.parse(content.toString(), errors); + if (errors.length > 0) { + return TPromise.wrapError(new Error(nls.localize('error.cannotparseicontheme', "Problems parsing file icons file: {0}", errors.map(e => getParseErrorMessage(e.error)).join(', ')))); + } + return TPromise.as(contentValue); + }); +} + +function _processIconThemeDocument(id: string, iconThemeDocumentPath: string, iconThemeDocument: IconThemeDocument): { content: string; hasFileIcons: boolean; hasFolderIcons: boolean; } { + + let result = { content: '', hasFileIcons: false, hasFolderIcons: false }; + + if (!iconThemeDocument.iconDefinitions) { + return result; + } + let selectorByDefinitionId: { [def: string]: string[] } = {}; + + function resolvePath(path: string) { + const uri = URI.file(Paths.join(Paths.dirname(iconThemeDocumentPath), path)); + return uri.toString(); + } + + function collectSelectors(associations: IconsAssociation, baseThemeClassName?: string) { + function addSelector(selector: string, defId: string) { + if (defId) { + let list = selectorByDefinitionId[defId]; + if (!list) { + list = selectorByDefinitionId[defId] = []; + } + list.push(selector); + } + } + if (associations) { + let qualifier = '.show-file-icons'; + if (baseThemeClassName) { + qualifier = baseThemeClassName + ' ' + qualifier; + } + + let expanded = '.monaco-tree-row.expanded'; // workaround for #11453 + + if (associations.folder) { + addSelector(`${qualifier} .folder-icon::before`, associations.folder); + result.hasFolderIcons = true; + } + + if (associations.folderExpanded) { + addSelector(`${qualifier} ${expanded} .folder-icon::before`, associations.folderExpanded); + result.hasFolderIcons = true; + } + + let rootFolder = associations.rootFolder || associations.folder; + let rootFolderExpanded = associations.rootFolderExpanded || associations.folderExpanded; + + if (rootFolder) { + addSelector(`${qualifier} .rootfolder-icon::before`, rootFolder); + result.hasFolderIcons = true; + } + + if (rootFolderExpanded) { + addSelector(`${qualifier} ${expanded} .rootfolder-icon::before`, rootFolderExpanded); + result.hasFolderIcons = true; + } + + if (associations.file) { + addSelector(`${qualifier} .file-icon::before`, associations.file); + result.hasFileIcons = true; + } + + let folderNames = associations.folderNames; + if (folderNames) { + for (let folderName in folderNames) { + addSelector(`${qualifier} .${escapeCSS(folderName.toLowerCase())}-name-folder-icon.folder-icon::before`, folderNames[folderName]); + result.hasFolderIcons = true; + } + } + let folderNamesExpanded = associations.folderNamesExpanded; + if (folderNamesExpanded) { + for (let folderName in folderNamesExpanded) { + addSelector(`${qualifier} ${expanded} .${escapeCSS(folderName.toLowerCase())}-name-folder-icon.folder-icon::before`, folderNamesExpanded[folderName]); + result.hasFolderIcons = true; + } + } + + let languageIds = associations.languageIds; + if (languageIds) { + for (let languageId in languageIds) { + addSelector(`${qualifier} .${escapeCSS(languageId)}-lang-file-icon.file-icon::before`, languageIds[languageId]); + result.hasFileIcons = true; + } + } + let fileExtensions = associations.fileExtensions; + if (fileExtensions) { + for (let fileExtension in fileExtensions) { + let selectors: string[] = []; + let segments = fileExtension.toLowerCase().split('.'); + if (segments.length) { + for (let i = 0; i < segments.length; i++) { + selectors.push(`.${escapeCSS(segments.slice(i).join('.'))}-ext-file-icon`); + } + selectors.push('.ext-file-icon'); // extra segment to increase file-ext score + } + addSelector(`${qualifier} ${selectors.join('')}.file-icon::before`, fileExtensions[fileExtension]); + result.hasFileIcons = true; + } + } + let fileNames = associations.fileNames; + if (fileNames) { + for (let fileName in fileNames) { + let selectors: string[] = []; + fileName = fileName.toLowerCase(); + selectors.push(`.${escapeCSS(fileName)}-name-file-icon`); + let segments = fileName.split('.'); + if (segments.length) { + for (let i = 1; i < segments.length; i++) { + selectors.push(`.${escapeCSS(segments.slice(i).join('.'))}-ext-file-icon`); + } + selectors.push('.ext-file-icon'); // extra segment to increase file-ext score + } + addSelector(`${qualifier} ${selectors.join('')}.file-icon::before`, fileNames[fileName]); + result.hasFileIcons = true; + } + } + } + } + collectSelectors(iconThemeDocument); + collectSelectors(iconThemeDocument.light, '.vs'); + collectSelectors(iconThemeDocument.highContrast, '.hc-black'); + + if (!result.hasFileIcons && !result.hasFolderIcons) { + return result; + } + + let cssRules: string[] = []; + + let fonts = iconThemeDocument.fonts; + if (Array.isArray(fonts)) { + fonts.forEach(font => { + let src = font.src.map(l => `url('${resolvePath(l.path)}') format('${l.format}')`).join(', '); + cssRules.push(`@font-face { src: ${src}; font-family: '${font.id}'; font-weigth: ${font.weight}; font-style: ${font.style}; }`); + }); + cssRules.push(`.show-file-icons .file-icon::before, .show-file-icons .folder-icon::before, .show-file-icons .rootfolder-icon::before { font-family: '${fonts[0].id}'; font-size: ${fonts[0].size || '150%'}}`); + } + + for (let defId in selectorByDefinitionId) { + let selectors = selectorByDefinitionId[defId]; + let definition = iconThemeDocument.iconDefinitions[defId]; + if (definition) { + if (definition.iconPath) { + cssRules.push(`${selectors.join(', ')} { content: ' '; background-image: url("${resolvePath(definition.iconPath)}"); }`); + } + if (definition.fontCharacter || definition.fontColor) { + let body = ''; + if (definition.fontColor) { + body += ` color: ${definition.fontColor};`; + } + if (definition.fontCharacter) { + body += ` content: '${definition.fontCharacter}';`; + } + if (definition.fontSize) { + body += ` font-size: ${definition.fontSize};`; + } + if (definition.fontId) { + body += ` font-family: ${definition.fontId};`; + } + cssRules.push(`${selectors.join(', ')} { ${body} }`); + } + } + } + result.content = cssRules.join('\n'); + return result; +} +function escapeCSS(str: string) { + return window['CSS'].escape(str); +} \ No newline at end of file diff --git a/src/vs/workbench/services/themes/electron-browser/fileIconThemeStore.ts b/src/vs/workbench/services/themes/electron-browser/fileIconThemeStore.ts index ff16ef134ff..a4d110811b9 100644 --- a/src/vs/workbench/services/themes/electron-browser/fileIconThemeStore.ts +++ b/src/vs/workbench/services/themes/electron-browser/fileIconThemeStore.ts @@ -10,7 +10,6 @@ import * as types from 'vs/base/common/types'; import * as Paths from 'path'; import { ExtensionsRegistry, ExtensionMessageCollector } from 'vs/platform/extensions/common/extensionsRegistry'; import { ExtensionData, IThemeExtensionPoint } from 'vs/workbench/services/themes/common/workbenchThemeService'; -import { ColorThemeData } from 'vs/workbench/services/themes/electron-browser/colorThemeData'; import { IExtensionService } from 'vs/platform/extensions/common/extensions'; import { TPromise } from 'vs/base/common/winjs.base'; import Event, { Emitter } from 'vs/base/common/event'; @@ -101,7 +100,7 @@ export class FileIconThemeStore { collector.warn(nls.localize('invalid.path.1', "Expected `contributes.{0}.path` ({1}) to be included inside extension's folder ({2}). This might make the extension non-portable.", iconThemeExtPoint.name, normalizedAbsolutePath, extensionFolderPath)); } - let themeData = ColorThemeData.fromExtensionTheme(iconTheme, normalizedAbsolutePath, extensionData); + let themeData = FileIconThemeData.fromExtensionTheme(iconTheme, normalizedAbsolutePath, extensionData); this.knownIconThemes.push(themeData); }); diff --git a/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.ts b/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.ts index e765f4eec82..6766e10bc34 100644 --- a/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.ts +++ b/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.ts @@ -5,10 +5,7 @@ 'use strict'; import { TPromise, Promise } from 'vs/base/common/winjs.base'; -import URI from 'vs/base/common/uri'; import nls = require('vs/nls'); -import * as Paths from 'path'; -import Json = require('vs/base/common/json'); import * as types from 'vs/base/common/types'; import * as objects from 'vs/base/common/objects'; import { IExtensionService } from 'vs/platform/extensions/common/extensions'; @@ -38,7 +35,6 @@ import pfs = require('vs/base/node/pfs'); import colorThemeSchema = require('vs/workbench/services/themes/common/colorThemeSchema'); import fileIconThemeSchema = require('vs/workbench/services/themes/common/fileIconThemeSchema'); import { IDisposable } from 'vs/base/common/lifecycle'; -import { getParseErrorMessage } from 'vs/base/common/jsonErrorMessages'; import { IBroadcastService } from 'vs/platform/broadcast/electron-browser/broadcastService'; import { ColorThemeStore } from 'vs/workbench/services/themes/electron-browser/colorThemeStore'; import { FileIconThemeStore } from 'vs/workbench/services/themes/electron-browser/fileIconThemeStore'; @@ -57,6 +53,9 @@ const oldDefaultThemeExtensionId = 'vscode-theme-colorful-defaults'; const DEFAULT_ICON_THEME_SETTING_VALUE = 'vs-seti'; const fileIconsEnabledClass = 'file-icons-enabled'; +const colorThemeRulesClassName = 'contributedColorTheme'; +const iconThemeRulesClassName = 'contributedIconTheme'; + const themingRegistry = Registry.as(ThemingExtensions.ThemingContribution); function validateThemeId(theme: string): string { @@ -71,56 +70,10 @@ function validateThemeId(theme: string): string { return theme; } -interface IconDefinition { - iconPath: string; - fontColor: string; - fontCharacter: string; - fontSize: string; - fontId: string; -} - -interface FontDefinition { - id: string; - weight: string; - style: string; - size: string; - src: { path: string; format: string; }[]; -} - -interface IconsAssociation { - folder?: string; - file?: string; - folderExpanded?: string; - rootFolder?: string; - rootFolderExpanded?: string; - folderNames?: { [folderName: string]: string; }; - folderNamesExpanded?: { [folderName: string]: string; }; - fileExtensions?: { [extension: string]: string; }; - fileNames?: { [fileName: string]: string; }; - languageIds?: { [languageId: string]: string; }; -} - -interface IconThemeDocument extends IconsAssociation { - iconDefinitions: { [key: string]: IconDefinition }; - fonts: FontDefinition[]; - light?: IconsAssociation; - highContrast?: IconsAssociation; -} - export interface IColorCustomizations { [colorId: string]: string; } -const noFileIconTheme: IFileIconTheme = { - id: '', - label: '', - settingsId: null, - hasFileIcons: false, - hasFolderIcons: false, - isLoaded: true, - extensionData: null -}; - export class WorkbenchThemeService implements IWorkbenchThemeService { _serviceBrand: any; @@ -486,7 +439,7 @@ export class WorkbenchThemeService implements IWorkbenchThemeService { if (newIconTheme) { this.currentIconTheme = newIconTheme; } else { - this.currentIconTheme = noFileIconTheme; + this.currentIconTheme = FileIconThemeData.noIconTheme(); } if (this.container) { @@ -529,206 +482,14 @@ function _applyIconTheme(data: FileIconThemeData, onApply: (theme: FileIconTheme _applyRules('', iconThemeRulesClassName); return TPromise.as(onApply(data)); } - - if (data.styleSheetContent) { - _applyRules(data.styleSheetContent, iconThemeRulesClassName); - return TPromise.as(onApply(data)); - } - return _loadIconThemeDocument(data.path).then(iconThemeDocument => { - let result = _processIconThemeDocument(data.id, data.path, iconThemeDocument); - data.styleSheetContent = result.content; - data.hasFileIcons = result.hasFileIcons; - data.hasFolderIcons = result.hasFolderIcons; - data.isLoaded = true; - _applyRules(data.styleSheetContent, iconThemeRulesClassName); + return data.ensureLoaded(this).then(styleSheetContent => { + _applyRules(styleSheetContent, iconThemeRulesClassName); return onApply(data); }, error => { return TPromise.wrapError(new Error(nls.localize('error.cannotloadicontheme', "Unable to load {0}", data.path))); }); } -function _loadIconThemeDocument(fileSetPath: string): TPromise { - return pfs.readFile(fileSetPath).then(content => { - let errors: Json.ParseError[] = []; - let contentValue = Json.parse(content.toString(), errors); - if (errors.length > 0) { - return TPromise.wrapError(new Error(nls.localize('error.cannotparseicontheme', "Problems parsing file icons file: {0}", errors.map(e => getParseErrorMessage(e.error)).join(', ')))); - } - return TPromise.as(contentValue); - }); -} - -function _processIconThemeDocument(id: string, iconThemeDocumentPath: string, iconThemeDocument: IconThemeDocument): { content: string; hasFileIcons: boolean; hasFolderIcons: boolean; } { - - let result = { content: '', hasFileIcons: false, hasFolderIcons: false }; - - if (!iconThemeDocument.iconDefinitions) { - return result; - } - let selectorByDefinitionId: { [def: string]: string[] } = {}; - - function resolvePath(path: string) { - const uri = URI.file(Paths.join(Paths.dirname(iconThemeDocumentPath), path)); - return uri.toString(); - } - - function collectSelectors(associations: IconsAssociation, baseThemeClassName?: string) { - function addSelector(selector: string, defId: string) { - if (defId) { - let list = selectorByDefinitionId[defId]; - if (!list) { - list = selectorByDefinitionId[defId] = []; - } - list.push(selector); - } - } - if (associations) { - let qualifier = '.show-file-icons'; - if (baseThemeClassName) { - qualifier = baseThemeClassName + ' ' + qualifier; - } - - let expanded = '.monaco-tree-row.expanded'; // workaround for #11453 - - if (associations.folder) { - addSelector(`${qualifier} .folder-icon::before`, associations.folder); - result.hasFolderIcons = true; - } - - if (associations.folderExpanded) { - addSelector(`${qualifier} ${expanded} .folder-icon::before`, associations.folderExpanded); - result.hasFolderIcons = true; - } - - let rootFolder = associations.rootFolder || associations.folder; - let rootFolderExpanded = associations.rootFolderExpanded || associations.folderExpanded; - - if (rootFolder) { - addSelector(`${qualifier} .rootfolder-icon::before`, rootFolder); - result.hasFolderIcons = true; - } - - if (rootFolderExpanded) { - addSelector(`${qualifier} ${expanded} .rootfolder-icon::before`, rootFolderExpanded); - result.hasFolderIcons = true; - } - - if (associations.file) { - addSelector(`${qualifier} .file-icon::before`, associations.file); - result.hasFileIcons = true; - } - - let folderNames = associations.folderNames; - if (folderNames) { - for (let folderName in folderNames) { - addSelector(`${qualifier} .${escapeCSS(folderName.toLowerCase())}-name-folder-icon.folder-icon::before`, folderNames[folderName]); - result.hasFolderIcons = true; - } - } - let folderNamesExpanded = associations.folderNamesExpanded; - if (folderNamesExpanded) { - for (let folderName in folderNamesExpanded) { - addSelector(`${qualifier} ${expanded} .${escapeCSS(folderName.toLowerCase())}-name-folder-icon.folder-icon::before`, folderNamesExpanded[folderName]); - result.hasFolderIcons = true; - } - } - - let languageIds = associations.languageIds; - if (languageIds) { - for (let languageId in languageIds) { - addSelector(`${qualifier} .${escapeCSS(languageId)}-lang-file-icon.file-icon::before`, languageIds[languageId]); - result.hasFileIcons = true; - } - } - let fileExtensions = associations.fileExtensions; - if (fileExtensions) { - for (let fileExtension in fileExtensions) { - let selectors: string[] = []; - let segments = fileExtension.toLowerCase().split('.'); - if (segments.length) { - for (let i = 0; i < segments.length; i++) { - selectors.push(`.${escapeCSS(segments.slice(i).join('.'))}-ext-file-icon`); - } - selectors.push('.ext-file-icon'); // extra segment to increase file-ext score - } - addSelector(`${qualifier} ${selectors.join('')}.file-icon::before`, fileExtensions[fileExtension]); - result.hasFileIcons = true; - } - } - let fileNames = associations.fileNames; - if (fileNames) { - for (let fileName in fileNames) { - let selectors: string[] = []; - fileName = fileName.toLowerCase(); - selectors.push(`.${escapeCSS(fileName)}-name-file-icon`); - let segments = fileName.split('.'); - if (segments.length) { - for (let i = 1; i < segments.length; i++) { - selectors.push(`.${escapeCSS(segments.slice(i).join('.'))}-ext-file-icon`); - } - selectors.push('.ext-file-icon'); // extra segment to increase file-ext score - } - addSelector(`${qualifier} ${selectors.join('')}.file-icon::before`, fileNames[fileName]); - result.hasFileIcons = true; - } - } - } - } - collectSelectors(iconThemeDocument); - collectSelectors(iconThemeDocument.light, '.vs'); - collectSelectors(iconThemeDocument.highContrast, '.hc-black'); - - if (!result.hasFileIcons && !result.hasFolderIcons) { - return result; - } - - let cssRules: string[] = []; - - let fonts = iconThemeDocument.fonts; - if (Array.isArray(fonts)) { - fonts.forEach(font => { - let src = font.src.map(l => `url('${resolvePath(l.path)}') format('${l.format}')`).join(', '); - cssRules.push(`@font-face { src: ${src}; font-family: '${font.id}'; font-weigth: ${font.weight}; font-style: ${font.style}; }`); - }); - cssRules.push(`.show-file-icons .file-icon::before, .show-file-icons .folder-icon::before, .show-file-icons .rootfolder-icon::before { font-family: '${fonts[0].id}'; font-size: ${fonts[0].size || '150%'}}`); - } - - for (let defId in selectorByDefinitionId) { - let selectors = selectorByDefinitionId[defId]; - let definition = iconThemeDocument.iconDefinitions[defId]; - if (definition) { - if (definition.iconPath) { - cssRules.push(`${selectors.join(', ')} { content: ' '; background-image: url("${resolvePath(definition.iconPath)}"); }`); - } - if (definition.fontCharacter || definition.fontColor) { - let body = ''; - if (definition.fontColor) { - body += ` color: ${definition.fontColor};`; - } - if (definition.fontCharacter) { - body += ` content: '${definition.fontCharacter}';`; - } - if (definition.fontSize) { - body += ` font-size: ${definition.fontSize};`; - } - if (definition.fontId) { - body += ` font-family: ${definition.fontId};`; - } - cssRules.push(`${selectors.join(', ')} { ${body} }`); - } - } - } - result.content = cssRules.join('\n'); - return result; -} - -function escapeCSS(str: string) { - return window['CSS'].escape(str); -} - -let colorThemeRulesClassName = 'contributedColorTheme'; -let iconThemeRulesClassName = 'contributedIconTheme'; - function _applyRules(styleSheetContent: string, rulesClassName: string) { let themeStyles = document.head.getElementsByClassName(rulesClassName); if (themeStyles.length === 0) { From f53b3556a83ab98bee97e967638ef138915ef7fe Mon Sep 17 00:00:00 2001 From: Ramya Achutha Rao Date: Thu, 5 Oct 2017 10:19:57 -0700 Subject: [PATCH 062/158] Get latest emmet helper --- extensions/emmet/npm-shrinkwrap.json | 6 +++--- extensions/emmet/package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/extensions/emmet/npm-shrinkwrap.json b/extensions/emmet/npm-shrinkwrap.json index 29ef7947c5e..86365079abd 100644 --- a/extensions/emmet/npm-shrinkwrap.json +++ b/extensions/emmet/npm-shrinkwrap.json @@ -38,9 +38,9 @@ "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz" }, "vscode-emmet-helper": { - "version": "1.1.13", - "from": "vscode-emmet-helper@>=1.1.13 <2.0.0", - "resolved": "https://registry.npmjs.org/vscode-emmet-helper/-/vscode-emmet-helper-1.1.13.tgz" + "version": "1.1.14", + "from": "vscode-emmet-helper@>=1.1.14 <2.0.0", + "resolved": "https://registry.npmjs.org/vscode-emmet-helper/-/vscode-emmet-helper-1.1.14.tgz" }, "vscode-languageserver-types": { "version": "3.3.0", diff --git a/extensions/emmet/package.json b/extensions/emmet/package.json index 9251a0cfac0..b768d3c1d90 100644 --- a/extensions/emmet/package.json +++ b/extensions/emmet/package.json @@ -269,7 +269,7 @@ "@emmetio/html-matcher": "^0.3.1", "@emmetio/css-parser": "ramya-rao-a/css-parser#vscode", "@emmetio/math-expression": "^0.1.1", - "vscode-emmet-helper": "^1.1.13", + "vscode-emmet-helper": "^1.1.14", "vscode-languageserver-types": "^3.0.3", "image-size": "^0.5.2", "vscode-nls": "2.0.2" From 26fc403e297345892ecb73b349777b0800819a90 Mon Sep 17 00:00:00 2001 From: Christof Marti Date: Thu, 5 Oct 2017 14:16:42 -0700 Subject: [PATCH 063/158] Enable 'new release' tag (#34432) --- .github/new_release.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/new_release.yml b/.github/new_release.yml index fae254fcc8a..3877cb6f8a2 100644 --- a/.github/new_release.yml +++ b/.github/new_release.yml @@ -1,5 +1,5 @@ { newReleaseLabel: 'new release', - newReleases: ['1.16'], - perform: false + newReleases: ['1.17'], + perform: true } \ No newline at end of file From af6ca44db81f5186d3104226c8e76e026789ce20 Mon Sep 17 00:00:00 2001 From: Christof Marti Date: Thu, 5 Oct 2017 14:18:37 -0700 Subject: [PATCH 064/158] Tasks --- .github/classifier.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/classifier.yml b/.github/classifier.yml index 52f6da98912..02b2d38f649 100644 --- a/.github/classifier.yml +++ b/.github/classifier.yml @@ -39,7 +39,7 @@ php: [ roblourens ], search: [ roblourens ], snippets: [ jrieken ], - tasks: [], + tasks: [ dbaeumer ], typescript: [ mjbvz ], workbench: [ bpasero, isidorn, sandy081] } From c4f33ac612258b7a55f700a424bf0867d2b69375 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Fri, 6 Oct 2017 08:13:55 +0200 Subject: [PATCH 065/158] :lipstick: --- src/vs/base/parts/quickopen/common/quickOpenScorer.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vs/base/parts/quickopen/common/quickOpenScorer.ts b/src/vs/base/parts/quickopen/common/quickOpenScorer.ts index 2d8ea22ecc0..1dce6a05bad 100644 --- a/src/vs/base/parts/quickopen/common/quickOpenScorer.ts +++ b/src/vs/base/parts/quickopen/common/quickOpenScorer.ts @@ -253,13 +253,13 @@ export function scoreItem(item: T, query: string, fuzzy: boolean, accessor: I return cached; } - const itemScore = doScoreItem(label, description, accessor.getItemPath(item), query, fuzzy, accessor); + const itemScore = doScoreItem(label, description, accessor.getItemPath(item), query, fuzzy); cache[cacheHash] = itemScore; return itemScore; } -function doScoreItem(label: string, description: string, path: string, query: string, fuzzy: boolean, accessor: IItemAccessor): IItemScore { +function doScoreItem(label: string, description: string, path: string, query: string, fuzzy: boolean): IItemScore { // 1.) treat identity matches on full path highest if (path && isEqual(query, path, true)) { From 9f1746820c505e671a4d5197f29f2ca23b9adaf1 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Fri, 6 Oct 2017 08:23:04 +0200 Subject: [PATCH 066/158] Text in Tweet Feedback will be broke by Hashtag (#) (fixes #35668) --- .../parts/feedback/electron-browser/feedbackStatusbarItem.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/parts/feedback/electron-browser/feedbackStatusbarItem.ts b/src/vs/workbench/parts/feedback/electron-browser/feedbackStatusbarItem.ts index 0dd4994a388..6af8ce910c7 100644 --- a/src/vs/workbench/parts/feedback/electron-browser/feedbackStatusbarItem.ts +++ b/src/vs/workbench/parts/feedback/electron-browser/feedbackStatusbarItem.ts @@ -26,7 +26,7 @@ class TwitterFeedbackService implements IFeedbackService { } public submitFeedback(feedback: IFeedback): void { - const queryString = `?${feedback.sentiment === 1 ? `hashtags=${this.combineHashTagsAsString()}&` : null}ref_src=twsrc%5Etfw&related=twitterapi%2Ctwitter&text=${feedback.feedback}&tw_p=tweetbutton&via=${TwitterFeedbackService.VIA_NAME}`; + const queryString = `?${feedback.sentiment === 1 ? `hashtags=${this.combineHashTagsAsString()}&` : null}ref_src=twsrc%5Etfw&related=twitterapi%2Ctwitter&text=${encodeURIComponent(feedback.feedback)}&tw_p=tweetbutton&via=${TwitterFeedbackService.VIA_NAME}`; const url = TwitterFeedbackService.TWITTER_URL + queryString; window.open(url); From c7d4aed6a45c1498520b58463601cb82925cceb0 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Thu, 5 Oct 2017 23:54:31 -0700 Subject: [PATCH 067/158] Fix rendering issues in terminal Fixes #35188 Fixes #35660 Fixes #35660 --- npm-shrinkwrap.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index d6d05275089..bb6e64467f2 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -574,7 +574,7 @@ "xterm": { "version": "2.9.1", "from": "Tyriar/xterm.js#vscode-release/1.18", - "resolved": "git+https://github.com/Tyriar/xterm.js.git#1f5d0a878dd1e187c992535302d9f272eb9c26f5" + "resolved": "git+https://github.com/Tyriar/xterm.js.git#b49fe4a329ca792e1eb59d647042e0460e860b4d" }, "yauzl": { "version": "2.8.0", From 84756fea3fea73ebf8e3dba01eb495929bef9274 Mon Sep 17 00:00:00 2001 From: isidor Date: Fri, 6 Oct 2017 10:23:53 +0200 Subject: [PATCH 068/158] paths.join should use .path not .fspath fixes #35680 --- src/vs/workbench/parts/files/browser/fileActions.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/parts/files/browser/fileActions.ts b/src/vs/workbench/parts/files/browser/fileActions.ts index b7d894b6eee..66d35dcd30b 100644 --- a/src/vs/workbench/parts/files/browser/fileActions.ts +++ b/src/vs/workbench/parts/files/browser/fileActions.ts @@ -1047,14 +1047,14 @@ export class DuplicateFileAction extends BaseFileAction { private findTarget(): URI { let name = this.element.name; - let candidate = this.target.resource.with({ path: paths.join(this.target.resource.fsPath, name) }); + let candidate = this.target.resource.with({ path: paths.join(this.target.resource.path, name) }); while (true) { if (!this.element.root.find(candidate)) { break; } name = this.toCopyName(name, this.element.isDirectory); - candidate = this.target.resource.with({ path: paths.join(this.target.resource.fsPath, name) }); + candidate = this.target.resource.with({ path: paths.join(this.target.resource.path, name) }); } return candidate; From a80f5af35d6505ff6a5792a37341926df9209b86 Mon Sep 17 00:00:00 2001 From: isidor Date: Fri, 6 Oct 2017 11:52:29 +0200 Subject: [PATCH 069/158] debug: fix state transitions regarding initializing fixing #31530 --- .../parts/debug/browser/debugActions.ts | 8 +++---- .../parts/debug/browser/debugActionsWidget.ts | 2 +- .../debug/browser/debugEditorModelManager.ts | 2 +- .../debug/electron-browser/debugService.ts | 22 ++++++++++++------- .../debug/electron-browser/debugViewer.ts | 2 +- 5 files changed, 21 insertions(+), 15 deletions(-) diff --git a/src/vs/workbench/parts/debug/browser/debugActions.ts b/src/vs/workbench/parts/debug/browser/debugActions.ts index 205804ac872..dbe837021a9 100644 --- a/src/vs/workbench/parts/debug/browser/debugActions.ts +++ b/src/vs/workbench/parts/debug/browser/debugActions.ts @@ -217,7 +217,7 @@ export class RestartAction extends AbstractDebugAction { } protected isEnabled(state: State): boolean { - return super.isEnabled(state) && state !== State.Inactive; + return super.isEnabled(state) && (state === State.Running || state === State.Stopped); } } @@ -301,7 +301,7 @@ export class StopAction extends AbstractDebugAction { } protected isEnabled(state: State): boolean { - return super.isEnabled(state) && state !== State.Inactive; + return super.isEnabled(state) && (state === State.Running || state === State.Stopped); } } @@ -319,7 +319,7 @@ export class DisconnectAction extends AbstractDebugAction { } protected isEnabled(state: State): boolean { - return super.isEnabled(state) && state !== State.Inactive; + return super.isEnabled(state) && (state === State.Running || state === State.Stopped); } } @@ -518,7 +518,7 @@ export class ReapplyBreakpointsAction extends AbstractDebugAction { protected isEnabled(state: State): boolean { const model = this.debugService.getModel(); - return super.isEnabled(state) && state !== State.Inactive && + return super.isEnabled(state) && (state === State.Running || state === State.Stopped) && (model.getFunctionBreakpoints().length + model.getBreakpoints().length + model.getExceptionBreakpoints().length > 0); } } diff --git a/src/vs/workbench/parts/debug/browser/debugActionsWidget.ts b/src/vs/workbench/parts/debug/browser/debugActionsWidget.ts index fed2b8590fc..5818d30bd3b 100644 --- a/src/vs/workbench/parts/debug/browser/debugActionsWidget.ts +++ b/src/vs/workbench/parts/debug/browser/debugActionsWidget.ts @@ -196,7 +196,7 @@ export class DebugActionsWidget extends Themable implements IWorkbenchContributi } private update(state: State): void { - if (state === State.Inactive || this.configurationService.getConfiguration('debug').hideActionBar) { + if (state === State.Inactive || state === State.Initializing || this.configurationService.getConfiguration('debug').hideActionBar) { return this.hide(); } diff --git a/src/vs/workbench/parts/debug/browser/debugEditorModelManager.ts b/src/vs/workbench/parts/debug/browser/debugEditorModelManager.ts index e229724a162..6fd5d7c1c20 100644 --- a/src/vs/workbench/parts/debug/browser/debugEditorModelManager.ts +++ b/src/vs/workbench/parts/debug/browser/debugEditorModelManager.ts @@ -274,7 +274,7 @@ export class DebugEditorModelManager implements IWorkbenchContribution { private getBreakpointDecorationOptions(breakpoint: IBreakpoint): IModelDecorationOptions { const activated = this.debugService.getModel().areBreakpointsActivated(); const state = this.debugService.state; - const debugActive = state === State.Running || state === State.Stopped || state === State.Initializing; + const debugActive = state === State.Running || state === State.Stopped; const modelData = this.modelDataMap.get(breakpoint.uri.toString()); let result = (!breakpoint.enabled || !activated) ? DebugEditorModelManager.BREAKPOINT_DISABLED_DECORATION : diff --git a/src/vs/workbench/parts/debug/electron-browser/debugService.ts b/src/vs/workbench/parts/debug/electron-browser/debugService.ts index 3ea09044e57..a47e5a09be6 100644 --- a/src/vs/workbench/parts/debug/electron-browser/debugService.ts +++ b/src/vs/workbench/parts/debug/electron-browser/debugService.ts @@ -518,6 +518,7 @@ export class DebugService implements debug.IDebugService { } private updateStateAndEmit(sessionId?: string, newState?: debug.State): void { + const previousState = this.state; if (sessionId) { if (newState === debug.State.Inactive) { this.sessionStates.delete(sessionId); @@ -527,11 +528,13 @@ export class DebugService implements debug.IDebugService { } const state = this.state; - const stateLabel = debug.State[state]; - if (stateLabel) { - this.debugState.set(stateLabel.toLowerCase()); + if (previousState !== state) { + const stateLabel = debug.State[state]; + if (stateLabel) { + this.debugState.set(stateLabel.toLowerCase()); + } + this._onDidChangeState.fire(state); } - this._onDidChangeState.fire(state); } public focusStackFrameAndEvaluate(stackFrame: debug.IStackFrame, process?: debug.IProcess, explicit?: boolean): TPromise { @@ -741,12 +744,15 @@ export class DebugService implements debug.IDebugService { return TPromise.wrapError(errors.create(message, { actions: [this.instantiationService.createInstance(debugactions.ConfigureAction, debugactions.ConfigureAction.ID, debugactions.ConfigureAction.LABEL), CloseAction] })); } + const sessionId = generateUuid(); + this.updateStateAndEmit(sessionId, debug.State.Initializing); + return this.runPreLaunchTask(root, resolvedConfig.preLaunchTask).then((taskSummary: ITaskSummary) => { const errorCount = resolvedConfig.preLaunchTask ? this.markerService.getStatistics().errors : 0; const successExitCode = taskSummary && taskSummary.exitCode === 0; const failureExitCode = taskSummary && taskSummary.exitCode !== undefined && taskSummary.exitCode !== 0; if (successExitCode || (errorCount === 0 && !failureExitCode)) { - return this.doCreateProcess(root, resolvedConfig); + return this.doCreateProcess(root, resolvedConfig, sessionId); } this.messageService.show(severity.Error, { @@ -756,7 +762,7 @@ export class DebugService implements debug.IDebugService { actions: [ new Action('debug.continue', nls.localize('debugAnyway', "Debug Anyway"), null, true, () => { this.messageService.hideAll(); - return this.doCreateProcess(root, resolvedConfig); + return this.doCreateProcess(root, resolvedConfig, sessionId); }), this.instantiationService.createInstance(ToggleMarkersPanelAction, ToggleMarkersPanelAction.ID, ToggleMarkersPanelAction.LABEL), CloseAction @@ -764,6 +770,7 @@ export class DebugService implements debug.IDebugService { }); return undefined; }, (err: TaskError) => { + this.updateStateAndEmit(sessionId, debug.State.Inactive); this.messageService.show(err.severity, { message: err.message, actions: [ @@ -789,9 +796,8 @@ export class DebugService implements debug.IDebugService { ); } - private doCreateProcess(root: IWorkspaceFolder, configuration: debug.IConfig, sessionId = generateUuid()): TPromise { + private doCreateProcess(root: IWorkspaceFolder, configuration: debug.IConfig, sessionId: string): TPromise { configuration.__sessionId = sessionId; - this.updateStateAndEmit(sessionId, debug.State.Initializing); this.inDebugMode.set(true); return this.telemetryService.getTelemetryInfo().then(info => { diff --git a/src/vs/workbench/parts/debug/electron-browser/debugViewer.ts b/src/vs/workbench/parts/debug/electron-browser/debugViewer.ts index e5be9a9f8c0..63225f8c8e4 100644 --- a/src/vs/workbench/parts/debug/electron-browser/debugViewer.ts +++ b/src/vs/workbench/parts/debug/electron-browser/debugViewer.ts @@ -1237,7 +1237,7 @@ export class BreakpointsRenderer implements IRenderer { data.filePath.textContent = getPathLabel(resources.dirname(breakpoint.uri), this.contextService, this.environmentService); data.checkbox.checked = breakpoint.enabled; - const debugActive = this.debugService.state === debug.State.Running || this.debugService.state === debug.State.Stopped || this.debugService.state === debug.State.Initializing; + const debugActive = this.debugService.state === debug.State.Running || this.debugService.state === debug.State.Stopped; if (debugActive && !breakpoint.verified) { tree.addTraits('disabled', [breakpoint]); if (breakpoint.message) { From 0f4fdb82cf14429b35614a82ac8aab336c61ee06 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krzysztof=20Cie=C5=9Blak?= Date: Fri, 6 Oct 2017 12:48:17 +0200 Subject: [PATCH 070/158] Remove new context from editorContextKeys and rename --- src/vs/editor/common/editorContextKeys.ts | 1 - src/vs/editor/common/modes/editorModeContext.ts | 5 ----- src/vs/workbench/common/resources.ts | 2 +- 3 files changed, 1 insertion(+), 7 deletions(-) diff --git a/src/vs/editor/common/editorContextKeys.ts b/src/vs/editor/common/editorContextKeys.ts index 4283b4e989a..8843cf821d4 100644 --- a/src/vs/editor/common/editorContextKeys.ts +++ b/src/vs/editor/common/editorContextKeys.ts @@ -28,7 +28,6 @@ export namespace EditorContextKeys { // -- mode context keys export const languageId = new RawContextKey('editorLangId', undefined); - export const editorExtension = new RawContextKey('editorExtension', undefined); export const hasCompletionItemProvider = new RawContextKey('editorHasCompletionItemProvider', undefined); export const hasCodeActionsProvider = new RawContextKey('editorHasCodeActionsProvider', undefined); export const hasCodeLensProvider = new RawContextKey('editorHasCodeLensProvider', undefined); diff --git a/src/vs/editor/common/modes/editorModeContext.ts b/src/vs/editor/common/modes/editorModeContext.ts index b503700f9d7..a22237cf04e 100644 --- a/src/vs/editor/common/modes/editorModeContext.ts +++ b/src/vs/editor/common/modes/editorModeContext.ts @@ -10,14 +10,12 @@ import * as modes from 'vs/editor/common/modes'; import { ICommonCodeEditor } from 'vs/editor/common/editorCommon'; import { EditorContextKeys } from 'vs/editor/common/editorContextKeys'; import { Schemas } from 'vs/base/common/network'; -import * as paths from 'vs/base/common/paths'; export class EditorModeContext extends Disposable { private _editor: ICommonCodeEditor; private _langId: IContextKey; - private _editorExtension: IContextKey; private _hasCompletionItemProvider: IContextKey; private _hasCodeActionsProvider: IContextKey; private _hasCodeLensProvider: IContextKey; @@ -42,7 +40,6 @@ export class EditorModeContext extends Disposable { this._editor = editor; this._langId = EditorContextKeys.languageId.bindTo(contextKeyService); - this._editorExtension = EditorContextKeys.editorExtension.bindTo(contextKeyService); this._hasCompletionItemProvider = EditorContextKeys.hasCompletionItemProvider.bindTo(contextKeyService); this._hasCodeActionsProvider = EditorContextKeys.hasCodeActionsProvider.bindTo(contextKeyService); this._hasCodeLensProvider = EditorContextKeys.hasCodeLensProvider.bindTo(contextKeyService); @@ -90,7 +87,6 @@ export class EditorModeContext extends Disposable { reset() { this._langId.reset(); - this._editorExtension.reset(); this._hasCompletionItemProvider.reset(); this._hasCodeActionsProvider.reset(); this._hasCodeLensProvider.reset(); @@ -115,7 +111,6 @@ export class EditorModeContext extends Disposable { return; } this._langId.set(model.getLanguageIdentifier().language); - this._editorExtension.set(paths.extname(model.uri.fsPath)); this._hasCompletionItemProvider.set(modes.SuggestRegistry.has(model)); this._hasCodeActionsProvider.set(modes.CodeActionProviderRegistry.has(model)); this._hasCodeLensProvider.set(modes.CodeLensProviderRegistry.has(model)); diff --git a/src/vs/workbench/common/resources.ts b/src/vs/workbench/common/resources.ts index 67857f78e7c..ec82d07b99b 100644 --- a/src/vs/workbench/common/resources.ts +++ b/src/vs/workbench/common/resources.ts @@ -23,7 +23,7 @@ export class ResourceContextKey implements IContextKey { static Filename = new RawContextKey('resourceFilename', undefined); static LangId = new RawContextKey('resourceLangId', undefined); static Resource = new RawContextKey('resource', undefined); - static Extension = new RawContextKey('resourceExtension', undefined); + static Extension = new RawContextKey('resourceExtname', undefined); private _resourceKey: IContextKey; private _schemeKey: IContextKey; From c8eb003402ce5d6e0529a4da459b863ac5610af9 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Fri, 6 Oct 2017 13:01:23 +0200 Subject: [PATCH 071/158] messages - add workbench API to add checkbox to confirmations --- .../standalone/browser/simpleServices.ts | 9 ++- .../common/abstractKeybindingService.test.ts | 1 + src/vs/platform/message/common/message.ts | 16 +++++- src/vs/platform/windows/common/windows.ts | 8 ++- .../windows/electron-browser/windowService.ts | 12 +++- .../extensions/browser/extensionsActions.ts | 2 +- .../parts/files/browser/fileActions.ts | 6 +- .../files/browser/views/explorerViewer.ts | 4 +- .../performance.contribution.ts | 4 +- .../relauncher.contribution.ts | 2 +- .../parts/search/browser/searchViewlet.ts | 2 +- .../electron-browser/task.contribution.ts | 4 +- .../electron-browser/terminalService.ts | 17 ++---- .../message/browser/messageService.ts | 9 ++- .../electron-browser/messageService.ts | 56 ++++++++++++++++--- .../electron-browser/textFileService.ts | 2 +- .../workbench/test/workbenchTestServices.ts | 17 ++++-- 17 files changed, 126 insertions(+), 45 deletions(-) diff --git a/src/vs/editor/standalone/browser/simpleServices.ts b/src/vs/editor/standalone/browser/simpleServices.ts index 77ab380591f..98464fac20a 100644 --- a/src/vs/editor/standalone/browser/simpleServices.ts +++ b/src/vs/editor/standalone/browser/simpleServices.ts @@ -17,7 +17,7 @@ import { USLayoutResolvedKeybinding } from 'vs/platform/keybinding/common/usLayo import { KeybindingResolver } from 'vs/platform/keybinding/common/keybindingResolver'; import { IKeybindingEvent, KeybindingSource, IKeyboardEvent } from 'vs/platform/keybinding/common/keybinding'; import { ContextKeyExpr, IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; -import { IConfirmation, IMessageService } from 'vs/platform/message/common/message'; +import { IConfirmation, IMessageService, IConfirmationResult } from 'vs/platform/message/common/message'; import { IWorkspaceContextService, IWorkspace, WorkbenchState, IWorkspaceFolder, IWorkspaceFoldersChangeEvent, WorkspaceFolder } from 'vs/platform/workspace/common/workspace'; import * as editorCommon from 'vs/editor/common/editorCommon'; import { ICodeEditor, IDiffEditor } from 'vs/editor/browser/editorBrowser'; @@ -236,6 +236,7 @@ export class SimpleProgressService implements IProgressService { } export class SimpleMessageService implements IMessageService { + public _serviceBrand: any; private static Empty = function () { /* nothing */ }; @@ -261,7 +262,7 @@ export class SimpleMessageService implements IMessageService { // No-op } - public confirm(confirmation: IConfirmation): boolean { + public confirmSync(confirmation: IConfirmation): boolean { let messageText = confirmation.message; if (confirmation.detail) { messageText = messageText + '\n\n' + confirmation.detail; @@ -269,6 +270,10 @@ export class SimpleMessageService implements IMessageService { return window.confirm(messageText); } + + public confirm(confirmation: IConfirmation): TPromise { + return TPromise.as({ confirmed: this.confirmSync(confirmation) } as IConfirmationResult); + } } export class StandaloneCommandService implements ICommandService { diff --git a/src/vs/platform/keybinding/test/common/abstractKeybindingService.test.ts b/src/vs/platform/keybinding/test/common/abstractKeybindingService.test.ts index e0ce67f7b53..e9468d0dd7b 100644 --- a/src/vs/platform/keybinding/test/common/abstractKeybindingService.test.ts +++ b/src/vs/platform/keybinding/test/common/abstractKeybindingService.test.ts @@ -124,6 +124,7 @@ suite('AbstractKeybindingService', () => { let messageService: IMessageService = { _serviceBrand: undefined, hideAll: undefined, + confirmSync: undefined, confirm: undefined, show: (sev: Severity, message: any): () => void => { showMessageCalls.push({ diff --git a/src/vs/platform/message/common/message.ts b/src/vs/platform/message/common/message.ts index 627bbe0900b..bca37832245 100644 --- a/src/vs/platform/message/common/message.ts +++ b/src/vs/platform/message/common/message.ts @@ -23,6 +23,10 @@ export interface IConfirmation { detail?: string; primaryButton?: string; secondaryButton?: string; + checkbox?: { + label: string; + checked: boolean; + }; } export const CloseAction = new Action('close.message', nls.localize('close', "Close"), null, true, () => TPromise.as(true)); @@ -31,6 +35,11 @@ export const CancelAction = new Action('cancel.message', nls.localize('cancel', export const IMessageService = createDecorator('messageService'); +export interface IConfirmationResult { + confirmed: boolean; + checkboxChecked?: boolean; +} + export interface IMessageService { _serviceBrand: any; @@ -53,7 +62,12 @@ export interface IMessageService { /** * Ask the user for confirmation. */ - confirm(confirmation: IConfirmation): boolean; + confirmSync(confirmation: IConfirmation): boolean; + + /** + * Ask the user for confirmation without blocking. + */ + confirm(confirmation: IConfirmation): TPromise; } export const IChoiceService = createDecorator('choiceService'); diff --git a/src/vs/platform/windows/common/windows.ts b/src/vs/platform/windows/common/windows.ts index 7b73cdba8f6..5f6c19c1d55 100644 --- a/src/vs/platform/windows/common/windows.ts +++ b/src/vs/platform/windows/common/windows.ts @@ -100,6 +100,11 @@ export interface IWindowsService { export const IWindowService = createDecorator('windowService'); +export interface IMessageBoxResult { + button: number; + checkboxChecked?: boolean; +} + export interface IWindowService { _serviceBrand: any; @@ -130,7 +135,8 @@ export interface IWindowService { unmaximizeWindow(): TPromise; onWindowTitleDoubleClick(): TPromise; show(): TPromise; - showMessageBox(options: Electron.MessageBoxOptions): number; + showMessageBoxSync(options: Electron.MessageBoxOptions): number; + showMessageBox(options: Electron.MessageBoxOptions): TPromise; showSaveDialog(options: Electron.SaveDialogOptions, callback?: (fileName: string) => void): string; showOpenDialog(options: Electron.OpenDialogOptions, callback?: (fileNames: string[]) => void): string[]; } diff --git a/src/vs/platform/windows/electron-browser/windowService.ts b/src/vs/platform/windows/electron-browser/windowService.ts index 08008298b52..0cf353eb6f2 100644 --- a/src/vs/platform/windows/electron-browser/windowService.ts +++ b/src/vs/platform/windows/electron-browser/windowService.ts @@ -7,7 +7,7 @@ import Event, { filterEvent, mapEvent, any } from 'vs/base/common/event'; import { TPromise } from 'vs/base/common/winjs.base'; -import { IWindowService, IWindowsService, INativeOpenDialogOptions, IEnterWorkspaceResult } from 'vs/platform/windows/common/windows'; +import { IWindowService, IWindowsService, INativeOpenDialogOptions, IEnterWorkspaceResult, IMessageBoxResult } from 'vs/platform/windows/common/windows'; import { remote } from 'electron'; import { IRecentlyOpened } from 'vs/platform/history/common/history'; import { ICommandAction } from 'vs/platform/actions/common/actions'; @@ -127,10 +127,18 @@ export class WindowService implements IWindowService { return this.windowsService.showWindow(this.windowId); } - showMessageBox(options: Electron.MessageBoxOptions): number { + showMessageBoxSync(options: Electron.MessageBoxOptions): number { return remote.dialog.showMessageBox(remote.getCurrentWindow(), options); } + showMessageBox(options: Electron.MessageBoxOptions): TPromise { + return new TPromise((c, e) => { + return remote.dialog.showMessageBox(remote.getCurrentWindow(), options, (response: number, checkboxChecked: boolean) => { + c({ button: response, checkboxChecked }); + }); + }); + } + showSaveDialog(options: Electron.SaveDialogOptions, callback?: (fileName: string) => void): string { if (callback) { return remote.dialog.showSaveDialog(remote.getCurrentWindow(), options, callback); diff --git a/src/vs/workbench/parts/extensions/browser/extensionsActions.ts b/src/vs/workbench/parts/extensions/browser/extensionsActions.ts index 4d01be27283..1217632d2ab 100644 --- a/src/vs/workbench/parts/extensions/browser/extensionsActions.ts +++ b/src/vs/workbench/parts/extensions/browser/extensionsActions.ts @@ -878,7 +878,7 @@ export class ReloadAction extends Action { } run(): TPromise { - if (this.messageService.confirm({ message: this.reloadMessaage, type: 'question', primaryButton: localize('reload', "&&Reload Window") })) { + if (this.messageService.confirmSync({ message: this.reloadMessaage, type: 'question', primaryButton: localize('reload', "&&Reload Window") })) { return this.windowService.reloadWindow(); } return TPromise.wrap(null); diff --git a/src/vs/workbench/parts/files/browser/fileActions.ts b/src/vs/workbench/parts/files/browser/fileActions.ts index 66d35dcd30b..6ba3061b421 100644 --- a/src/vs/workbench/parts/files/browser/fileActions.ts +++ b/src/vs/workbench/parts/files/browser/fileActions.ts @@ -687,7 +687,7 @@ export class BaseDeleteFileAction extends BaseFileAction { message = nls.localize('dirtyMessageFileDelete', "You are deleting a file with unsaved changes. Do you want to continue?"); } - const res = this.messageService.confirm({ + const res = this.messageService.confirmSync({ message, type: 'warning', detail: nls.localize('dirtyWarning', "Your changes will be lost if you don't save them."), @@ -724,7 +724,7 @@ export class BaseDeleteFileAction extends BaseFileAction { }; } - if (!this.messageService.confirm(confirm)) { + if (!this.messageService.confirmSync(confirm)) { return TPromise.as(null); } } @@ -836,7 +836,7 @@ export class ImportFileAction extends BaseFileAction { type: 'warning' }; - overwrite = this.messageService.confirm(confirm); + overwrite = this.messageService.confirmSync(confirm); } if (!overwrite) { diff --git a/src/vs/workbench/parts/files/browser/views/explorerViewer.ts b/src/vs/workbench/parts/files/browser/views/explorerViewer.ts index c088be1988d..de177195395 100644 --- a/src/vs/workbench/parts/files/browser/views/explorerViewer.ts +++ b/src/vs/workbench/parts/files/browser/views/explorerViewer.ts @@ -917,7 +917,7 @@ export class FileDragAndDrop extends SimpleFileResourceDragAndDrop { } // If we are in single-folder context, ask for confirmation to create a workspace - const result = this.messageService.confirm({ + const result = this.messageService.confirmSync({ message: folders.length > 1 ? nls.localize('dropFolders', "Do you want to add the folders to the workspace?") : nls.localize('dropFolder', "Do you want to add the folder to the workspace?"), type: 'question', primaryButton: folders.length > 1 ? nls.localize('addFolders', "&&Add Folders") : nls.localize('addFolder', "&&Add Folder") @@ -1011,7 +1011,7 @@ export class FileDragAndDrop extends SimpleFileResourceDragAndDrop { }; // Move with overwrite if the user confirms - if (this.messageService.confirm(confirm)) { + if (this.messageService.confirmSync(confirm)) { const targetDirty = this.textFileService.getDirty().filter(d => resources.isEqualOrParent(d, targetResource, !isLinux /* ignorecase */)); // Make sure to revert all dirty in target first to be able to overwrite properly diff --git a/src/vs/workbench/parts/performance/electron-browser/performance.contribution.ts b/src/vs/workbench/parts/performance/electron-browser/performance.contribution.ts index fb56e3ed9b7..fffca3a3e5e 100644 --- a/src/vs/workbench/parts/performance/electron-browser/performance.contribution.ts +++ b/src/vs/workbench/parts/performance/electron-browser/performance.contribution.ts @@ -57,7 +57,7 @@ class StartupProfiler implements IWorkbenchContribution { }).then(files => { const profileFiles = files.reduce((prev, cur) => `${prev}${join(profileStartup.dir, cur)}\n`, '\n'); - const primaryButton = this._messageService.confirm({ + const primaryButton = this._messageService.confirmSync({ type: 'info', message: localize('prof.message', "Successfully created profiles."), detail: localize('prof.detail', "Please create an issue and manually attach the following files:\n{0}", profileFiles), @@ -72,7 +72,7 @@ class StartupProfiler implements IWorkbenchContribution { action.run(`:warning: Make sure to **attach** these files from your *home*-directory: :warning:\n${files.map(file => `-\`${file}\``).join('\n')}`) ]).then(() => { // keep window stable until restart is selected - this._messageService.confirm({ + this._messageService.confirmSync({ type: 'info', message: localize('prof.thanks', "Thanks for helping us."), detail: localize('prof.detail.restart', "A final restart is required to continue to use '{0}'. Again, thank you for your contribution.", this._environmentService.appNameLong), diff --git a/src/vs/workbench/parts/relauncher/electron-browser/relauncher.contribution.ts b/src/vs/workbench/parts/relauncher/electron-browser/relauncher.contribution.ts index e64e76450d8..854fbca08ae 100644 --- a/src/vs/workbench/parts/relauncher/electron-browser/relauncher.contribution.ts +++ b/src/vs/workbench/parts/relauncher/electron-browser/relauncher.contribution.ts @@ -130,7 +130,7 @@ export class SettingsChangeRelauncher implements IWorkbenchContribution { private doConfirm(message: string, detail: string, primaryButton: string, confirmed: () => void): void { this.windowService.isFocused().then(focused => { if (focused) { - const confirm = this.messageService.confirm({ + const confirm = this.messageService.confirmSync({ type: 'info', message, detail, diff --git a/src/vs/workbench/parts/search/browser/searchViewlet.ts b/src/vs/workbench/parts/search/browser/searchViewlet.ts index e047c75a4e7..c509fe0a1a5 100644 --- a/src/vs/workbench/parts/search/browser/searchViewlet.ts +++ b/src/vs/workbench/parts/search/browser/searchViewlet.ts @@ -388,7 +388,7 @@ export class SearchViewlet extends Viewlet { type: 'question' }; - if (this.messageService.confirm(confirmation)) { + if (this.messageService.confirmSync(confirmation)) { this.searchWidget.setReplaceAllActionState(false); this.viewModel.searchResult.replaceAll(progressRunner).then(() => { progressRunner.done(); diff --git a/src/vs/workbench/parts/tasks/electron-browser/task.contribution.ts b/src/vs/workbench/parts/tasks/electron-browser/task.contribution.ts index 33f2fc8435b..1737491b685 100644 --- a/src/vs/workbench/parts/tasks/electron-browser/task.contribution.ts +++ b/src/vs/workbench/parts/tasks/electron-browser/task.contribution.ts @@ -1749,7 +1749,7 @@ class TaskService extends EventEmitter implements ITaskService { if (this._taskSystem instanceof TerminalTaskSystem) { return false; } - if (this._taskSystem.canAutoTerminate() || this.messageService.confirm({ + if (this._taskSystem.canAutoTerminate() || this.messageService.confirmSync({ message: nls.localize('TaskSystem.runningTask', 'There is a task running. Do you want to terminate it?'), primaryButton: nls.localize({ key: 'TaskSystem.terminateTask', comment: ['&& denotes a mnemonic'] }, "&&Terminate Task"), type: 'question' @@ -1771,7 +1771,7 @@ class TaskService extends EventEmitter implements ITaskService { this.disposeTaskSystemListeners(); return false; // no veto } else if (code && code === TerminateResponseCode.ProcessNotFound) { - return !this.messageService.confirm({ + return !this.messageService.confirmSync({ message: nls.localize('TaskSystem.noProcess', 'The launched task doesn\'t exist anymore. If the task spawned background processes exiting VS Code might result in orphaned processes. To avoid this start the last background process with a wait flag.'), primaryButton: nls.localize({ key: 'TaskSystem.exitAnyways', comment: ['&& denotes a mnemonic'] }, "&&Exit Anyways"), type: 'info' diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminalService.ts b/src/vs/workbench/parts/terminal/electron-browser/terminalService.ts index baa9d6819ad..512c65ed2d4 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminalService.ts +++ b/src/vs/workbench/parts/terminal/electron-browser/terminalService.ts @@ -6,7 +6,6 @@ import * as nls from 'vs/nls'; import * as pfs from 'vs/base/node/pfs'; import * as platform from 'vs/base/common/platform'; -import product from 'vs/platform/node/product'; import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { ILifecycleService } from 'vs/platform/lifecycle/common/lifecycle'; @@ -20,7 +19,7 @@ import { TerminalService as AbstractTerminalService } from 'vs/workbench/parts/t import { TerminalConfigHelper } from 'vs/workbench/parts/terminal/electron-browser/terminalConfigHelper'; import { TerminalInstance } from 'vs/workbench/parts/terminal/electron-browser/terminalInstance'; import { TPromise } from 'vs/base/common/winjs.base'; -import { IChoiceService } from 'vs/platform/message/common/message'; +import { IChoiceService, IMessageService } from 'vs/platform/message/common/message'; import Severity from 'vs/base/common/severity'; import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage'; import { TERMINAL_DEFAULT_SHELL_WINDOWS } from 'vs/workbench/parts/terminal/electron-browser/terminal'; @@ -42,7 +41,8 @@ export class TerminalService extends AbstractTerminalService implements ITermina @IQuickOpenService private _quickOpenService: IQuickOpenService, @IConfigurationEditingService private _configurationEditingService: IConfigurationEditingService, @IChoiceService private _choiceService: IChoiceService, - @IStorageService private _storageService: IStorageService + @IStorageService private _storageService: IStorageService, + @IMessageService private _messageService: IMessageService ) { super(_contextKeyService, _configurationService, _panelService, _partService, _lifecycleService); @@ -218,22 +218,17 @@ export class TerminalService extends AbstractTerminalService implements ITermina } protected _showTerminalCloseConfirmation(): boolean { - const cancelId = 1; let message; if (this.terminalInstances.length === 1) { message = nls.localize('terminalService.terminalCloseConfirmationSingular', "There is an active terminal session, do you want to kill it?"); } else { message = nls.localize('terminalService.terminalCloseConfirmationPlural', "There are {0} active terminal sessions, do you want to kill them?", this.terminalInstances.length); } - const opts: Electron.MessageBoxOptions = { - title: product.nameLong, + + return !this._messageService.confirmSync({ message, type: 'warning', - buttons: [nls.localize('yes', "Yes"), nls.localize('cancel', "Cancel")], - noLink: true, - cancelId - }; - return this._windowService.showMessageBox(opts) === cancelId; + }); } public setContainers(panelContainer: HTMLElement, terminalContainer: HTMLElement): void { diff --git a/src/vs/workbench/services/message/browser/messageService.ts b/src/vs/workbench/services/message/browser/messageService.ts index f0f6af73d98..9fe4dd36645 100644 --- a/src/vs/workbench/services/message/browser/messageService.ts +++ b/src/vs/workbench/services/message/browser/messageService.ts @@ -9,9 +9,10 @@ import { toErrorMessage } from 'vs/base/common/errorMessage'; import types = require('vs/base/common/types'); import { MessageList, Severity as BaseSeverity } from 'vs/workbench/services/message/browser/messageList'; import { IDisposable, dispose } from 'vs/base/common/lifecycle'; -import { IMessageService, IMessageWithAction, IConfirmation, Severity } from 'vs/platform/message/common/message'; +import { IMessageService, IMessageWithAction, IConfirmation, Severity, IConfirmationResult } from 'vs/platform/message/common/message'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import Event from 'vs/base/common/event'; +import { TPromise } from 'vs/base/common/winjs.base'; interface IBufferedMessage { severity: Severity; @@ -135,7 +136,7 @@ export class WorkbenchMessageService implements IMessageService { } } - public confirm(confirmation: IConfirmation): boolean { + public confirmSync(confirmation: IConfirmation): boolean { let messageText = confirmation.message; if (confirmation.detail) { messageText = messageText + '\n\n' + confirmation.detail; @@ -144,6 +145,10 @@ export class WorkbenchMessageService implements IMessageService { return window.confirm(messageText); } + public confirm(confirmation: IConfirmation): TPromise { + return TPromise.as({ confirmed: this.confirmSync(confirmation) } as IConfirmationResult); + } + public dispose(): void { this.toDispose = dispose(this.toDispose); } diff --git a/src/vs/workbench/services/message/electron-browser/messageService.ts b/src/vs/workbench/services/message/electron-browser/messageService.ts index dc057c38560..f676f67dc54 100644 --- a/src/vs/workbench/services/message/electron-browser/messageService.ts +++ b/src/vs/workbench/services/message/electron-browser/messageService.ts @@ -9,11 +9,11 @@ import nls = require('vs/nls'); import product from 'vs/platform/node/product'; import { TPromise } from 'vs/base/common/winjs.base'; import { WorkbenchMessageService } from 'vs/workbench/services/message/browser/messageService'; -import { IConfirmation, Severity, IChoiceService } from 'vs/platform/message/common/message'; +import { IConfirmation, Severity, IChoiceService, IConfirmationResult } from 'vs/platform/message/common/message'; import { isLinux } from 'vs/base/common/platform'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { Action } from 'vs/base/common/actions'; -import { IWindowService } from 'vs/platform/windows/common/windows'; +import { IWindowService, IMessageBoxResult } from 'vs/platform/windows/common/windows'; import { mnemonicButtonLabel } from 'vs/base/common/labels'; export class MessageService extends WorkbenchMessageService implements IChoiceService { @@ -26,8 +26,26 @@ export class MessageService extends WorkbenchMessageService implements IChoiceSe super(container, telemetryService); } - public confirm(confirmation: IConfirmation): boolean { + public confirm(confirmation: IConfirmation): TPromise { + const opts = this.getConfirmOptions(confirmation); + return this.showMessageBox(opts).then(result => { + return { + confirmed: result.button === 0 ? true : false, + checkboxChecked: result.checkboxChecked + } as IConfirmationResult; + }); + } + + public confirmSync(confirmation: IConfirmation): boolean { + const opts = this.getConfirmOptions(confirmation); + + const result = this.showMessageBoxSync(opts); + + return result === 0 ? true : false; + } + + private getConfirmOptions(confirmation: IConfirmation): Electron.MessageBoxOptions { const buttons: string[] = []; if (confirmation.primaryButton) { buttons.push(confirmation.primaryButton); @@ -57,15 +75,18 @@ export class MessageService extends WorkbenchMessageService implements IChoiceSe opts.type = confirmation.type; } - let result = this.showMessageBox(opts); + if (confirmation.checkbox) { + opts.checkboxLabel = confirmation.checkbox.label; + opts.checkboxChecked = confirmation.checkbox.checked; + } - return result === 0 ? true : false; + return opts; } public choose(severity: Severity, message: string, options: string[], cancelId: number, modal: boolean = false): TPromise { if (modal) { const type: 'none' | 'info' | 'error' | 'question' | 'warning' = severity === Severity.Info ? 'question' : severity === Severity.Error ? 'error' : severity === Severity.Warning ? 'warning' : 'none'; - return TPromise.wrap(this.showMessageBox({ message, buttons: options, type, cancelId })); + return TPromise.wrap(this.showMessageBoxSync({ message, buttons: options, type, cancelId })); } let onCancel: () => void = null; @@ -84,7 +105,25 @@ export class MessageService extends WorkbenchMessageService implements IChoiceSe return promise; } - private showMessageBox(opts: Electron.MessageBoxOptions): number { + private showMessageBox(opts: Electron.MessageBoxOptions): TPromise { + opts = this.massageMessageBoxOptions(opts); + + return this.windowService.showMessageBox(opts).then(result => { + return { + button: isLinux ? opts.buttons.length - result.button - 1 : result.button, + checkboxChecked: result.checkboxChecked + } as IMessageBoxResult; + }); + } + + private showMessageBoxSync(opts: Electron.MessageBoxOptions): number { + opts = this.massageMessageBoxOptions(opts); + + const result = this.windowService.showMessageBoxSync(opts); + return isLinux ? opts.buttons.length - result - 1 : result; + } + + private massageMessageBoxOptions(opts: Electron.MessageBoxOptions): Electron.MessageBoxOptions { opts.buttons = opts.buttons.map(button => mnemonicButtonLabel(button)); opts.buttons = isLinux ? opts.buttons.reverse() : opts.buttons; @@ -99,7 +138,6 @@ export class MessageService extends WorkbenchMessageService implements IChoiceSe opts.noLink = true; opts.title = opts.title || product.nameLong; - const result = this.windowService.showMessageBox(opts); - return isLinux ? opts.buttons.length - result - 1 : result; + return opts; } } diff --git a/src/vs/workbench/services/textfile/electron-browser/textFileService.ts b/src/vs/workbench/services/textfile/electron-browser/textFileService.ts index d0d82ebc959..efff4d1b7f1 100644 --- a/src/vs/workbench/services/textfile/electron-browser/textFileService.ts +++ b/src/vs/workbench/services/textfile/electron-browser/textFileService.ts @@ -132,7 +132,7 @@ export class TextFileService extends AbstractTextFileService { opts.defaultId = 2; } - const choice = this.windowService.showMessageBox(opts); + const choice = this.windowService.showMessageBoxSync(opts); return buttons[choice].result; } diff --git a/src/vs/workbench/test/workbenchTestServices.ts b/src/vs/workbench/test/workbenchTestServices.ts index d2f8ef1366e..e09df0d1813 100644 --- a/src/vs/workbench/test/workbenchTestServices.ts +++ b/src/vs/workbench/test/workbenchTestServices.ts @@ -26,7 +26,7 @@ import { TextModelResolverService } from 'vs/workbench/services/textmodelResolve import { ITextModelService } from 'vs/editor/common/services/resolverService'; import { IEditorInput, IEditorOptions, Position, Direction, IEditor, IResourceInput, ITextEditorSelection } from 'vs/platform/editor/common/editor'; import { IUntitledEditorService, UntitledEditorService } from 'vs/workbench/services/untitled/common/untitledEditorService'; -import { IMessageService, IConfirmation } from 'vs/platform/message/common/message'; +import { IMessageService, IConfirmation, IConfirmationResult } from 'vs/platform/message/common/message'; import { IWorkspaceContextService, IWorkspace as IWorkbenchWorkspace, WorkbenchState, IWorkspaceFolder, IWorkspaceFoldersChangeEvent } from 'vs/platform/workspace/common/workspace'; import { ILifecycleService, ShutdownEvent, ShutdownReason, StartupKind, LifecyclePhase } from 'vs/platform/lifecycle/common/lifecycle'; import { EditorStacksModel } from 'vs/workbench/common/editor/editorStacksModel'; @@ -46,7 +46,7 @@ import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/edi import { IHistoryService } from 'vs/workbench/services/history/common/history'; import { IInstantiationService, ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; import { TestConfigurationService } from 'vs/platform/configuration/test/common/testConfigurationService'; -import { IWindowsService, IWindowService, INativeOpenDialogOptions, IEnterWorkspaceResult } from 'vs/platform/windows/common/windows'; +import { IWindowsService, IWindowService, INativeOpenDialogOptions, IEnterWorkspaceResult, IMessageBoxResult } from 'vs/platform/windows/common/windows'; import { TestWorkspace } from 'vs/platform/workspace/test/common/testWorkspace'; import { RawTextSource, IRawTextSource } from 'vs/editor/common/model/textSource'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; @@ -299,6 +299,7 @@ export class TestHistoryService implements IHistoryService { } export class TestMessageService implements IMessageService { + public _serviceBrand: any; private counter: number; @@ -321,9 +322,13 @@ export class TestMessageService implements IMessageService { // No-op } - public confirm(confirmation: IConfirmation): boolean { + public confirmSync(confirmation: IConfirmation): boolean { return false; } + + public confirm(confirmation: IConfirmation): Promise { + return TPromise.as({ confirmed: false }); + } } export class TestPartService implements IPartService { @@ -955,10 +960,14 @@ export class TestWindowService implements IWindowService { return TPromise.as(void 0); } - showMessageBox(options: Electron.MessageBoxOptions): number { + showMessageBoxSync(options: Electron.MessageBoxOptions): number { return 0; } + showMessageBox(options: Electron.MessageBoxOptions): Promise { + return TPromise.as(void 0); + } + showSaveDialog(options: Electron.SaveDialogOptions, callback?: (fileName: string) => void): string { return void 0; } From e9560390ca9c6e28e5ea396f5c049f9c2628bc11 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Fri, 6 Oct 2017 13:24:36 +0200 Subject: [PATCH 072/158] Delete should respect user preferences regarding confirmation (fixes #1538) --- src/vs/platform/message/common/message.ts | 2 +- .../parts/files/browser/fileActions.ts | 113 +++++++++++------- .../parts/files/browser/files.contribution.ts | 5 + src/vs/workbench/parts/files/common/files.ts | 1 + 4 files changed, 79 insertions(+), 42 deletions(-) diff --git a/src/vs/platform/message/common/message.ts b/src/vs/platform/message/common/message.ts index bca37832245..cfe7e448854 100644 --- a/src/vs/platform/message/common/message.ts +++ b/src/vs/platform/message/common/message.ts @@ -25,7 +25,7 @@ export interface IConfirmation { secondaryButton?: string; checkbox?: { label: string; - checked: boolean; + checked?: boolean; }; } diff --git a/src/vs/workbench/parts/files/browser/fileActions.ts b/src/vs/workbench/parts/files/browser/fileActions.ts index 6ba3061b421..8f9afccbafe 100644 --- a/src/vs/workbench/parts/files/browser/fileActions.ts +++ b/src/vs/workbench/parts/files/browser/fileActions.ts @@ -40,7 +40,7 @@ import { IHistoryService } from 'vs/workbench/services/history/common/history'; import { IViewletService } from 'vs/workbench/services/viewlet/browser/viewlet'; import { Position, IResourceInput, IEditorInput, IUntitledResourceInput } from 'vs/platform/editor/common/editor'; import { IInstantiationService, IConstructorSignature2, ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; -import { IMessageService, IMessageWithAction, IConfirmation, Severity, CancelAction } from 'vs/platform/message/common/message'; +import { IMessageService, IMessageWithAction, IConfirmation, Severity, CancelAction, IConfirmationResult } from 'vs/platform/message/common/message'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; import { getCodeEditor } from 'vs/editor/common/services/codeEditorService'; import { IEditorViewState } from 'vs/editor/common/editorCommon'; @@ -50,6 +50,8 @@ import { withFocusedFilesExplorer, revealInOSCommand, revealInExplorerCommand, c import { ITelemetryData } from 'vs/platform/telemetry/common/telemetry'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { ITextModelService } from 'vs/editor/common/services/resolverService'; +import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; +import { IConfigurationEditingService, ConfigurationTarget } from 'vs/workbench/services/configuration/common/configurationEditing'; export interface IEditableData { action: IAction; @@ -623,6 +625,9 @@ export class CreateFolderAction extends BaseCreateAction { } export class BaseDeleteFileAction extends BaseFileAction { + + private static CONFIRM_DELETE_SETTING_KEY = 'explorer.confirmDelete'; + private tree: ITree; private useTrash: boolean; private skipConfirm: boolean; @@ -635,7 +640,9 @@ export class BaseDeleteFileAction extends BaseFileAction { useTrash: boolean, @IFileService fileService: IFileService, @IMessageService messageService: IMessageService, - @ITextFileService textFileService: ITextFileService + @ITextFileService textFileService: ITextFileService, + @IConfigurationService private configurationService: IConfigurationService, + @IConfigurationEditingService private configurationEditingService: IConfigurationEditingService ) { super(id, label, fileService, messageService, textFileService); @@ -704,51 +711,73 @@ export class BaseDeleteFileAction extends BaseFileAction { // Check if file is dirty in editor and save it to avoid data loss return revertPromise.then(() => { + let confirmPromise: TPromise; - // Ask for Confirm - if (!this.skipConfirm) { - let confirm: IConfirmation; - if (this.useTrash) { - confirm = { - message: this.element.isDirectory ? nls.localize('confirmMoveTrashMessageFolder', "Are you sure you want to delete '{0}' and its contents?", this.element.name) : nls.localize('confirmMoveTrashMessageFile', "Are you sure you want to delete '{0}'?", this.element.name), - detail: isWindows ? nls.localize('undoBin', "You can restore from the recycle bin.") : nls.localize('undoTrash', "You can restore from the trash."), - primaryButton, - type: 'question' - }; - } else { - confirm = { - message: this.element.isDirectory ? nls.localize('confirmDeleteMessageFolder', "Are you sure you want to permanently delete '{0}' and its contents?", this.element.name) : nls.localize('confirmDeleteMessageFile', "Are you sure you want to permanently delete '{0}'?", this.element.name), - detail: nls.localize('irreversible', "This action is irreversible!"), - primaryButton, - type: 'warning' - }; - } - - if (!this.messageService.confirmSync(confirm)) { - return TPromise.as(null); - } + // Check if we need to ask for confirmation at all + if (this.skipConfirm || (this.useTrash && this.configurationService.lookup(BaseDeleteFileAction.CONFIRM_DELETE_SETTING_KEY).value === false)) { + confirmPromise = TPromise.as({ confirmed: true } as IConfirmationResult); } - // Call function - const servicePromise = this.fileService.del(this.element.resource, this.useTrash).then(() => { - if (this.element.parent) { - this.tree.setFocus(this.element.parent); // move focus to parent - } - }, (error: any) => { + // Confirm for moving to trash + else if (this.useTrash) { + confirmPromise = this.messageService.confirm({ + message: this.element.isDirectory ? nls.localize('confirmMoveTrashMessageFolder', "Are you sure you want to delete '{0}' and its contents?", this.element.name) : nls.localize('confirmMoveTrashMessageFile', "Are you sure you want to delete '{0}'?", this.element.name), + detail: isWindows ? nls.localize('undoBin', "You can restore from the recycle bin.") : nls.localize('undoTrash', "You can restore from the trash."), + primaryButton, + checkbox: { + label: nls.localize('doNotAskAgain', "Do not ask me again") + }, + type: 'question' + }); + } - // Allow to retry - let extraAction: Action; - if (this.useTrash) { - extraAction = new Action('permanentDelete', nls.localize('permDelete', "Delete Permanently"), null, true, () => { this.useTrash = false; this.skipConfirm = true; return this.run(); }); + // Confirm for deleting permanently + else { + confirmPromise = this.messageService.confirm({ + message: this.element.isDirectory ? nls.localize('confirmDeleteMessageFolder', "Are you sure you want to permanently delete '{0}' and its contents?", this.element.name) : nls.localize('confirmDeleteMessageFile', "Are you sure you want to permanently delete '{0}'?", this.element.name), + detail: nls.localize('irreversible', "This action is irreversible!"), + primaryButton, + type: 'warning' + }); + } + + return confirmPromise.then(confirmation => { + + // Check for confirmation checkbox + let updateConfirmSettingsPromise: TPromise = TPromise.as(void 0); + if (confirmation.checkboxChecked === true) { + updateConfirmSettingsPromise = this.configurationEditingService.writeConfiguration(ConfigurationTarget.USER, { key: BaseDeleteFileAction.CONFIRM_DELETE_SETTING_KEY, value: false }); } - this.onErrorWithRetry(error, () => this.run(), extraAction); + return updateConfirmSettingsPromise.then(() => { - // Focus back to tree - this.tree.DOMFocus(); + // Check for confirmation + if (!confirmation.confirmed) { + return TPromise.as(null); + } + + // Call function + const servicePromise = this.fileService.del(this.element.resource, this.useTrash).then(() => { + if (this.element.parent) { + this.tree.setFocus(this.element.parent); // move focus to parent + } + }, (error: any) => { + + // Allow to retry + let extraAction: Action; + if (this.useTrash) { + extraAction = new Action('permanentDelete', nls.localize('permDelete', "Delete Permanently"), null, true, () => { this.useTrash = false; this.skipConfirm = true; return this.run(); }); + } + + this.onErrorWithRetry(error, () => this.run(), extraAction); + + // Focus back to tree + this.tree.DOMFocus(); + }); + + return servicePromise; + }); }); - - return servicePromise; }); } } @@ -762,9 +791,11 @@ export class MoveFileToTrashAction extends BaseDeleteFileAction { element: FileStat, @IFileService fileService: IFileService, @IMessageService messageService: IMessageService, - @ITextFileService textFileService: ITextFileService + @ITextFileService textFileService: ITextFileService, + @IConfigurationService configurationService: IConfigurationService, + @IConfigurationEditingService configurationEditingService: IConfigurationEditingService ) { - super(MoveFileToTrashAction.ID, nls.localize('delete', "Delete"), tree, element, true, fileService, messageService, textFileService); + super(MoveFileToTrashAction.ID, nls.localize('delete', "Delete"), tree, element, true, fileService, messageService, textFileService, configurationService, configurationEditingService); } } diff --git a/src/vs/workbench/parts/files/browser/files.contribution.ts b/src/vs/workbench/parts/files/browser/files.contribution.ts index 9f5b2e412eb..88467b2fa0f 100644 --- a/src/vs/workbench/parts/files/browser/files.contribution.ts +++ b/src/vs/workbench/parts/files/browser/files.contribution.ts @@ -328,6 +328,11 @@ configurationRegistry.registerConfiguration({ 'description': nls.localize('enableDragAndDrop', "Controls if the explorer should allow to move files and folders via drag and drop."), 'default': true }, + 'explorer.confirmDelete': { + 'type': 'boolean', + 'description': nls.localize('confirmDelete', "Controls if the explorer should ask for confirmation when deleting a file via the trash."), + 'default': true + }, 'explorer.sortOrder': { 'type': 'string', 'enum': [SortOrderConfiguration.DEFAULT, SortOrderConfiguration.MIXED, SortOrderConfiguration.FILES_FIRST, SortOrderConfiguration.TYPE, SortOrderConfiguration.MODIFIED], diff --git a/src/vs/workbench/parts/files/common/files.ts b/src/vs/workbench/parts/files/common/files.ts index ec7e56f865b..f2a423c3ce9 100644 --- a/src/vs/workbench/parts/files/common/files.ts +++ b/src/vs/workbench/parts/files/common/files.ts @@ -69,6 +69,7 @@ export interface IFilesConfiguration extends IFilesConfiguration, IWorkbenchEdit }; autoReveal: boolean; enableDragAndDrop: boolean; + confirmDelete: boolean; sortOrder: SortOrder; }; editor: IEditorOptions; From a42f794b9b416986f344c19875df5899a2fee7ff Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Fri, 6 Oct 2017 14:32:22 +0200 Subject: [PATCH 073/158] Add confirmation window while drag-dropping project files in the "Explore" panel (fixes #1414) --- .../parts/files/browser/files.contribution.ts | 5 +++ .../files/browser/views/explorerViewer.ts | 44 ++++++++++++++++++- 2 files changed, 47 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/parts/files/browser/files.contribution.ts b/src/vs/workbench/parts/files/browser/files.contribution.ts index 88467b2fa0f..173b92b32bd 100644 --- a/src/vs/workbench/parts/files/browser/files.contribution.ts +++ b/src/vs/workbench/parts/files/browser/files.contribution.ts @@ -328,6 +328,11 @@ configurationRegistry.registerConfiguration({ 'description': nls.localize('enableDragAndDrop', "Controls if the explorer should allow to move files and folders via drag and drop."), 'default': true }, + 'explorer.confirmDragAndDrop': { + 'type': 'boolean', + 'description': nls.localize('confirmDragAndDrop', "Controls if the explorer should ask for confirmation when moving files or folders around via drag and drop."), + 'default': true + }, 'explorer.confirmDelete': { 'type': 'boolean', 'description': nls.localize('confirmDelete', "Controls if the explorer should ask for confirmation when deleting a file via the trash."), diff --git a/src/vs/workbench/parts/files/browser/views/explorerViewer.ts b/src/vs/workbench/parts/files/browser/views/explorerViewer.ts index de177195395..397439d6109 100644 --- a/src/vs/workbench/parts/files/browser/views/explorerViewer.ts +++ b/src/vs/workbench/parts/files/browser/views/explorerViewer.ts @@ -41,7 +41,7 @@ import { IConfigurationService } from 'vs/platform/configuration/common/configur import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { IContextViewService, IContextMenuService } from 'vs/platform/contextview/browser/contextView'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import { IMessageService, IConfirmation, Severity } from 'vs/platform/message/common/message'; +import { IMessageService, IConfirmation, Severity, IConfirmationResult } from 'vs/platform/message/common/message'; import { IProgressService } from 'vs/platform/progress/common/progress'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { KeyCode } from 'vs/base/common/keyCodes'; @@ -57,6 +57,7 @@ import { distinct } from 'vs/base/common/arrays'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { getPathLabel } from 'vs/base/common/labels'; import { extractResources } from 'vs/base/browser/dnd'; +import { IConfigurationEditingService, ConfigurationTarget } from 'vs/workbench/services/configuration/common/configurationEditing'; export class FileDataSource implements IDataSource { constructor( @@ -728,6 +729,9 @@ export class FileFilter implements IFilter { // Explorer Drag And Drop Controller export class FileDragAndDrop extends SimpleFileResourceDragAndDrop { + + private static CONFIRM_DND_SETTING_KEY = 'explorer.confirmDragAndDrop'; + private toDispose: IDisposable[]; private dropEnabled: boolean; @@ -742,7 +746,8 @@ export class FileDragAndDrop extends SimpleFileResourceDragAndDrop { @IBackupFileService private backupFileService: IBackupFileService, @IWindowService private windowService: IWindowService, @IWorkspaceEditingService private workspaceEditingService: IWorkspaceEditingService, - @IEnvironmentService private environmentService: IEnvironmentService + @IEnvironmentService private environmentService: IEnvironmentService, + @IConfigurationEditingService private configurationEditingService: IConfigurationEditingService ) { super(stat => this.statToResource(stat)); @@ -947,6 +952,41 @@ export class FileDragAndDrop extends SimpleFileResourceDragAndDrop { const source: FileStat = data.getData()[0]; const isCopy = (originalEvent.ctrlKey && !isMacintosh) || (originalEvent.altKey && isMacintosh); + let confirmPromise: TPromise; + + // Handle confirm setting + const confirmDragAndDrop = !isCopy && this.configurationService.lookup(FileDragAndDrop.CONFIRM_DND_SETTING_KEY).value; + if (confirmDragAndDrop) { + confirmPromise = this.messageService.confirm({ + message: nls.localize('confirmMove', "Are you sure you want to move '{0}'?", source.name), + checkbox: { + label: nls.localize('doNotAskAgain', "Do not ask me again") + }, + type: 'question' + }); + } else { + confirmPromise = TPromise.as({ confirmed: true } as IConfirmationResult); + } + + return confirmPromise.then(confirmation => { + + // Check for confirmation checkbox + let updateConfirmSettingsPromise: TPromise = TPromise.as(void 0); + if (confirmation.checkboxChecked === true) { + updateConfirmSettingsPromise = this.configurationEditingService.writeConfiguration(ConfigurationTarget.USER, { key: FileDragAndDrop.CONFIRM_DND_SETTING_KEY, value: false }); + } + + return updateConfirmSettingsPromise.then(() => { + if (confirmation.confirmed) { + return this.doHandleExplorerDrop(tree, data, source, target, isCopy); + } + + return TPromise.as(void 0); + }); + }); + } + + private doHandleExplorerDrop(tree: ITree, data: IDragAndDropData, source: FileStat, target: FileStat, isCopy: boolean): TPromise { return tree.expand(target).then(() => { // Reuse duplicate action if user copies From da37034feea4287e38fde96968ee8382ab69acc7 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Fri, 6 Oct 2017 14:37:07 +0200 Subject: [PATCH 074/158] :lipstick: --- src/vs/workbench/parts/files/browser/views/explorerViewer.ts | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/vs/workbench/parts/files/browser/views/explorerViewer.ts b/src/vs/workbench/parts/files/browser/views/explorerViewer.ts index 397439d6109..d60aa33d4d8 100644 --- a/src/vs/workbench/parts/files/browser/views/explorerViewer.ts +++ b/src/vs/workbench/parts/files/browser/views/explorerViewer.ts @@ -738,7 +738,6 @@ export class FileDragAndDrop extends SimpleFileResourceDragAndDrop { constructor( @IMessageService private messageService: IMessageService, @IWorkspaceContextService private contextService: IWorkspaceContextService, - @IProgressService private progressService: IProgressService, @IFileService private fileService: IFileService, @IConfigurationService private configurationService: IConfigurationService, @IInstantiationService private instantiationService: IInstantiationService, @@ -896,8 +895,6 @@ export class FileDragAndDrop extends SimpleFileResourceDragAndDrop { } } - this.progressService.showWhile(promise, 800); - promise.done(null, errors.onUnexpectedError); } From 8cf286389b05ce4bf482b246dcafd04d1c4f7e9f Mon Sep 17 00:00:00 2001 From: isidor Date: Fri, 6 Oct 2017 17:04:34 +0200 Subject: [PATCH 075/158] debug status bar fixes #31745 --- .../parts/debug/browser/debugStatus.ts | 69 +++++++++++++++++++ .../browser/media/debug.contribution.css | 14 ++++ .../electron-browser/debug.contribution.ts | 6 ++ 3 files changed, 89 insertions(+) create mode 100644 src/vs/workbench/parts/debug/browser/debugStatus.ts diff --git a/src/vs/workbench/parts/debug/browser/debugStatus.ts b/src/vs/workbench/parts/debug/browser/debugStatus.ts new file mode 100644 index 00000000000..2220e215432 --- /dev/null +++ b/src/vs/workbench/parts/debug/browser/debugStatus.ts @@ -0,0 +1,69 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import * as nls from 'vs/nls'; +import * as dom from 'vs/base/browser/dom'; +import * as errors from 'vs/base/common/errors'; +import { IDisposable, dispose } from 'vs/base/common/lifecycle'; +import { IQuickOpenService } from 'vs/platform/quickOpen/common/quickOpen'; +import { IThemeService } from 'vs/platform/theme/common/themeService'; +import { IStatusbarItem } from 'vs/workbench/browser/parts/statusbar/statusbar'; +import { IDebugService } from 'vs/workbench/parts/debug/common/debug'; +import { Themable, STATUS_BAR_FOREGROUND } from 'vs/workbench/common/theme'; + +const $ = dom.$; +const MAX_LABEL_LENGTH = 17; + +export class DebugStatus extends Themable implements IStatusbarItem { + private toDispose: IDisposable[]; + private label: HTMLElement; + private icon: HTMLElement; + + constructor( + @IQuickOpenService private quickOpenService: IQuickOpenService, + @IDebugService private debugService: IDebugService, + @IThemeService themeService: IThemeService + ) { + super(themeService); + this.toDispose = []; + this.toDispose.push(this.debugService.getConfigurationManager().onDidSelectConfiguration(e => { + this.setLabel(); + })); + } + + protected updateStyles(): void { + super.updateStyles(); + this.icon.style.backgroundColor = this.getColor(STATUS_BAR_FOREGROUND); + } + + public render(container: HTMLElement): IDisposable { + const statusBarItem = dom.append(container, $('.debug-statusbar-item')); + this.toDispose.push(dom.addDisposableListener(statusBarItem, 'click', () => { + this.quickOpenService.show('debug ').done(undefined, errors.onUnexpectedError); + })); + statusBarItem.title = nls.localize('debug', "Debug"); + this.icon = dom.append(statusBarItem, $('.icon')); + this.label = dom.append(statusBarItem, $('span.label')); + this.setLabel(); + this.updateStyles(); + + return this; + } + + private setLabel(): void { + if (this.label) { + let name = this.debugService.getConfigurationManager().selectedName || ''; + if (name.length > MAX_LABEL_LENGTH) { + name = name.substring(0, MAX_LABEL_LENGTH) + '...'; + } + this.label.textContent = name; + } + } + + public dispose(): void { + super.dispose(); + this.toDispose = dispose(this.toDispose); + } +} diff --git a/src/vs/workbench/parts/debug/browser/media/debug.contribution.css b/src/vs/workbench/parts/debug/browser/media/debug.contribution.css index 87918a9013a..69bf974a45f 100644 --- a/src/vs/workbench/parts/debug/browser/media/debug.contribution.css +++ b/src/vs/workbench/parts/debug/browser/media/debug.contribution.css @@ -102,6 +102,20 @@ box-sizing: border-box; } +/* Debug status */ +.monaco-workbench .part.statusbar .debug-statusbar-item { + cursor: pointer; + display: flex; +} + +.monaco-workbench .part.statusbar .debug-statusbar-item .icon { + -webkit-mask: url('debug-dark.svg') no-repeat 50% 50%; + -webkit-mask-size: 18px; + display: inline-block; + padding-right: 2px; + width: 16px; +} + /* Expressions */ .monaco-workbench .monaco-tree-row .expression { diff --git a/src/vs/workbench/parts/debug/electron-browser/debug.contribution.ts b/src/vs/workbench/parts/debug/electron-browser/debug.contribution.ts index 2ee47d4318a..a88503d3faf 100644 --- a/src/vs/workbench/parts/debug/electron-browser/debug.contribution.ts +++ b/src/vs/workbench/parts/debug/electron-browser/debug.contribution.ts @@ -15,6 +15,7 @@ import { IConfigurationRegistry, Extensions as ConfigurationExtensions } from 'v import { IWorkbenchActionRegistry, Extensions as WorkbenchActionRegistryExtensions } from 'vs/workbench/common/actions'; import { ToggleViewletAction, Extensions as ViewletExtensions, ViewletRegistry, ViewletDescriptor } from 'vs/workbench/browser/viewlet'; import { TogglePanelAction, Extensions as PanelExtensions, PanelRegistry, PanelDescriptor } from 'vs/workbench/browser/panel'; +import { StatusbarItemDescriptor, StatusbarAlignment, IStatusbarRegistry, Extensions as StatusExtensions } from 'vs/workbench/browser/parts/statusbar/statusbar'; import { VariablesView, WatchExpressionsView, CallStackView, BreakpointsView } from 'vs/workbench/parts/debug/electron-browser/debugViews'; import { Extensions as WorkbenchExtensions, IWorkbenchContributionsRegistry } from 'vs/workbench/common/contributions'; import { @@ -44,6 +45,7 @@ import URI from 'vs/base/common/uri'; import { DebugViewlet, FocusVariablesViewAction, FocusBreakpointsViewAction, FocusCallStackViewAction, FocusWatchViewAction } from 'vs/workbench/parts/debug/browser/debugViewlet'; import { Repl } from 'vs/workbench/parts/debug/electron-browser/repl'; import { DebugQuickOpenHandler } from 'vs/workbench/parts/debug/browser/debugQuickOpen'; +import { DebugStatus } from 'vs/workbench/parts/debug/browser/debugStatus'; class OpenDebugViewletAction extends ToggleViewletAction { public static ID = VIEWLET_ID; @@ -196,6 +198,10 @@ configurationRegistry.registerConfiguration({ debugCommands.registerCommands(); +// Register Debug Status +const statusBar = Registry.as(StatusExtensions.Statusbar); +statusBar.registerStatusbarItem(new StatusbarItemDescriptor(DebugStatus, StatusbarAlignment.LEFT, 30 /* Low Priority */)); + // Touch Bar if (isMacintosh) { From e29c517386fe6f3a40e2f0ff00effae4919406aa Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Fri, 6 Oct 2017 09:33:22 -0700 Subject: [PATCH 076/158] Revert "replace bash shebang with '#!/usr/bin/env bash" for portability" This reverts commit 86dace91a2ddc6cb61f06b047b00c04b44f237c4. --- build/tfs/common/common.sh | 2 +- build/tfs/common/node.sh | 2 +- build/tfs/linux/build-ia32.sh | 2 +- build/tfs/linux/build-x64.sh | 2 +- build/tfs/linux/build.sh | 2 +- build/tfs/linux/ia32/run-agent.sh | 2 +- build/tfs/linux/ia32/xvfb.init | 2 +- build/tfs/linux/release.sh | 2 +- build/tfs/linux/smoketest.sh | 2 +- build/tfs/linux/x64/run-agent.sh | 2 +- build/tfs/linux/x64/xvfb.init | 2 +- resources/linux/debian/postrm.template | 2 +- scripts/env.sh | 2 +- scripts/npm.sh | 2 +- scripts/test-integration.sh | 2 +- scripts/test-mocha.sh | 2 +- scripts/test.sh | 2 +- src/vs/base/node/terminateProcess.sh | 2 +- 18 files changed, 18 insertions(+), 18 deletions(-) diff --git a/build/tfs/common/common.sh b/build/tfs/common/common.sh index cdd656676a3..52f53537943 100755 --- a/build/tfs/common/common.sh +++ b/build/tfs/common/common.sh @@ -1,4 +1,4 @@ -#!/usr/bin/env bash +#!/bin/bash set -e # set agent specific npm cache diff --git a/build/tfs/common/node.sh b/build/tfs/common/node.sh index 67f3f59552f..87f95a5e1d7 100755 --- a/build/tfs/common/node.sh +++ b/build/tfs/common/node.sh @@ -1,4 +1,4 @@ -#!/usr/bin/env bash +#!/bin/bash set -e # setup nvm diff --git a/build/tfs/linux/build-ia32.sh b/build/tfs/linux/build-ia32.sh index 0d9f98c692d..0b0f1c2a458 100755 --- a/build/tfs/linux/build-ia32.sh +++ b/build/tfs/linux/build-ia32.sh @@ -1,3 +1,3 @@ -#!/usr/bin/env bash +#!/bin/bash set -e ./build/tfs/linux/build.sh ia32 "$@" \ No newline at end of file diff --git a/build/tfs/linux/build-x64.sh b/build/tfs/linux/build-x64.sh index e193a01a5b7..fb5b38e02b3 100755 --- a/build/tfs/linux/build-x64.sh +++ b/build/tfs/linux/build-x64.sh @@ -1,3 +1,3 @@ -#!/usr/bin/env bash +#!/bin/bash set -e ./build/tfs/linux/build.sh x64 "$@" \ No newline at end of file diff --git a/build/tfs/linux/build.sh b/build/tfs/linux/build.sh index 4af53947033..b3d1825c2d9 100755 --- a/build/tfs/linux/build.sh +++ b/build/tfs/linux/build.sh @@ -1,4 +1,4 @@ -#!/usr/bin/env bash +#!/bin/bash . ./build/tfs/common/node.sh . ./scripts/env.sh diff --git a/build/tfs/linux/ia32/run-agent.sh b/build/tfs/linux/ia32/run-agent.sh index efcc96632a3..bcf9017f3cf 100755 --- a/build/tfs/linux/ia32/run-agent.sh +++ b/build/tfs/linux/ia32/run-agent.sh @@ -1,4 +1,4 @@ -#!/usr/bin/env bash +#!/bin/bash if [ ! -f pat ]; then echo "Error: file pat not found" diff --git a/build/tfs/linux/ia32/xvfb.init b/build/tfs/linux/ia32/xvfb.init index 74f6e3b2522..4d77d253a26 100644 --- a/build/tfs/linux/ia32/xvfb.init +++ b/build/tfs/linux/ia32/xvfb.init @@ -1,4 +1,4 @@ -#!/usr/bin/env bash +#!/bin/bash # # /etc/rc.d/init.d/xvfbd # diff --git a/build/tfs/linux/release.sh b/build/tfs/linux/release.sh index 114100335a6..958a05f56bd 100755 --- a/build/tfs/linux/release.sh +++ b/build/tfs/linux/release.sh @@ -1,4 +1,4 @@ -#!/usr/bin/env bash +#!/bin/bash . ./scripts/env.sh . ./build/tfs/common/common.sh diff --git a/build/tfs/linux/smoketest.sh b/build/tfs/linux/smoketest.sh index 08cbdff405a..10ecf535f84 100644 --- a/build/tfs/linux/smoketest.sh +++ b/build/tfs/linux/smoketest.sh @@ -1,4 +1,4 @@ -#!/usr/bin/env bash +#!/bin/bash set -e . ./build/tfs/common/node.sh diff --git a/build/tfs/linux/x64/run-agent.sh b/build/tfs/linux/x64/run-agent.sh index 1f122aa40dd..76978ce2b02 100755 --- a/build/tfs/linux/x64/run-agent.sh +++ b/build/tfs/linux/x64/run-agent.sh @@ -1,4 +1,4 @@ -#!/usr/bin/env bash +#!/bin/bash if [ ! -f pat ]; then echo "Error: file pat not found" diff --git a/build/tfs/linux/x64/xvfb.init b/build/tfs/linux/x64/xvfb.init index 74f6e3b2522..4d77d253a26 100644 --- a/build/tfs/linux/x64/xvfb.init +++ b/build/tfs/linux/x64/xvfb.init @@ -1,4 +1,4 @@ -#!/usr/bin/env bash +#!/bin/bash # # /etc/rc.d/init.d/xvfbd # diff --git a/resources/linux/debian/postrm.template b/resources/linux/debian/postrm.template index 1dfa892a0ea..c43a2b16ae3 100755 --- a/resources/linux/debian/postrm.template +++ b/resources/linux/debian/postrm.template @@ -1,4 +1,4 @@ -#!/usr/bin/env bash +#!/bin/bash # # Copyright (c) Microsoft Corporation. All rights reserved. # Licensed under the MIT License. See License.txt in the project root for license information. diff --git a/scripts/env.sh b/scripts/env.sh index f530bf28369..35d09f66bb2 100755 --- a/scripts/env.sh +++ b/scripts/env.sh @@ -1,4 +1,4 @@ -#!/usr/bin/env bash +#!/bin/bash export npm_config_disturl=https://atom.io/download/electron export npm_config_target=$(node -p "require('./package.json').electronVersion") export npm_config_runtime=electron diff --git a/scripts/npm.sh b/scripts/npm.sh index 02268eafd6e..69c6d0c48ae 100755 --- a/scripts/npm.sh +++ b/scripts/npm.sh @@ -1,4 +1,4 @@ -#!/usr/bin/env bash +#!/bin/bash if [[ "$OSTYPE" == "darwin"* ]]; then realpath() { [[ $1 = /* ]] && echo "$1" || echo "$PWD/${1#./}"; } diff --git a/scripts/test-integration.sh b/scripts/test-integration.sh index 454c212f358..0a9eea1b077 100755 --- a/scripts/test-integration.sh +++ b/scripts/test-integration.sh @@ -1,4 +1,4 @@ -#!/usr/bin/env bash +#!/bin/bash set -e if [[ "$OSTYPE" == "darwin"* ]]; then diff --git a/scripts/test-mocha.sh b/scripts/test-mocha.sh index 5d1d71a2da2..9aa16fa3241 100755 --- a/scripts/test-mocha.sh +++ b/scripts/test-mocha.sh @@ -1,4 +1,4 @@ -#!/usr/bin/env bash +#!/bin/bash if [[ "$OSTYPE" == "darwin"* ]]; then realpath() { [[ $1 = /* ]] && echo "$1" || echo "$PWD/${1#./}"; } diff --git a/scripts/test.sh b/scripts/test.sh index 157c6da2cc7..ce1e5e11856 100755 --- a/scripts/test.sh +++ b/scripts/test.sh @@ -1,4 +1,4 @@ -#!/usr/bin/env bash +#!/bin/bash if [[ "$OSTYPE" == "darwin"* ]]; then diff --git a/src/vs/base/node/terminateProcess.sh b/src/vs/base/node/terminateProcess.sh index dceeae9745f..acdcbf8ed42 100755 --- a/src/vs/base/node/terminateProcess.sh +++ b/src/vs/base/node/terminateProcess.sh @@ -1,4 +1,4 @@ -#!/usr/bin/env bash +#!/bin/bash terminateTree() { for cpid in $(/usr/bin/pgrep -P $1); do From f5c051e61124693e38de28a5fb943371bd904f22 Mon Sep 17 00:00:00 2001 From: lizz Date: Sun, 8 Oct 2017 21:08:48 +0800 Subject: [PATCH 077/158] Region fold in python using `#region` and `#endregion` --- extensions/python/language-configuration.json | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/extensions/python/language-configuration.json b/extensions/python/language-configuration.json index 97feb4d8aca..b1e317f41c0 100644 --- a/extensions/python/language-configuration.json +++ b/extensions/python/language-configuration.json @@ -23,6 +23,10 @@ ["'", "'"] ], "folding": { - "offSide": true - } -} \ No newline at end of file + "offSide": true, + "markers": { + "start": "^\\s*#region", + "end": "^\\s*#endregion" + } + } +} From 33c255f4b455114de904774cf81fe7ebc2099459 Mon Sep 17 00:00:00 2001 From: Shreya Dahal Date: Sun, 8 Oct 2017 19:31:41 +0545 Subject: [PATCH 078/158] Fixed a typo in the comments Nothing more to add, really. --- src/vs/code/electron-main/main.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vs/code/electron-main/main.ts b/src/vs/code/electron-main/main.ts index e78ec8c97b8..ea526f1c4c0 100644 --- a/src/vs/code/electron-main/main.ts +++ b/src/vs/code/electron-main/main.ts @@ -138,7 +138,7 @@ function setupIPC(accessor: ServicesAccessor): TPromise { // it happens on Linux and OS X that the pipe is left behind // let's delete it, since we can't connect to it - // and the retry the whole thing + // and then retry the whole thing try { fs.unlinkSync(environmentService.mainIPCHandle); } catch (e) { @@ -214,4 +214,4 @@ function main() { }).done(null, err => instantiationService.invokeFunction(quit, err)); } -main(); \ No newline at end of file +main(); From 335bce9302c0cb125bdf7c1fdb39496525d7f890 Mon Sep 17 00:00:00 2001 From: lizz Date: Sun, 8 Oct 2017 22:00:44 +0800 Subject: [PATCH 079/158] fix indentation --- extensions/python/language-configuration.json | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/extensions/python/language-configuration.json b/extensions/python/language-configuration.json index b1e317f41c0..51892242cc4 100644 --- a/extensions/python/language-configuration.json +++ b/extensions/python/language-configuration.json @@ -24,9 +24,9 @@ ], "folding": { "offSide": true, - "markers": { - "start": "^\\s*#region", - "end": "^\\s*#endregion" - } - } + "markers": { + "start": "^\\s*#region", + "end": "^\\s*#endregion" + } + } } From f127ec349548fbdde7d681f221313c844660fa4d Mon Sep 17 00:00:00 2001 From: Alexandru Dima Date: Mon, 9 Oct 2017 11:55:49 +0200 Subject: [PATCH 080/158] Update classifier.yml --- .github/classifier.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/classifier.yml b/.github/classifier.yml index 02b2d38f649..348242d802a 100644 --- a/.github/classifier.yml +++ b/.github/classifier.yml @@ -7,7 +7,7 @@ api: [], css-less-sass: [], debug: [ isidorn ], - editor: [ alexandrudima ], + editor: [], editor-brackets: [], editor-clipboard: [ rebornix ], editor-colors: [], From 58b990f3ef3cbebc807f1d5a877ef1356c3629cd Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Mon, 9 Oct 2017 14:52:10 +0200 Subject: [PATCH 081/158] be more careful with git init fixes #35902 --- extensions/git/src/commands.ts | 32 +++++++++++++++++++++++--------- 1 file changed, 23 insertions(+), 9 deletions(-) diff --git a/extensions/git/src/commands.ts b/extensions/git/src/commands.ts index fc66825d924..c41d60d2fbb 100644 --- a/extensions/git/src/commands.ts +++ b/extensions/git/src/commands.ts @@ -342,21 +342,35 @@ export class CommandCenter { @command('git.init') async init(): Promise { - const value = workspace.workspaceFolders && workspace.workspaceFolders.length > 0 - ? workspace.workspaceFolders[0].uri.fsPath - : os.homedir(); + const homeUri = Uri.file(os.homedir()); + const defaultUri = workspace.workspaceFolders && workspace.workspaceFolders.length > 0 + ? Uri.file(workspace.workspaceFolders[0].uri.fsPath) + : homeUri; - const path = await window.showInputBox({ - placeHolder: localize('path to init', "Folder path"), - prompt: localize('provide path', "Please provide a folder path to initialize a Git repository"), - value, - ignoreFocusOut: true + const result = await window.showOpenDialog({ + canSelectFiles: false, + canSelectFolders: true, + canSelectMany: false, + defaultUri, + openLabel: localize('init repo', "Initialize Repository") }); - if (!path) { + if (!result || result.length === 0) { return; } + const uri = result[0]; + + if (homeUri.toString().startsWith(uri.toString())) { + const yes = localize('create repo', "Initialize Repository"); + const answer = await window.showWarningMessage(localize('are you sure', "This will create a Git repository in '{0}'. Are you sure you want to continue?", uri.fsPath), yes); + + if (answer !== yes) { + return; + } + } + + const path = uri.fsPath; await this.git.init(path); await this.model.tryOpenRepository(path); } From 7807e1e1296eb6df0e05122d4e783c5db975c605 Mon Sep 17 00:00:00 2001 From: isidor Date: Mon, 9 Oct 2017 14:55:36 +0200 Subject: [PATCH 082/158] debug status: do not show until first debug session gets started --- .../parts/debug/browser/debugStatus.ts | 31 +++++++++++++------ 1 file changed, 21 insertions(+), 10 deletions(-) diff --git a/src/vs/workbench/parts/debug/browser/debugStatus.ts b/src/vs/workbench/parts/debug/browser/debugStatus.ts index 2220e215432..9e575478b01 100644 --- a/src/vs/workbench/parts/debug/browser/debugStatus.ts +++ b/src/vs/workbench/parts/debug/browser/debugStatus.ts @@ -18,8 +18,10 @@ const MAX_LABEL_LENGTH = 17; export class DebugStatus extends Themable implements IStatusbarItem { private toDispose: IDisposable[]; + private container: HTMLElement; private label: HTMLElement; private icon: HTMLElement; + private hidden = true; constructor( @IQuickOpenService private quickOpenService: IQuickOpenService, @@ -31,6 +33,12 @@ export class DebugStatus extends Themable implements IStatusbarItem { this.toDispose.push(this.debugService.getConfigurationManager().onDidSelectConfiguration(e => { this.setLabel(); })); + this.toDispose.push(this.debugService.onDidNewProcess(() => { + if (this.hidden) { + this.hidden = false; + this.render(this.container); + } + })); } protected updateStyles(): void { @@ -39,21 +47,24 @@ export class DebugStatus extends Themable implements IStatusbarItem { } public render(container: HTMLElement): IDisposable { - const statusBarItem = dom.append(container, $('.debug-statusbar-item')); - this.toDispose.push(dom.addDisposableListener(statusBarItem, 'click', () => { - this.quickOpenService.show('debug ').done(undefined, errors.onUnexpectedError); - })); - statusBarItem.title = nls.localize('debug', "Debug"); - this.icon = dom.append(statusBarItem, $('.icon')); - this.label = dom.append(statusBarItem, $('span.label')); - this.setLabel(); - this.updateStyles(); + this.container = container; + if (!this.hidden) { + const statusBarItem = dom.append(container, $('.debug-statusbar-item')); + this.toDispose.push(dom.addDisposableListener(statusBarItem, 'click', () => { + this.quickOpenService.show('debug ').done(undefined, errors.onUnexpectedError); + })); + statusBarItem.title = nls.localize('debug', "Debug"); + this.icon = dom.append(statusBarItem, $('.icon')); + this.label = dom.append(statusBarItem, $('span.label')); + this.setLabel(); + this.updateStyles(); + } return this; } private setLabel(): void { - if (this.label) { + if (this.label && !this.hidden) { let name = this.debugService.getConfigurationManager().selectedName || ''; if (name.length > MAX_LABEL_LENGTH) { name = name.substring(0, MAX_LABEL_LENGTH) + '...'; From c1546883c7b3c6e7229646abfd2a4f2383e87550 Mon Sep 17 00:00:00 2001 From: isidor Date: Mon, 9 Oct 2017 16:31:04 +0200 Subject: [PATCH 083/158] Colorize in debug console for evaluation results #35324 --- .../workbench/parts/debug/electron-browser/debugViewer.ts | 6 ++++-- src/vs/workbench/parts/debug/electron-browser/replViewer.ts | 3 ++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/vs/workbench/parts/debug/electron-browser/debugViewer.ts b/src/vs/workbench/parts/debug/electron-browser/debugViewer.ts index 63225f8c8e4..d8104fbc3a2 100644 --- a/src/vs/workbench/parts/debug/electron-browser/debugViewer.ts +++ b/src/vs/workbench/parts/debug/electron-browser/debugViewer.ts @@ -70,8 +70,10 @@ export function renderExpressionValue(expressionOrValue: debug.IExpression | str } } - if (options.colorize) { - if (!isNaN(+value)) { + if (options.colorize && typeof expressionOrValue !== 'string') { + if (expressionOrValue.type === 'number' || expressionOrValue.type === 'boolean' || expressionOrValue.type === 'string') { + dom.addClass(container, expressionOrValue.type); + } else if (!isNaN(+value)) { dom.addClass(container, 'number'); } else if (booleanRegex.test(value)) { dom.addClass(container, 'boolean'); diff --git a/src/vs/workbench/parts/debug/electron-browser/replViewer.ts b/src/vs/workbench/parts/debug/electron-browser/replViewer.ts index 96975857047..848ec016c5f 100644 --- a/src/vs/workbench/parts/debug/electron-browser/replViewer.ts +++ b/src/vs/workbench/parts/debug/electron-browser/replViewer.ts @@ -232,7 +232,8 @@ export class ReplExpressionsRenderer implements IRenderer { templateData.input.textContent = expression.name; renderExpressionValue(expression, templateData.value, { preserveWhitespace: !expression.hasChildren, - showHover: false + showHover: false, + colorize: true }); if (expression.hasChildren) { templateData.annotation.className = 'annotation octicon octicon-info'; From 6e7a575339fcb38503d1a9d2778d7d69475dd8e2 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Mon, 9 Oct 2017 16:42:54 +0200 Subject: [PATCH 084/158] add appendCodeblock, #33577 --- src/vs/vscode.d.ts | 7 +++++++ src/vs/workbench/api/node/extHostTypes.ts | 11 ++++++++++- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/src/vs/vscode.d.ts b/src/vs/vscode.d.ts index 2d29266d818..1a63221b1f9 100644 --- a/src/vs/vscode.d.ts +++ b/src/vs/vscode.d.ts @@ -1970,6 +1970,13 @@ declare module 'vscode' { * @param value Markdown string. */ appendMarkdown(value: string): MarkdownString; + + /** + * Appends the given string as codeblock using the provided language. + * @param value A code snippet. + * @param language An optional [language identifier](#languages.getLanguages). + */ + appendCodeblock(value: string, language?: string): MarkdownString; } /** diff --git a/src/vs/workbench/api/node/extHostTypes.ts b/src/vs/workbench/api/node/extHostTypes.ts index db429979dd7..c0044aa87a9 100644 --- a/src/vs/workbench/api/node/extHostTypes.ts +++ b/src/vs/workbench/api/node/extHostTypes.ts @@ -843,6 +843,15 @@ export class MarkdownString { this.value += value; return this; } + + appendCodeblock(code: string, language: string = ''): MarkdownString { + this.value += '\n```'; + this.value += language; + this.value += '\n'; + this.value += code; + this.value += '\n```\n'; + return this; + } } export class ParameterInformation { @@ -1465,4 +1474,4 @@ export class RelativePattern implements IRelativePattern { this.base = typeof base === 'string' ? base : base.uri.fsPath; this.pattern = pattern; } -} \ No newline at end of file +} From 7e5db3ffedefdefee875bb700e36688c3e7eaac1 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Mon, 9 Oct 2017 16:50:58 +0200 Subject: [PATCH 085/158] Fixes #35673: Comment hotkeys throws the cursor before the comment --- .../comment/common/lineCommentCommand.ts | 8 ++++ .../test/common/lineCommentCommand.test.ts | 44 +++++++++++++++++++ 2 files changed, 52 insertions(+) diff --git a/src/vs/editor/contrib/comment/common/lineCommentCommand.ts b/src/vs/editor/contrib/comment/common/lineCommentCommand.ts index 1352bec2320..8f0abccfd32 100644 --- a/src/vs/editor/contrib/comment/common/lineCommentCommand.ts +++ b/src/vs/editor/contrib/comment/common/lineCommentCommand.ts @@ -200,8 +200,16 @@ export class LineCommentCommand implements editorCommon.ICommand { ops = LineCommentCommand._createAddLineCommentsOperations(data.lines, s.startLineNumber); } + const cursorPosition = new Position(s.positionLineNumber, s.positionColumn); + for (var i = 0, len = ops.length; i < len; i++) { builder.addEditOperation(ops[i].range, ops[i].text); + if (ops[i].range.isEmpty() && ops[i].range.getStartPosition().equals(cursorPosition)) { + const lineContent = model.getLineContent(cursorPosition.lineNumber); + if (lineContent.length + 1 === cursorPosition.column) { + this._deltaColumn = ops[i].text.length; + } + } } this._selectionId = builder.trackSelection(s); diff --git a/src/vs/editor/contrib/comment/test/common/lineCommentCommand.test.ts b/src/vs/editor/contrib/comment/test/common/lineCommentCommand.test.ts index 443415d8820..57c946f76f9 100644 --- a/src/vs/editor/contrib/comment/test/common/lineCommentCommand.test.ts +++ b/src/vs/editor/contrib/comment/test/common/lineCommentCommand.test.ts @@ -518,6 +518,50 @@ suite('Editor Contrib - Line Comment Command', () => { ); }); + test('issue #35673: Comment hotkeys throws the cursor before the comment', () => { + testLineCommentCommand( + [ + 'first', + '', + '\tsecond line', + 'third line', + 'fourth line', + 'fifth' + ], + new Selection(2, 1, 2, 1), + [ + 'first', + '!@# ', + '\tsecond line', + 'third line', + 'fourth line', + 'fifth' + ], + new Selection(2, 5, 2, 5) + ); + + testLineCommentCommand( + [ + 'first', + '\t', + '\tsecond line', + 'third line', + 'fourth line', + 'fifth' + ], + new Selection(2, 2, 2, 2), + [ + 'first', + '\t!@# ', + '\tsecond line', + 'third line', + 'fourth line', + 'fifth' + ], + new Selection(2, 6, 2, 6) + ); + }); + test('issue #2837 "Add Line Comment" fault when blank lines involved', function () { testAddLineCommentCommand( [ From d06bf76099c61b7cbfc09d186d0a27c5e18d83f5 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Mon, 9 Oct 2017 08:46:29 -0700 Subject: [PATCH 086/158] Update js/ts grammar Fixes #35768 Fixes #35639 --- .../syntaxes/JavaScript.tmLanguage.json | 4276 ++++++++--------- .../syntaxes/TypeScript.tmLanguage.json | 4066 ++++++++-------- .../syntaxes/TypeScriptReact.tmLanguage.json | 4276 ++++++++--------- 3 files changed, 6225 insertions(+), 6393 deletions(-) diff --git a/extensions/javascript/syntaxes/JavaScript.tmLanguage.json b/extensions/javascript/syntaxes/JavaScript.tmLanguage.json index 914b3b48909..990df29f8b3 100644 --- a/extensions/javascript/syntaxes/JavaScript.tmLanguage.json +++ b/extensions/javascript/syntaxes/JavaScript.tmLanguage.json @@ -4,7 +4,7 @@ "If you want to provide a fix or improvement, please create a pull request against the original repository.", "Once accepted there, we are happy to receive an update request." ], - "version": "https://github.com/Microsoft/TypeScript-TmLanguage/commit/2dea76a2bd6c522cf824168c8a2d3cd05196069d", + "version": "https://github.com/Microsoft/TypeScript-TmLanguage/commit/d6ee336bf6047594768a56f955563ba5ce86e7c9", "name": "JavaScript (with React support)", "scopeName": "source.js", "fileTypes": [ @@ -47,20 +47,14 @@ "include": "#declaration" }, { - "include": "#switch-statement" + "include": "#control-statement" }, { - "include": "#for-loop" - }, - { - "include": "#after-operator-block" + "include": "#after-operator-block-as-object-literal" }, { "include": "#decl-block" }, - { - "include": "#control-statement" - }, { "include": "#expression" }, @@ -69,6 +63,164 @@ } ] }, + "declaration": { + "patterns": [ + { + "include": "#decorator" + }, + { + "include": "#var-expr" + }, + { + "include": "#function-declaration" + }, + { + "include": "#class-declaration" + }, + { + "include": "#interface-declaration" + }, + { + "include": "#enum-declaration" + }, + { + "include": "#namespace-declaration" + }, + { + "include": "#type-alias-declaration" + }, + { + "include": "#import-equals-declaration" + }, + { + "include": "#import-declaration" + }, + { + "include": "#export-declaration" + } + ] + }, + "control-statement": { + "patterns": [ + { + "include": "#switch-statement" + }, + { + "include": "#for-loop" + }, + { + "name": "keyword.control.trycatch.js", + "match": "(?)\n )) |\n ((async\\s*)?(\n ([(]\\s*(([)]\\s*:)|([_$[:alpha:]][_$[:alnum:]]*\\s*:)|(\\.\\.\\.) )) |\n ([<]\\s*[_$[:alpha:]][_$[:alnum:]]*((\\s+extends\\s*[^=>])|(\\s*[,]))) |\n ((<\\s*[_$[:alpha:]\\{\\(]([^<>=]|=[^<]|\\<\\s*[_$[:alpha:]\\{\\(]([^=<>]|=[^<])+\\>)+>\\s*)?\\((\\s*[_$[:alpha:]\\{\\(]([^()]|\\((\\s*[_$[:alpha:]\\{\\(]\\{\\(][^()]*)?\\))*)?\\)(\\s*:\\s*(.)*)?\\s*=>)\n ))\n )) |\n (:\\s*(\n (<) |\n ([(]\\s*(\n ([)]) |\n (\\.\\.\\.) |\n ([_$[:alnum:]]+\\s*(\n ([:,?=])|\n ([)]\\s*=>)\n ))\n ))\n ))\n)", + "begin": "(?x)([_$[:alpha:]][_$[:alnum:]]*)(?=\\s*\n# function assignment |\n(=\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n # sure shot arrow functions even if => is on new line\n(\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*[_$[:alpha:]\\{\\(]([^<>=]|=[^<]|\\<\\s*[_$[:alpha:]\\{\\(]([^=<>]|=[^<])+\\>)+>\\s*)? # typeparameters\n \\((\\s*[_$[:alpha:]\\{\\(]([^()]|\\((\\s*[_$[:alpha:]\\{\\(]\\{\\(][^()]*)?\\))*)?\\) # parameteres\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)) |\n# typeannotation is fn type: < | () | (... | (param: | (param, | (param? | (param= | (param) =>\n(:\\s*(\n (<) |\n ([(]\\s*(\n ([)]) |\n (\\.\\.\\.) |\n ([_$[:alnum:]]+\\s*(\n ([:,?=])|\n ([)]\\s*=>)\n ))\n ))\n)))", "beginCaptures": { "1": { "name": "meta.definition.variable.js entity.name.function.js" @@ -349,192 +501,342 @@ } ] }, - "ternary-expression": { - "begin": "(\\?)", - "beginCaptures": { - "0": { - "name": "keyword.operator.ternary.js" - } - }, - "end": "(:)", - "endCaptures": { - "0": { - "name": "keyword.operator.ternary.js" - } - }, + "parameter-name": { "patterns": [ { - "include": "#expression" + "match": "\\s*\\b(public|protected|private|readonly)(?=\\s+(public|protected|private|readonly)\\s+)", + "captures": { + "1": { + "name": "storage.modifier.js" + } + } + }, + { + "match": "(?x)(?:\\s*\\b(public|private|protected|readonly)\\s+)?(\\.\\.\\.)?\\s*(?)\n )) |\n ((async\\s*)?(\n # sure shot arrow functions even if => is on new line\n(\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*[_$[:alpha:]\\{\\(]([^<>=]|=[^<]|\\<\\s*[_$[:alpha:]\\{\\(]([^=<>]|=[^<])+\\>)+>\\s*)? # typeparameters\n \\((\\s*[_$[:alpha:]\\{\\(]([^()]|\\((\\s*[_$[:alpha:]\\{\\(]\\{\\(][^()]*)?\\))*)?\\) # parameteres\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)) |\n# typeannotation is fn type: < | () | (... | (param: | (param, | (param? | (param= | (param) =>\n(:\\s*(\n (<) |\n ([(]\\s*(\n ([)]) |\n (\\.\\.\\.) |\n ([_$[:alnum:]]+\\s*(\n ([:,?=])|\n ([)]\\s*=>)\n ))\n ))\n)))", + "captures": { + "1": { + "name": "storage.modifier.js" + }, + "2": { + "name": "keyword.operator.rest.js" + }, + "3": { + "name": "entity.name.function.js variable.language.this.js" + }, + "4": { + "name": "entity.name.function.js" + }, + "5": { + "name": "keyword.operator.optional.js" + } + } + }, + { + "match": "(?:\\s*\\b(public|private|protected|readonly)\\s+)?(\\.\\.\\.)?\\s*(?)\n )) |\n ((async\\s*)?(\n # sure shot arrow functions even if => is on new line\n(\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*[_$[:alpha:]\\{\\(]([^<>=]|=[^<]|\\<\\s*[_$[:alpha:]\\{\\(]([^=<>]|=[^<])+\\>)+>\\s*)? # typeparameters\n \\((\\s*[_$[:alpha:]\\{\\(]([^()]|\\((\\s*[_$[:alpha:]\\{\\(]\\{\\(][^()]*)?\\))*)?\\) # parameteres\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)) |\n# typeannotation is fn type: < | () | (... | (param: | (param, | (param? | (param= | (param) =>\n(:\\s*(\n (<) |\n ([(]\\s*(\n ([)]) |\n (\\.\\.\\.) |\n ([_$[:alnum:]]+\\s*(\n ([:,?=])|\n ([)]\\s*=>)\n ))\n ))\n)))" + }, + { + "name": "meta.definition.property.js variable.object.property.js", + "match": "[_$[:alpha:]][_$[:alnum:]]*" + }, + { + "name": "keyword.operator.optional.js", + "match": "\\?" + } + ] + } + ] + }, + "variable-initializer": { + "patterns": [ + { + "begin": "(?)", + "captures": { + "1": { + "name": "storage.modifier.async.js" + }, + "2": { + "name": "variable.parameter.js" + } + } + }, + { + "name": "meta.arrow.js", + "begin": "(?x) (?:\n (? is on new line\n(\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*[_$[:alpha:]\\{\\(]([^<>=]|=[^<]|\\<\\s*[_$[:alpha:]\\{\\(]([^=<>]|=[^<])+\\>)+>\\s*)? # typeparameters\n \\((\\s*[_$[:alpha:]\\{\\(]([^()]|\\((\\s*[_$[:alpha:]\\{\\(]\\{\\(][^()]*)?\\))*)?\\) # parameteres\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n )\n)", + "beginCaptures": { + "1": { + "name": "storage.modifier.async.js" + } + }, + "end": "(?==>|\\{|(^\\s*(export|function|class|interface|let|var|const|import|enum|namespace|module|type|abstract|declare)\\s+))", + "patterns": [ + { + "include": "#comment" + }, + { + "include": "#type-parameters" + }, + { + "include": "#function-parameters" + }, + { + "include": "#arrow-return-type" + } + ] + }, + { + "name": "meta.arrow.js", + "begin": "=>", + "beginCaptures": { + "0": { + "name": "storage.type.function.arrow.js" + } + }, + "end": "(?<=\\}|\\S)(?)|((?!\\{)(?=\\S))", + "patterns": [ + { + "include": "#decl-block" + }, + { + "include": "#expression" + } + ] + } + ] + }, + "indexer-declaration": { + "name": "meta.indexer.declaration.js", + "begin": "(?:(?)\n )) |\n ((async\\s*)?(\n ([(]\\s*(([)]\\s*:)|([_$[:alpha:]][_$[:alnum:]]*\\s*:)|(\\.\\.\\.) )) |\n ([<]\\s*[_$[:alpha:]][_$[:alnum:]]*((\\s+extends\\s*[^=>])|(\\s*[,]))) |\n ((<\\s*[_$[:alpha:]\\{\\(]([^<>=]|=[^<]|\\<\\s*[_$[:alpha:]\\{\\(]([^=<>]|=[^<])+\\>)+>\\s*)?\\((\\s*[_$[:alpha:]\\{\\(]([^()]|\\((\\s*[_$[:alpha:]\\{\\(]\\{\\(][^()]*)?\\))*)?\\)(\\s*:\\s*(.)*)?\\s*=>)\n ))\n )) |\n (:\\s*(\n (<) |\n ([(]\\s*(\n ([)]) |\n (\\.\\.\\.) |\n ([_$[:alnum:]]+\\s*(\n ([:,?=])|\n ([)]\\s*=>)\n ))\n ))\n ))\n)" - }, - { - "name": "meta.definition.property.js variable.object.property.js", - "match": "[_$[:alpha:]][_$[:alnum:]]*" - }, - { - "name": "keyword.operator.optional.js", - "match": "\\?" - } - ] - } - ] - }, - "method-declaration": { - "patterns": [ - { - "name": "meta.method.declaration.js", - "begin": "(?)\n )) |\n ((async\\s*)?(\n ([(]\\s*(([)]\\s*:)|([_$[:alpha:]][_$[:alnum:]]*\\s*:)|(\\.\\.\\.) )) |\n ([<]\\s*[_$[:alpha:]][_$[:alnum:]]*((\\s+extends\\s*[^=>])|(\\s*[,]))) |\n ((<\\s*[_$[:alpha:]\\{\\(]([^<>=]|=[^<]|\\<\\s*[_$[:alpha:]\\{\\(]([^=<>]|=[^<])+\\>)+>\\s*)?\\((\\s*[_$[:alpha:]\\{\\(]([^()]|\\((\\s*[_$[:alpha:]\\{\\(]\\{\\(][^()]*)?\\))*)?\\)(\\s*:\\s*(.)*)?\\s*=>)\n ))\n )) |\n (:\\s*(\n (<) |\n ([(]\\s*(\n ([)]) |\n (\\.\\.\\.) |\n ([_$[:alnum:]]+\\s*(\n ([:,?=])|\n ([)]\\s*=>)\n ))\n ))\n ))\n)", - "captures": { - "1": { - "name": "storage.modifier.js" - }, - "2": { - "name": "keyword.operator.rest.js" - }, - "3": { - "name": "entity.name.function.js variable.language.this.js" - }, - "4": { - "name": "entity.name.function.js" - }, - "5": { - "name": "keyword.operator.optional.js" - } - } - }, - { - "match": "(?:\\s*\\b(public|private|protected|readonly)\\s+)?(\\.\\.\\.)?\\s*(?])|((?<=[\\}>\\]\\)]|[_$[:alpha:]])\\s*(?=\\{)))", - "patterns": [ - { - "include": "#type" - } - ] - }, - { - "name": "meta.type.annotation.js", - "begin": "(:)", - "beginCaptures": { - "1": { - "name": "keyword.operator.type.annotation.js" - } - }, - "end": "(?])|(?=^\\s*$)|((?<=\\S)(?=\\s*$))|((?<=[\\}>\\]\\)]|[_$[:alpha:]])\\s*(?=\\{)))", - "patterns": [ - { - "include": "#type" - } - ] - } - ] - }, - "type": { - "patterns": [ - { - "include": "#comment" - }, - { - "include": "#string" - }, - { - "include": "#numeric-literal" - }, - { - "include": "#type-primitive" - }, - { - "include": "#type-builtin-literals" - }, - { - "include": "#type-parameters" - }, - { - "include": "#type-tuple" - }, - { - "include": "#type-object" - }, - { - "include": "#type-operators" - }, - { - "include": "#type-fn-type-parameters" - }, - { - "include": "#type-paren-or-function-parameters" - }, - { - "include": "#type-function-return-type" - }, - { - "include": "#type-name" - } - ] - }, - "function-parameters": { - "name": "meta.parameters.js", - "begin": "\\(", - "beginCaptures": { - "0": { - "name": "punctuation.definition.parameters.begin.js" - } - }, - "end": "\\)", - "endCaptures": { - "0": { - "name": "punctuation.definition.parameters.end.js" - } - }, - "patterns": [ - { - "include": "#comment" - }, - { - "include": "#decorator" - }, - { - "include": "#destructuring-parameter" - }, - { - "include": "#parameter-name" - }, - { - "include": "#type-annotation" - }, - { - "include": "#variable-initializer" - }, - { - "name": "punctuation.separator.parameter.js", - "match": "," - } - ] - }, - "type-primitive": { - "name": "support.type.primitive.js", - "match": "(?)\n ))\n )\n )\n)", - "end": "(?<=\\))", - "patterns": [ - { - "include": "#function-parameters" - } - ] - } - ] - }, - "type-operators": { - "patterns": [ - { - "include": "#typeof-operator" - }, - { - "begin": "([&|])(?=\\s*\\{)", - "beginCaptures": { - "0": { - "name": "keyword.operator.type.js" - } - }, - "end": "(?<=\\})", - "patterns": [ - { - "include": "#type-object" - } - ] - }, - { - "begin": "[&|]", - "beginCaptures": { - "0": { - "name": "keyword.operator.type.js" - } - }, - "end": "(?=\\S)" - }, - { - "name": "keyword.operator.expression.keyof.js", - "match": "(?)(?=\\s*\\S)", - "beginCaptures": { - "1": { - "name": "storage.type.function.arrow.js" - } - }, - "end": "(?)(?]|//|$)", - "patterns": [ - { - "include": "#type-function-return-type-core" - } - ] - }, - { - "name": "meta.type.function.return.js", - "begin": "=>", - "beginCaptures": { - "0": { - "name": "storage.type.function.arrow.js" - } - }, - "end": "(?)(?]|//|^\\s*$)|((?<=\\S)(?=\\s*$)))", - "patterns": [ - { - "include": "#type-function-return-type-core" - } - ] - } - ] - }, - "type-function-return-type-core": { - "patterns": [ - { - "include": "#comment" - }, - { - "begin": "(?<==>)(?=\\s*\\{)", - "end": "(?<=\\})", - "patterns": [ - { - "include": "#type-object" - } - ] - }, - { - "include": "#type-predicate-operator" - }, - { - "include": "#type" - } - ] - }, - "type-tuple": { - "name": "meta.type.tuple.js", - "begin": "\\[", - "beginCaptures": { - "0": { - "name": "meta.brace.square.js" - } - }, - "end": "\\]", - "endCaptures": { - "0": { - "name": "meta.brace.square.js" - } - }, - "patterns": [ - { - "include": "#type" - }, - { - "include": "#punctuation-comma" - } - ] - }, - "type-name": { - "patterns": [ - { - "match": "([_$[:alpha:]][_$[:alnum:]]*)\\s*(\\.)", - "captures": { - "1": { - "name": "entity.name.type.module.js" - }, - "2": { - "name": "punctuation.accessor.js" - } - } - }, - { - "name": "entity.name.type.js", - "match": "[_$[:alpha:]][_$[:alnum:]]*" - } - ] - }, - "type-parameters": { - "name": "meta.type.parameters.js", - "begin": "(<)", - "beginCaptures": { - "1": { - "name": "punctuation.definition.typeparameters.begin.js" - } - }, - "end": "(>)", - "endCaptures": { - "1": { - "name": "punctuation.definition.typeparameters.end.js" - } - }, - "patterns": [ - { - "include": "#comment" - }, - { - "name": "storage.modifier.js", - "match": "(?)" - }, - { - "include": "#type" - }, - { - "include": "#punctuation-comma" - } - ] - }, - "variable-initializer": { - "patterns": [ - { - "begin": "(?)\n )) |\n ((async\\s*)?(\n # sure shot arrow functions even if => is on new line\n(\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*[_$[:alpha:]\\{\\(]([^<>=]|=[^<]|\\<\\s*[_$[:alpha:]\\{\\(]([^=<>]|=[^<])+\\>)+>\\s*)? # typeparameters\n \\((\\s*[_$[:alpha:]\\{\\(]([^()]|\\((\\s*[_$[:alpha:]\\{\\(]\\{\\(][^()]*)?\\))*)?\\) # parameteres\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)))", "captures": { + "0": { + "name": "meta.object-literal.key.js" + }, "1": { - "name": "support.class.console.js" - }, - "2": { - "name": "punctuation.accessor.js" - }, - "3": { - "name": "support.function.console.js" + "name": "entity.name.function.js" } } }, { - "match": "(?=]|=[^<]|\\<\\s*[_$[:alpha:]\\{\\(]([^=<>]|=[^<])+\\>)+>\\s*)?\\()", - "captures": { - "1": { - "name": "punctuation.accessor.js" - }, - "2": { - "name": "support.constant.dom.js" - }, - "3": { - "name": "support.variable.property.dom.js" + "name": "meta.object.member.js", + "begin": ":", + "beginCaptures": { + "0": { + "name": "meta.object-literal.key.js punctuation.separator.key-value.js" } - } - }, - { - "name": "support.class.node.js", - "match": "(?x)(?)\n )) |\n ((async\\s*)?(\n ([(]\\s*(([)]\\s*:)|([_$[:alpha:]][_$[:alnum:]]*\\s*:)|(\\.\\.\\.) )) |\n ([<]\\s*[_$[:alpha:]][_$[:alnum:]]*((\\s+extends\\s*[^=>])|(\\s*[,]))) |\n ((<\\s*[_$[:alpha:]\\{\\(]([^<>=]|=[^<]|\\<\\s*[_$[:alpha:]\\{\\(]([^=<>]|=[^<])+\\>)+>\\s*)?\\((\\s*[_$[:alpha:]\\{\\(]([^()]|\\((\\s*[_$[:alpha:]\\{\\(]\\{\\(][^()]*)?\\))*)?\\)(\\s*:\\s*(.)*)?\\s*=>)\n ))\n))", - "captures": { - "1": { - "name": "punctuation.accessor.js" - }, - "2": { - "name": "entity.name.function.js" - } - } - }, - { - "match": "(\\.)\\s*([[:upper:]][_$[:digit:][:upper:]]*)(?![_$[:alnum:]])", - "captures": { - "1": { - "name": "punctuation.accessor.js" - }, - "2": { - "name": "variable.other.constant.property.js" - } - } - }, - { - "match": "(\\.)\\s*([_$[:alpha:]][_$[:alnum:]]*)", - "captures": { - "1": { - "name": "punctuation.accessor.js" - }, - "2": { - "name": "variable.other.property.js" - } - } - }, - { - "name": "variable.other.constant.js", - "match": "([[:upper:]][_$[:digit:][:upper:]]*)(?![_$[:alnum:]])" - }, - { - "name": "variable.other.readwrite.js", - "match": "[_$[:alpha:]][_$[:alnum:]]*" - } - ] - }, - "object-identifiers": { - "patterns": [ - { - "name": "support.class.js", - "match": "([_$[:alpha:]][_$[:alnum:]]*)(?=\\s*\\.\\s*prototype\\b(?!\\$))" - }, - { - "match": "(?x)(\\.)\\s*(?:\n ([[:upper:]][_$[:digit:][:upper:]]*) |\n ([_$[:alpha:]][_$[:alnum:]]*)\n)(?=\\s*\\.\\s*[_$[:alpha:]][_$[:alnum:]]*)", - "captures": { - "1": { - "name": "punctuation.accessor.js" - }, - "2": { - "name": "variable.other.constant.object.property.js" - }, - "3": { - "name": "variable.other.object.property.js" - } - } - }, - { - "match": "(?x)(?:\n ([[:upper:]][_$[:digit:][:upper:]]*) |\n ([_$[:alpha:]][_$[:alnum:]]*)\n)(?=\\s*\\.\\s*[_$[:alpha:]][_$[:alnum:]]*)", - "captures": { - "1": { - "name": "variable.other.constant.object.js" - }, - "2": { - "name": "variable.other.object.js" - } - } - } - ] - }, - "cast": { - "patterns": [ - { - "include": "#jsx" - } - ] - }, "new-expr": { "name": "new.expr.js", "begin": "(?)\n )) |\n ((async\\s*)?(\n ([(]\\s*(([)]\\s*:)|([_$[:alpha:]][_$[:alnum:]]*\\s*:)|(\\.\\.\\.) )) |\n ([<]\\s*[_$[:alpha:]][_$[:alnum:]]*((\\s+extends\\s*[^=>])|(\\s*[,]))) |\n ((<\\s*[_$[:alpha:]\\{\\(]([^<>=]|=[^<]|\\<\\s*[_$[:alpha:]\\{\\(]([^=<>]|=[^<])+\\>)+>\\s*)?\\((\\s*[_$[:alpha:]\\{\\(]([^()]|\\((\\s*[_$[:alpha:]\\{\\(]\\{\\(][^()]*)?\\))*)?\\)(\\s*:\\s*(.)*)?\\s*=>)\n ))\n)))", - "captures": { - "0": { - "name": "meta.object-literal.key.js" - }, - "1": { - "name": "entity.name.function.js" - } - } - }, - { - "name": "meta.object.member.js", - "match": "(?:[_$[:alpha:]][_$[:alnum:]]*)\\s*(?=:)", - "captures": { - "0": { - "name": "meta.object-literal.key.js" - } - } - }, - { - "name": "meta.object.member.js", - "begin": "\\.\\.\\.", - "beginCaptures": { - "0": { - "name": "keyword.operator.spread.js" - } - }, - "end": "(?=,|\\})", - "patterns": [ - { - "include": "#expression" - } - ] - }, - { - "name": "meta.object.member.js", - "match": "([_$[:alpha:]][_$[:alnum:]]*)\\s*(?=,|\\}|$)", - "captures": { - "1": { - "name": "variable.other.readwrite.js" - } - } - }, - { - "name": "meta.object.member.js", - "begin": "(?=[_$[:alpha:]][_$[:alnum:]]*\\s*=)", - "end": "(?=,|\\}|$)", - "patterns": [ - { - "include": "#expression" - } - ] - }, - { - "include": "#object-member-body" + "include": "#expression" }, { "include": "#punctuation-comma" } ] }, - "object-member-body": { - "name": "meta.object.member.js", - "begin": ":", - "beginCaptures": { - "0": { - "name": "meta.object-literal.key.js punctuation.separator.key-value.js" - } - }, - "end": "(?=,|\\})", + "cast": { "patterns": [ { - "include": "#expression" + "include": "#jsx" } ] }, @@ -2916,64 +2274,473 @@ "name": "keyword.operator.expression.typeof.js", "match": "(?)", + "include": "#numeric-literal" + }, + { + "include": "#boolean-literal" + }, + { + "include": "#null-literal" + }, + { + "include": "#undefined-literal" + }, + { + "include": "#numericConstant-literal" + }, + { + "include": "#array-literal" + }, + { + "include": "#this-literal" + }, + { + "include": "#super-literal" + } + ] + }, + "array-literal": { + "name": "meta.array.literal.js", + "begin": "\\[", + "beginCaptures": { + "0": { + "name": "meta.brace.square.js" + } + }, + "end": "\\]", + "endCaptures": { + "0": { + "name": "meta.brace.square.js" + } + }, + "patterns": [ + { + "include": "#expression" + }, + { + "include": "#punctuation-comma" + } + ] + }, + "numeric-literal": { + "patterns": [ + { + "name": "constant.numeric.hex.js", + "match": "\\b(? is on new line\n (\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n ) |\n (\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends \n ) |\n # arrow function possible to detect only with => on same line\n (\n (<\\s*[_$[:alpha:]\\{\\(]([^<>=]|=[^<]|\\<\\s*[_$[:alpha:]\\{\\(]([^=<>]|=[^<])+\\>)+>\\s*)? # typeparameters\n \\((\\s*[_$[:alpha:]\\{\\(]([^()]|\\((\\s*[_$[:alpha:]\\{\\(]\\{\\(][^()]*)?\\))*)?\\) # parameteres\n (\\s*:\\s*(.)*)? # return type\n \\s*=> # arrow operator\n )\n )\n)", + "match": "(?x)(?=]|=[^<]|\\<\\s*[_$[:alpha:]\\{\\(]([^=<>]|=[^<])+\\>)+>\\s*)?\\()", + "captures": { + "1": { + "name": "punctuation.accessor.js" + }, + "2": { + "name": "support.constant.dom.js" + }, + "3": { + "name": "support.variable.property.dom.js" + } + } + }, + { + "name": "support.class.node.js", + "match": "(?x)(?)\n )) |\n ((async\\s*)?(\n # sure shot arrow functions even if => is on new line\n(\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*[_$[:alpha:]\\{\\(]([^<>=]|=[^<]|\\<\\s*[_$[:alpha:]\\{\\(]([^=<>]|=[^<])+\\>)+>\\s*)? # typeparameters\n \\((\\s*[_$[:alpha:]\\{\\(]([^()]|\\((\\s*[_$[:alpha:]\\{\\(]\\{\\(][^()]*)?\\))*)?\\) # parameteres\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n))", + "captures": { + "1": { + "name": "punctuation.accessor.js" + }, + "2": { + "name": "entity.name.function.js" + } + } + }, + { + "match": "(\\.)\\s*([[:upper:]][_$[:digit:][:upper:]]*)(?![_$[:alnum:]])", + "captures": { + "1": { + "name": "punctuation.accessor.js" + }, + "2": { + "name": "variable.other.constant.property.js" + } + } + }, + { + "match": "(\\.)\\s*([_$[:alpha:]][_$[:alnum:]]*)", + "captures": { + "1": { + "name": "punctuation.accessor.js" + }, + "2": { + "name": "variable.other.property.js" + } + } + }, + { + "name": "variable.other.constant.js", + "match": "([[:upper:]][_$[:digit:][:upper:]]*)(?![_$[:alnum:]])" + }, + { + "name": "variable.other.readwrite.js", + "match": "[_$[:alpha:]][_$[:alnum:]]*" + } + ] + }, + "object-identifiers": { + "patterns": [ + { + "name": "support.class.js", + "match": "([_$[:alpha:]][_$[:alnum:]]*)(?=\\s*\\.\\s*prototype\\b(?!\\$))" + }, + { + "match": "(?x)(\\.)\\s*(?:\n ([[:upper:]][_$[:digit:][:upper:]]*) |\n ([_$[:alpha:]][_$[:alnum:]]*)\n)(?=\\s*\\.\\s*[_$[:alpha:]][_$[:alnum:]]*)", + "captures": { + "1": { + "name": "punctuation.accessor.js" + }, + "2": { + "name": "variable.other.constant.object.property.js" + }, + "3": { + "name": "variable.other.object.property.js" + } + } + }, + { + "match": "(?x)(?:\n ([[:upper:]][_$[:digit:][:upper:]]*) |\n ([_$[:alpha:]][_$[:alnum:]]*)\n)(?=\\s*\\.\\s*[_$[:alpha:]][_$[:alnum:]]*)", + "captures": { + "1": { + "name": "variable.other.constant.object.js" + }, + "2": { + "name": "variable.other.object.js" + } + } + } + ] + }, + "type-annotation": { + "patterns": [ + { + "name": "meta.type.annotation.js", + "begin": "(:)(?=\\s*\\S)", "beginCaptures": { "1": { - "name": "storage.modifier.async.js" + "name": "keyword.operator.type.annotation.js" } }, - "end": "(?==>|\\{|(^\\s*(export|function|class|interface|let|var|const|import|enum|namespace|module|type|abstract|declare)\\s+))", + "end": "(?])|((?<=[\\}>\\]\\)]|[_$[:alpha:]])\\s*(?=\\{)))", "patterns": [ { - "include": "#comment" - }, - { - "include": "#type-parameters" - }, - { - "include": "#function-parameters" - }, - { - "include": "#arrow-return-type" + "include": "#type" } ] }, { - "name": "meta.arrow.js", - "begin": "=>", + "name": "meta.type.annotation.js", + "begin": "(:)", "beginCaptures": { - "0": { - "name": "storage.type.function.arrow.js" + "1": { + "name": "keyword.operator.type.annotation.js" } }, - "end": "(?<=\\}|\\S)(?)|((?!\\{)(?=\\S))", + "end": "(?])|(?=^\\s*$)|((?<=\\S)(?=\\s*$))|((?<=[\\}>\\]\\)]|[_$[:alpha:]])\\s*(?=\\{)))", "patterns": [ { - "include": "#decl-block" - }, - { - "include": "#expression" + "include": "#type" } ] } ] }, + "return-type": { + "patterns": [ + { + "name": "meta.return.type.js", + "begin": "(?<=\\))\\s*(:)(?=\\s*\\S)", + "beginCaptures": { + "1": { + "name": "keyword.operator.type.annotation.js" + } + }, + "end": "(?)", + "endCaptures": { + "1": { + "name": "punctuation.definition.typeparameters.end.js" + } + }, + "patterns": [ + { + "include": "#comment" + }, + { + "name": "storage.modifier.js", + "match": "(?)" + }, + { + "include": "#type" + }, + { + "include": "#punctuation-comma" + } + ] }, - "punctuation-semicolon": { - "name": "punctuation.terminator.statement.js", - "match": ";" + "type": { + "patterns": [ + { + "include": "#comment" + }, + { + "include": "#string" + }, + { + "include": "#numeric-literal" + }, + { + "include": "#type-primitive" + }, + { + "include": "#type-builtin-literals" + }, + { + "include": "#type-parameters" + }, + { + "include": "#type-tuple" + }, + { + "include": "#type-object" + }, + { + "include": "#type-operators" + }, + { + "include": "#type-fn-type-parameters" + }, + { + "include": "#type-paren-or-function-parameters" + }, + { + "include": "#type-function-return-type" + }, + { + "include": "#type-name" + } + ] }, - "punctuation-accessor": { - "name": "punctuation.accessor.js", - "match": "\\." + "type-primitive": { + "name": "support.type.primitive.js", + "match": "(?)\n ))\n )\n )\n)", + "end": "(?<=\\))", + "patterns": [ + { + "include": "#function-parameters" + } + ] + } + ] + }, + "type-function-return-type": { + "patterns": [ + { + "name": "meta.type.function.return.js", + "begin": "(=>)(?=\\s*\\S)", + "beginCaptures": { + "1": { + "name": "storage.type.function.arrow.js" + } + }, + "end": "(?)(?]|//|$)", + "patterns": [ + { + "include": "#type-function-return-type-core" + } + ] + }, + { + "name": "meta.type.function.return.js", + "begin": "=>", + "beginCaptures": { + "0": { + "name": "storage.type.function.arrow.js" + } + }, + "end": "(?)(?]|//|^\\s*$)|((?<=\\S)(?=\\s*$)))", + "patterns": [ + { + "include": "#type-function-return-type-core" + } + ] + } + ] + }, + "type-function-return-type-core": { + "patterns": [ + { + "include": "#comment" + }, + { + "begin": "(?<==>)(?=\\s*\\{)", + "end": "(?<=\\})", + "patterns": [ + { + "include": "#type-object" + } + ] + }, + { + "include": "#type-predicate-operator" + }, + { + "include": "#type" + } + ] + }, + "type-operators": { + "patterns": [ + { + "include": "#typeof-operator" + }, + { + "begin": "([&|])(?=\\s*\\{)", + "beginCaptures": { + "0": { + "name": "keyword.operator.type.js" + } + }, + "end": "(?<=\\})", + "patterns": [ + { + "include": "#type-object" + } + ] + }, + { + "begin": "[&|]", + "beginCaptures": { + "0": { + "name": "keyword.operator.type.js" + } + }, + "end": "(?=\\S)" + }, + { + "name": "keyword.operator.expression.keyof.js", + "match": "(?|/\\*|//)", - "captures": { - "1": { - "name": "entity.other.attribute-name.js" - } - } - }, - "jsx-tag-attribute-assignment": { - "name": "keyword.operator.assignment.js", - "match": "=(?=\\s*(?:'|\"|{|/\\*|//|\\n))" - }, - "jsx-string-double-quoted": { - "name": "string.quoted.double.js", - "begin": "\"", - "end": "\"", - "beginCaptures": { - "0": { - "name": "punctuation.definition.string.begin.js" - } - }, - "endCaptures": { - "0": { - "name": "punctuation.definition.string.end.js" - } - }, - "patterns": [ - { - "include": "#jsx-entities" - } - ] - }, - "jsx-string-single-quoted": { - "name": "string.quoted.single.js", - "begin": "'", - "end": "'", - "beginCaptures": { - "0": { - "name": "punctuation.definition.string.begin.js" - } - }, - "endCaptures": { - "0": { - "name": "punctuation.definition.string.end.js" - } - }, - "patterns": [ - { - "include": "#jsx-entities" - } - ] - }, - "jsx-entities": { - "patterns": [ - { - "name": "constant.character.entity.js", - "match": "(&)([a-zA-Z0-9]+|#[0-9]+|#x[0-9a-fA-F]+)(;)", - "captures": { - "1": { - "name": "punctuation.definition.entity.js" - }, - "3": { - "name": "punctuation.definition.entity.js" - } - } - }, - { - "name": "invalid.illegal.bad-ampersand.js", - "match": "&" - } - ] - }, - "jsx-evaluated-code": { - "name": "meta.embedded.expression.js", - "begin": "\\{", - "end": "\\}", - "beginCaptures": { - "0": { - "name": "punctuation.section.embedded.begin.js" - } - }, - "endCaptures": { - "0": { - "name": "punctuation.section.embedded.end.js" - } - }, - "patterns": [ - { - "include": "#expression" - } - ] - }, - "jsx-tag-attributes-illegal": { - "name": "invalid.illegal.attribute.js", - "match": "\\S+" - }, "jsx-tag-without-attributes-in-expression": { "begin": "(?x)\n (?<=[({\\[,?=>:*]|&&|\\|\\||\\?|\\Wreturn|^return|\\Wdefault|^)\\s*\n (?=(<)\\s*((?:[a-z][a-z0-9]*|([_$a-zA-Z][-$\\w.]*))(?))", "end": "(?!\\s*(<)\\s*((?:[a-z][a-z0-9]*|([_$a-zA-Z][-$\\w.]*))(?))", @@ -4314,18 +4156,120 @@ } ] }, - "jsx": { + "jsx-evaluated-code": { + "name": "meta.embedded.expression.js", + "begin": "\\{", + "end": "\\}", + "beginCaptures": { + "0": { + "name": "punctuation.section.embedded.begin.js" + } + }, + "endCaptures": { + "0": { + "name": "punctuation.section.embedded.end.js" + } + }, "patterns": [ { - "include": "#jsx-tag-without-attributes-in-expression" - }, - { - "include": "#jsx-tag-in-expression" - }, - { - "include": "#jsx-tag-invalid" + "include": "#expression" } ] + }, + "jsx-entities": { + "patterns": [ + { + "name": "constant.character.entity.js", + "match": "(&)([a-zA-Z0-9]+|#[0-9]+|#x[0-9a-fA-F]+)(;)", + "captures": { + "1": { + "name": "punctuation.definition.entity.js" + }, + "3": { + "name": "punctuation.definition.entity.js" + } + } + }, + { + "name": "invalid.illegal.bad-ampersand.js", + "match": "&" + } + ] + }, + "jsx-tag-attributes": { + "patterns": [ + { + "include": "#jsx-tag-attribute-name" + }, + { + "include": "#jsx-tag-attribute-assignment" + }, + { + "include": "#jsx-string-double-quoted" + }, + { + "include": "#jsx-string-single-quoted" + }, + { + "include": "#jsx-evaluated-code" + } + ] + }, + "jsx-tag-attribute-name": { + "match": "(?x)\n \\s*\n ([_$a-zA-Z][-$\\w]*)\n (?=\\s|=|/?>|/\\*|//)", + "captures": { + "1": { + "name": "entity.other.attribute-name.js" + } + } + }, + "jsx-tag-attribute-assignment": { + "name": "keyword.operator.assignment.js", + "match": "=(?=\\s*(?:'|\"|{|/\\*|//|\\n))" + }, + "jsx-string-double-quoted": { + "name": "string.quoted.double.js", + "begin": "\"", + "end": "\"", + "beginCaptures": { + "0": { + "name": "punctuation.definition.string.begin.js" + } + }, + "endCaptures": { + "0": { + "name": "punctuation.definition.string.end.js" + } + }, + "patterns": [ + { + "include": "#jsx-entities" + } + ] + }, + "jsx-string-single-quoted": { + "name": "string.quoted.single.js", + "begin": "'", + "end": "'", + "beginCaptures": { + "0": { + "name": "punctuation.definition.string.begin.js" + } + }, + "endCaptures": { + "0": { + "name": "punctuation.definition.string.end.js" + } + }, + "patterns": [ + { + "include": "#jsx-entities" + } + ] + }, + "jsx-tag-attributes-illegal": { + "name": "invalid.illegal.attribute.js", + "match": "\\S+" } } } \ No newline at end of file diff --git a/extensions/typescript/syntaxes/TypeScript.tmLanguage.json b/extensions/typescript/syntaxes/TypeScript.tmLanguage.json index 510e532e022..28b955a0742 100644 --- a/extensions/typescript/syntaxes/TypeScript.tmLanguage.json +++ b/extensions/typescript/syntaxes/TypeScript.tmLanguage.json @@ -4,7 +4,7 @@ "If you want to provide a fix or improvement, please create a pull request against the original repository.", "Once accepted there, we are happy to receive an update request." ], - "version": "https://github.com/Microsoft/TypeScript-TmLanguage/commit/2dea76a2bd6c522cf824168c8a2d3cd05196069d", + "version": "https://github.com/Microsoft/TypeScript-TmLanguage/commit/cd202a57fd738d6d2c712c2ed63f5f41a11eb558", "name": "TypeScript", "scopeName": "source.ts", "fileTypes": [ @@ -44,20 +44,14 @@ "include": "#declaration" }, { - "include": "#switch-statement" + "include": "#control-statement" }, { - "include": "#for-loop" - }, - { - "include": "#after-operator-block" + "include": "#after-operator-block-as-object-literal" }, { "include": "#decl-block" }, - { - "include": "#control-statement" - }, { "include": "#expression" }, @@ -66,6 +60,161 @@ } ] }, + "declaration": { + "patterns": [ + { + "include": "#decorator" + }, + { + "include": "#var-expr" + }, + { + "include": "#function-declaration" + }, + { + "include": "#class-declaration" + }, + { + "include": "#interface-declaration" + }, + { + "include": "#enum-declaration" + }, + { + "include": "#namespace-declaration" + }, + { + "include": "#type-alias-declaration" + }, + { + "include": "#import-equals-declaration" + }, + { + "include": "#import-declaration" + }, + { + "include": "#export-declaration" + } + ] + }, + "control-statement": { + "patterns": [ + { + "include": "#switch-statement" + }, + { + "include": "#for-loop" + }, + { + "name": "keyword.control.trycatch.ts", + "match": "(?)\n )) |\n ((async\\s*)?(\n ([(]\\s*(([)]\\s*:)|([_$[:alpha:]][_$[:alnum:]]*\\s*:)|(\\.\\.\\.) )) |\n ([<]\\s*[_$[:alpha:]][_$[:alnum:]]*((\\s+extends\\s*[^=>])|(\\s*[,]))) |\n ((<\\s*[_$[:alpha:]\\{\\(]([^<>=]|=[^<]|\\<\\s*[_$[:alpha:]\\{\\(]([^=<>]|=[^<])+\\>)+>\\s*)?\\((\\s*[_$[:alpha:]\\{\\(]([^()]|\\((\\s*[_$[:alpha:]\\{\\(]\\{\\(][^()]*)?\\))*)?\\)(\\s*:\\s*(.)*)?\\s*=>)\n ))\n )) |\n (:\\s*(\n (<) |\n ([(]\\s*(\n ([)]) |\n (\\.\\.\\.) |\n ([_$[:alnum:]]+\\s*(\n ([:,?=])|\n ([)]\\s*=>)\n ))\n ))\n ))\n)", + "begin": "(?x)([_$[:alpha:]][_$[:alnum:]]*)(?=\\s*\n# function assignment |\n(=\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n # sure shot arrow functions even if => is on new line\n(\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*[_$[:alpha:]\\{\\(]([^<>=]|=[^<]|\\<\\s*[_$[:alpha:]\\{\\(]([^=<>]|=[^<])+\\>)+>\\s*)? # typeparameters\n \\((\\s*[_$[:alpha:]\\{\\(]([^()]|\\((\\s*[_$[:alpha:]\\{\\(]\\{\\(][^()]*)?\\))*)?\\) # parameteres\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)) |\n# typeannotation is fn type: < | () | (... | (param: | (param, | (param? | (param= | (param) =>\n(:\\s*(\n (<) |\n ([(]\\s*(\n ([)]) |\n (\\.\\.\\.) |\n ([_$[:alnum:]]+\\s*(\n ([:,?=])|\n ([)]\\s*=>)\n ))\n ))\n)))", "beginCaptures": { "1": { "name": "meta.definition.variable.ts entity.name.function.ts" @@ -346,189 +495,342 @@ } ] }, - "ternary-expression": { - "begin": "(\\?)", - "beginCaptures": { - "0": { - "name": "keyword.operator.ternary.ts" - } - }, - "end": "(:)", - "endCaptures": { - "0": { - "name": "keyword.operator.ternary.ts" - } - }, + "parameter-name": { "patterns": [ { - "include": "#expression" + "match": "\\s*\\b(public|protected|private|readonly)(?=\\s+(public|protected|private|readonly)\\s+)", + "captures": { + "1": { + "name": "storage.modifier.ts" + } + } + }, + { + "match": "(?x)(?:\\s*\\b(public|private|protected|readonly)\\s+)?(\\.\\.\\.)?\\s*(?)\n )) |\n ((async\\s*)?(\n # sure shot arrow functions even if => is on new line\n(\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*[_$[:alpha:]\\{\\(]([^<>=]|=[^<]|\\<\\s*[_$[:alpha:]\\{\\(]([^=<>]|=[^<])+\\>)+>\\s*)? # typeparameters\n \\((\\s*[_$[:alpha:]\\{\\(]([^()]|\\((\\s*[_$[:alpha:]\\{\\(]\\{\\(][^()]*)?\\))*)?\\) # parameteres\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)) |\n# typeannotation is fn type: < | () | (... | (param: | (param, | (param? | (param= | (param) =>\n(:\\s*(\n (<) |\n ([(]\\s*(\n ([)]) |\n (\\.\\.\\.) |\n ([_$[:alnum:]]+\\s*(\n ([:,?=])|\n ([)]\\s*=>)\n ))\n ))\n)))", + "captures": { + "1": { + "name": "storage.modifier.ts" + }, + "2": { + "name": "keyword.operator.rest.ts" + }, + "3": { + "name": "entity.name.function.ts variable.language.this.ts" + }, + "4": { + "name": "entity.name.function.ts" + }, + "5": { + "name": "keyword.operator.optional.ts" + } + } + }, + { + "match": "(?:\\s*\\b(public|private|protected|readonly)\\s+)?(\\.\\.\\.)?\\s*(?)\n )) |\n ((async\\s*)?(\n # sure shot arrow functions even if => is on new line\n(\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*[_$[:alpha:]\\{\\(]([^<>=]|=[^<]|\\<\\s*[_$[:alpha:]\\{\\(]([^=<>]|=[^<])+\\>)+>\\s*)? # typeparameters\n \\((\\s*[_$[:alpha:]\\{\\(]([^()]|\\((\\s*[_$[:alpha:]\\{\\(]\\{\\(][^()]*)?\\))*)?\\) # parameteres\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)) |\n# typeannotation is fn type: < | () | (... | (param: | (param, | (param? | (param= | (param) =>\n(:\\s*(\n (<) |\n ([(]\\s*(\n ([)]) |\n (\\.\\.\\.) |\n ([_$[:alnum:]]+\\s*(\n ([:,?=])|\n ([)]\\s*=>)\n ))\n ))\n)))" + }, + { + "name": "meta.definition.property.ts variable.object.property.ts", + "match": "[_$[:alpha:]][_$[:alnum:]]*" + }, + { + "name": "keyword.operator.optional.ts", + "match": "\\?" + } + ] + } + ] + }, + "variable-initializer": { + "patterns": [ + { + "begin": "(?)", + "captures": { + "1": { + "name": "storage.modifier.async.ts" + }, + "2": { + "name": "variable.parameter.ts" + } + } + }, + { + "name": "meta.arrow.ts", + "begin": "(?x) (?:\n (? is on new line\n(\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*[_$[:alpha:]\\{\\(]([^<>=]|=[^<]|\\<\\s*[_$[:alpha:]\\{\\(]([^=<>]|=[^<])+\\>)+>\\s*)? # typeparameters\n \\((\\s*[_$[:alpha:]\\{\\(]([^()]|\\((\\s*[_$[:alpha:]\\{\\(]\\{\\(][^()]*)?\\))*)?\\) # parameteres\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n )\n)", + "beginCaptures": { + "1": { + "name": "storage.modifier.async.ts" + } + }, + "end": "(?==>|\\{|(^\\s*(export|function|class|interface|let|var|const|import|enum|namespace|module|type|abstract|declare)\\s+))", + "patterns": [ + { + "include": "#comment" + }, + { + "include": "#type-parameters" + }, + { + "include": "#function-parameters" + }, + { + "include": "#arrow-return-type" + } + ] + }, + { + "name": "meta.arrow.ts", + "begin": "=>", + "beginCaptures": { + "0": { + "name": "storage.type.function.arrow.ts" + } + }, + "end": "(?<=\\}|\\S)(?)|((?!\\{)(?=\\S))", + "patterns": [ + { + "include": "#decl-block" + }, + { + "include": "#expression" + } + ] + } + ] + }, + "indexer-declaration": { + "name": "meta.indexer.declaration.ts", + "begin": "(?:(?)\n )) |\n ((async\\s*)?(\n ([(]\\s*(([)]\\s*:)|([_$[:alpha:]][_$[:alnum:]]*\\s*:)|(\\.\\.\\.) )) |\n ([<]\\s*[_$[:alpha:]][_$[:alnum:]]*((\\s+extends\\s*[^=>])|(\\s*[,]))) |\n ((<\\s*[_$[:alpha:]\\{\\(]([^<>=]|=[^<]|\\<\\s*[_$[:alpha:]\\{\\(]([^=<>]|=[^<])+\\>)+>\\s*)?\\((\\s*[_$[:alpha:]\\{\\(]([^()]|\\((\\s*[_$[:alpha:]\\{\\(]\\{\\(][^()]*)?\\))*)?\\)(\\s*:\\s*(.)*)?\\s*=>)\n ))\n )) |\n (:\\s*(\n (<) |\n ([(]\\s*(\n ([)]) |\n (\\.\\.\\.) |\n ([_$[:alnum:]]+\\s*(\n ([:,?=])|\n ([)]\\s*=>)\n ))\n ))\n ))\n)" - }, - { - "name": "meta.definition.property.ts variable.object.property.ts", - "match": "[_$[:alpha:]][_$[:alnum:]]*" - }, - { - "name": "keyword.operator.optional.ts", - "match": "\\?" - } - ] - } - ] - }, - "method-declaration": { - "patterns": [ - { - "name": "meta.method.declaration.ts", - "begin": "(?)\n )) |\n ((async\\s*)?(\n ([(]\\s*(([)]\\s*:)|([_$[:alpha:]][_$[:alnum:]]*\\s*:)|(\\.\\.\\.) )) |\n ([<]\\s*[_$[:alpha:]][_$[:alnum:]]*((\\s+extends\\s*[^=>])|(\\s*[,]))) |\n ((<\\s*[_$[:alpha:]\\{\\(]([^<>=]|=[^<]|\\<\\s*[_$[:alpha:]\\{\\(]([^=<>]|=[^<])+\\>)+>\\s*)?\\((\\s*[_$[:alpha:]\\{\\(]([^()]|\\((\\s*[_$[:alpha:]\\{\\(]\\{\\(][^()]*)?\\))*)?\\)(\\s*:\\s*(.)*)?\\s*=>)\n ))\n )) |\n (:\\s*(\n (<) |\n ([(]\\s*(\n ([)]) |\n (\\.\\.\\.) |\n ([_$[:alnum:]]+\\s*(\n ([:,?=])|\n ([)]\\s*=>)\n ))\n ))\n ))\n)", - "captures": { - "1": { - "name": "storage.modifier.ts" - }, - "2": { - "name": "keyword.operator.rest.ts" - }, - "3": { - "name": "entity.name.function.ts variable.language.this.ts" - }, - "4": { - "name": "entity.name.function.ts" - }, - "5": { - "name": "keyword.operator.optional.ts" - } - } - }, - { - "match": "(?:\\s*\\b(public|private|protected|readonly)\\s+)?(\\.\\.\\.)?\\s*(?])|((?<=[\\}>\\]\\)]|[_$[:alpha:]])\\s*(?=\\{)))", - "patterns": [ - { - "include": "#type" - } - ] - }, - { - "name": "meta.type.annotation.ts", - "begin": "(:)", - "beginCaptures": { - "1": { - "name": "keyword.operator.type.annotation.ts" - } - }, - "end": "(?])|(?=^\\s*$)|((?<=\\S)(?=\\s*$))|((?<=[\\}>\\]\\)]|[_$[:alpha:]])\\s*(?=\\{)))", - "patterns": [ - { - "include": "#type" - } - ] - } - ] - }, - "type": { - "patterns": [ - { - "include": "#comment" - }, - { - "include": "#string" - }, - { - "include": "#numeric-literal" - }, - { - "include": "#type-primitive" - }, - { - "include": "#type-builtin-literals" - }, - { - "include": "#type-parameters" - }, - { - "include": "#type-tuple" - }, - { - "include": "#type-object" - }, - { - "include": "#type-operators" - }, - { - "include": "#type-fn-type-parameters" - }, - { - "include": "#type-paren-or-function-parameters" - }, - { - "include": "#type-function-return-type" - }, - { - "include": "#type-name" - } - ] - }, - "function-parameters": { - "name": "meta.parameters.ts", - "begin": "\\(", - "beginCaptures": { - "0": { - "name": "punctuation.definition.parameters.begin.ts" - } - }, - "end": "\\)", - "endCaptures": { - "0": { - "name": "punctuation.definition.parameters.end.ts" - } - }, - "patterns": [ - { - "include": "#comment" - }, - { - "include": "#decorator" - }, - { - "include": "#destructuring-parameter" - }, - { - "include": "#parameter-name" - }, - { - "include": "#type-annotation" - }, - { - "include": "#variable-initializer" - }, - { - "name": "punctuation.separator.parameter.ts", - "match": "," - } - ] - }, - "type-primitive": { - "name": "support.type.primitive.ts", - "match": "(?)\n ))\n )\n )\n)", - "end": "(?<=\\))", - "patterns": [ - { - "include": "#function-parameters" - } - ] - } - ] - }, - "type-operators": { - "patterns": [ - { - "include": "#typeof-operator" - }, - { - "begin": "([&|])(?=\\s*\\{)", - "beginCaptures": { - "0": { - "name": "keyword.operator.type.ts" - } - }, - "end": "(?<=\\})", - "patterns": [ - { - "include": "#type-object" - } - ] - }, - { - "begin": "[&|]", - "beginCaptures": { - "0": { - "name": "keyword.operator.type.ts" - } - }, - "end": "(?=\\S)" - }, - { - "name": "keyword.operator.expression.keyof.ts", - "match": "(?)(?=\\s*\\S)", - "beginCaptures": { - "1": { - "name": "storage.type.function.arrow.ts" - } - }, - "end": "(?)(?]|//|$)", - "patterns": [ - { - "include": "#type-function-return-type-core" - } - ] - }, - { - "name": "meta.type.function.return.ts", - "begin": "=>", - "beginCaptures": { - "0": { - "name": "storage.type.function.arrow.ts" - } - }, - "end": "(?)(?]|//|^\\s*$)|((?<=\\S)(?=\\s*$)))", - "patterns": [ - { - "include": "#type-function-return-type-core" - } - ] - } - ] - }, - "type-function-return-type-core": { - "patterns": [ - { - "include": "#comment" - }, - { - "begin": "(?<==>)(?=\\s*\\{)", - "end": "(?<=\\})", - "patterns": [ - { - "include": "#type-object" - } - ] - }, - { - "include": "#type-predicate-operator" - }, - { - "include": "#type" - } - ] - }, - "type-tuple": { - "name": "meta.type.tuple.ts", - "begin": "\\[", - "beginCaptures": { - "0": { - "name": "meta.brace.square.ts" - } - }, - "end": "\\]", - "endCaptures": { - "0": { - "name": "meta.brace.square.ts" - } - }, - "patterns": [ - { - "include": "#type" - }, - { - "include": "#punctuation-comma" - } - ] - }, - "type-name": { - "patterns": [ - { - "match": "([_$[:alpha:]][_$[:alnum:]]*)\\s*(\\.)", - "captures": { - "1": { - "name": "entity.name.type.module.ts" - }, - "2": { - "name": "punctuation.accessor.ts" - } - } - }, - { - "name": "entity.name.type.ts", - "match": "[_$[:alpha:]][_$[:alnum:]]*" - } - ] - }, - "type-parameters": { - "name": "meta.type.parameters.ts", - "begin": "(<)", - "beginCaptures": { - "1": { - "name": "punctuation.definition.typeparameters.begin.ts" - } - }, - "end": "(>)", - "endCaptures": { - "1": { - "name": "punctuation.definition.typeparameters.end.ts" - } - }, - "patterns": [ - { - "include": "#comment" - }, - { - "name": "storage.modifier.ts", - "match": "(?)" - }, - { - "include": "#type" - }, - { - "include": "#punctuation-comma" - } - ] - }, - "variable-initializer": { - "patterns": [ - { - "begin": "(?)\n )) |\n ((async\\s*)?(\n # sure shot arrow functions even if => is on new line\n(\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*[_$[:alpha:]\\{\\(]([^<>=]|=[^<]|\\<\\s*[_$[:alpha:]\\{\\(]([^=<>]|=[^<])+\\>)+>\\s*)? # typeparameters\n \\((\\s*[_$[:alpha:]\\{\\(]([^()]|\\((\\s*[_$[:alpha:]\\{\\(]\\{\\(][^()]*)?\\))*)?\\) # parameteres\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)))", "captures": { + "0": { + "name": "meta.object-literal.key.ts" + }, "1": { - "name": "support.class.console.ts" - }, - "2": { - "name": "punctuation.accessor.ts" - }, - "3": { - "name": "support.function.console.ts" + "name": "entity.name.function.ts" } } }, { - "match": "(?=]|=[^<]|\\<\\s*[_$[:alpha:]\\{\\(]([^=<>]|=[^<])+\\>)+>\\s*)?\\()", - "captures": { - "1": { - "name": "punctuation.accessor.ts" - }, - "2": { - "name": "support.constant.dom.ts" - }, - "3": { - "name": "support.variable.property.dom.ts" + "name": "meta.object.member.ts", + "begin": ":", + "beginCaptures": { + "0": { + "name": "meta.object-literal.key.ts punctuation.separator.key-value.ts" } - } - }, - { - "name": "support.class.node.ts", - "match": "(?x)(?)\n )) |\n ((async\\s*)?(\n ([(]\\s*(([)]\\s*:)|([_$[:alpha:]][_$[:alnum:]]*\\s*:)|(\\.\\.\\.) )) |\n ([<]\\s*[_$[:alpha:]][_$[:alnum:]]*((\\s+extends\\s*[^=>])|(\\s*[,]))) |\n ((<\\s*[_$[:alpha:]\\{\\(]([^<>=]|=[^<]|\\<\\s*[_$[:alpha:]\\{\\(]([^=<>]|=[^<])+\\>)+>\\s*)?\\((\\s*[_$[:alpha:]\\{\\(]([^()]|\\((\\s*[_$[:alpha:]\\{\\(]\\{\\(][^()]*)?\\))*)?\\)(\\s*:\\s*(.)*)?\\s*=>)\n ))\n))", - "captures": { - "1": { - "name": "punctuation.accessor.ts" - }, - "2": { - "name": "entity.name.function.ts" - } - } + "include": "#class-declaration" }, { - "match": "(\\.)\\s*([[:upper:]][_$[:digit:][:upper:]]*)(?![_$[:alnum:]])", - "captures": { - "1": { - "name": "punctuation.accessor.ts" - }, - "2": { - "name": "variable.other.constant.property.ts" - } - } - }, - { - "match": "(\\.)\\s*([_$[:alpha:]][_$[:alnum:]]*)", - "captures": { - "1": { - "name": "punctuation.accessor.ts" - }, - "2": { - "name": "variable.other.property.ts" - } - } - }, - { - "name": "variable.other.constant.ts", - "match": "([[:upper:]][_$[:digit:][:upper:]]*)(?![_$[:alnum:]])" - }, - { - "name": "variable.other.readwrite.ts", - "match": "[_$[:alpha:]][_$[:alnum:]]*" + "include": "#type" } ] }, - "object-identifiers": { + "paren-expression": { + "begin": "\\(", + "beginCaptures": { + "0": { + "name": "meta.brace.round.ts" + } + }, + "end": "\\)", + "endCaptures": { + "0": { + "name": "meta.brace.round.ts" + } + }, "patterns": [ { - "name": "support.class.ts", - "match": "([_$[:alpha:]][_$[:alnum:]]*)(?=\\s*\\.\\s*prototype\\b(?!\\$))" + "include": "#expression" }, { - "match": "(?x)(\\.)\\s*(?:\n ([[:upper:]][_$[:digit:][:upper:]]*) |\n ([_$[:alpha:]][_$[:alnum:]]*)\n)(?=\\s*\\.\\s*[_$[:alpha:]][_$[:alnum:]]*)", - "captures": { - "1": { - "name": "punctuation.accessor.ts" - }, - "2": { - "name": "variable.other.constant.object.property.ts" - }, - "3": { - "name": "variable.other.object.property.ts" - } - } - }, - { - "match": "(?x)(?:\n ([[:upper:]][_$[:digit:][:upper:]]*) |\n ([_$[:alpha:]][_$[:alnum:]]*)\n)(?=\\s*\\.\\s*[_$[:alpha:]][_$[:alnum:]]*)", - "captures": { - "1": { - "name": "variable.other.constant.object.ts" - }, - "2": { - "name": "variable.other.object.ts" - } - } + "include": "#punctuation-comma" } ] }, @@ -2648,7 +2145,7 @@ "patterns": [ { "name": "cast.expr.ts", - "begin": "(?:(?<=return|throw|yield|await|default|[=(,:>+*?]))\\s*(<)(?!*?]|[^+]\\+))\\s*(<)(?!)\n )) |\n ((async\\s*)?(\n ([(]\\s*(([)]\\s*:)|([_$[:alpha:]][_$[:alnum:]]*\\s*:)|(\\.\\.\\.) )) |\n ([<]\\s*[_$[:alpha:]][_$[:alnum:]]*((\\s+extends\\s*[^=>])|(\\s*[,]))) |\n ((<\\s*[_$[:alpha:]\\{\\(]([^<>=]|=[^<]|\\<\\s*[_$[:alpha:]\\{\\(]([^=<>]|=[^<])+\\>)+>\\s*)?\\((\\s*[_$[:alpha:]\\{\\(]([^()]|\\((\\s*[_$[:alpha:]\\{\\(]\\{\\(][^()]*)?\\))*)?\\)(\\s*:\\s*(.)*)?\\s*=>)\n ))\n)))", - "captures": { - "0": { - "name": "meta.object-literal.key.ts" - }, - "1": { - "name": "entity.name.function.ts" - } - } - }, - { - "name": "meta.object.member.ts", - "match": "(?:[_$[:alpha:]][_$[:alnum:]]*)\\s*(?=:)", - "captures": { - "0": { - "name": "meta.object-literal.key.ts" - } - } - }, - { - "name": "meta.object.member.ts", - "begin": "\\.\\.\\.", - "beginCaptures": { - "0": { - "name": "keyword.operator.spread.ts" - } - }, - "end": "(?=,|\\})", - "patterns": [ - { - "include": "#expression" - } - ] - }, - { - "name": "meta.object.member.ts", - "match": "([_$[:alpha:]][_$[:alnum:]]*)\\s*(?=,|\\}|$)", - "captures": { - "1": { - "name": "variable.other.readwrite.ts" - } - } - }, - { - "name": "meta.object.member.ts", - "begin": "(?=[_$[:alpha:]][_$[:alnum:]]*\\s*=)", - "end": "(?=,|\\}|$)", - "patterns": [ - { - "include": "#expression" - } - ] - }, - { - "include": "#object-member-body" - }, - { - "include": "#punctuation-comma" - } - ] - }, - "object-member-body": { - "name": "meta.object.member.ts", - "begin": ":", - "beginCaptures": { - "0": { - "name": "meta.object-literal.key.ts punctuation.separator.key-value.ts" - } - }, - "end": "(?=,|\\})", - "patterns": [ - { - "include": "#expression" - } - ] - }, "expression-operators": { "patterns": [ { @@ -2947,64 +2305,473 @@ "name": "keyword.operator.expression.typeof.ts", "match": "(?)", + "include": "#numeric-literal" + }, + { + "include": "#boolean-literal" + }, + { + "include": "#null-literal" + }, + { + "include": "#undefined-literal" + }, + { + "include": "#numericConstant-literal" + }, + { + "include": "#array-literal" + }, + { + "include": "#this-literal" + }, + { + "include": "#super-literal" + } + ] + }, + "array-literal": { + "name": "meta.array.literal.ts", + "begin": "\\[", + "beginCaptures": { + "0": { + "name": "meta.brace.square.ts" + } + }, + "end": "\\]", + "endCaptures": { + "0": { + "name": "meta.brace.square.ts" + } + }, + "patterns": [ + { + "include": "#expression" + }, + { + "include": "#punctuation-comma" + } + ] + }, + "numeric-literal": { + "patterns": [ + { + "name": "constant.numeric.hex.ts", + "match": "\\b(? is on new line\n (\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n ) |\n (\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends \n ) |\n # arrow function possible to detect only with => on same line\n (\n (<\\s*[_$[:alpha:]\\{\\(]([^<>=]|=[^<]|\\<\\s*[_$[:alpha:]\\{\\(]([^=<>]|=[^<])+\\>)+>\\s*)? # typeparameters\n \\((\\s*[_$[:alpha:]\\{\\(]([^()]|\\((\\s*[_$[:alpha:]\\{\\(]\\{\\(][^()]*)?\\))*)?\\) # parameteres\n (\\s*:\\s*(.)*)? # return type\n \\s*=> # arrow operator\n )\n )\n)", + "match": "(?x)(?=]|=[^<]|\\<\\s*[_$[:alpha:]\\{\\(]([^=<>]|=[^<])+\\>)+>\\s*)?\\()", + "captures": { + "1": { + "name": "punctuation.accessor.ts" + }, + "2": { + "name": "support.constant.dom.ts" + }, + "3": { + "name": "support.variable.property.dom.ts" + } + } + }, + { + "name": "support.class.node.ts", + "match": "(?x)(?)\n )) |\n ((async\\s*)?(\n # sure shot arrow functions even if => is on new line\n(\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*[_$[:alpha:]\\{\\(]([^<>=]|=[^<]|\\<\\s*[_$[:alpha:]\\{\\(]([^=<>]|=[^<])+\\>)+>\\s*)? # typeparameters\n \\((\\s*[_$[:alpha:]\\{\\(]([^()]|\\((\\s*[_$[:alpha:]\\{\\(]\\{\\(][^()]*)?\\))*)?\\) # parameteres\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n))", + "captures": { + "1": { + "name": "punctuation.accessor.ts" + }, + "2": { + "name": "entity.name.function.ts" + } + } + }, + { + "match": "(\\.)\\s*([[:upper:]][_$[:digit:][:upper:]]*)(?![_$[:alnum:]])", + "captures": { + "1": { + "name": "punctuation.accessor.ts" + }, + "2": { + "name": "variable.other.constant.property.ts" + } + } + }, + { + "match": "(\\.)\\s*([_$[:alpha:]][_$[:alnum:]]*)", + "captures": { + "1": { + "name": "punctuation.accessor.ts" + }, + "2": { + "name": "variable.other.property.ts" + } + } + }, + { + "name": "variable.other.constant.ts", + "match": "([[:upper:]][_$[:digit:][:upper:]]*)(?![_$[:alnum:]])" + }, + { + "name": "variable.other.readwrite.ts", + "match": "[_$[:alpha:]][_$[:alnum:]]*" + } + ] + }, + "object-identifiers": { + "patterns": [ + { + "name": "support.class.ts", + "match": "([_$[:alpha:]][_$[:alnum:]]*)(?=\\s*\\.\\s*prototype\\b(?!\\$))" + }, + { + "match": "(?x)(\\.)\\s*(?:\n ([[:upper:]][_$[:digit:][:upper:]]*) |\n ([_$[:alpha:]][_$[:alnum:]]*)\n)(?=\\s*\\.\\s*[_$[:alpha:]][_$[:alnum:]]*)", + "captures": { + "1": { + "name": "punctuation.accessor.ts" + }, + "2": { + "name": "variable.other.constant.object.property.ts" + }, + "3": { + "name": "variable.other.object.property.ts" + } + } + }, + { + "match": "(?x)(?:\n ([[:upper:]][_$[:digit:][:upper:]]*) |\n ([_$[:alpha:]][_$[:alnum:]]*)\n)(?=\\s*\\.\\s*[_$[:alpha:]][_$[:alnum:]]*)", + "captures": { + "1": { + "name": "variable.other.constant.object.ts" + }, + "2": { + "name": "variable.other.object.ts" + } + } + } + ] + }, + "type-annotation": { + "patterns": [ + { + "name": "meta.type.annotation.ts", + "begin": "(:)(?=\\s*\\S)", "beginCaptures": { "1": { - "name": "storage.modifier.async.ts" + "name": "keyword.operator.type.annotation.ts" } }, - "end": "(?==>|\\{|(^\\s*(export|function|class|interface|let|var|const|import|enum|namespace|module|type|abstract|declare)\\s+))", + "end": "(?])|((?<=[\\}>\\]\\)]|[_$[:alpha:]])\\s*(?=\\{)))", "patterns": [ { - "include": "#comment" - }, - { - "include": "#type-parameters" - }, - { - "include": "#function-parameters" - }, - { - "include": "#arrow-return-type" + "include": "#type" } ] }, { - "name": "meta.arrow.ts", - "begin": "=>", + "name": "meta.type.annotation.ts", + "begin": "(:)", "beginCaptures": { - "0": { - "name": "storage.type.function.arrow.ts" + "1": { + "name": "keyword.operator.type.annotation.ts" } }, - "end": "(?<=\\}|\\S)(?)|((?!\\{)(?=\\S))", + "end": "(?])|(?=^\\s*$)|((?<=\\S)(?=\\s*$))|((?<=[\\}>\\]\\)]|[_$[:alpha:]])\\s*(?=\\{)))", "patterns": [ { - "include": "#decl-block" - }, - { - "include": "#expression" + "include": "#type" } ] } ] }, + "return-type": { + "patterns": [ + { + "name": "meta.return.type.ts", + "begin": "(?<=\\))\\s*(:)(?=\\s*\\S)", + "beginCaptures": { + "1": { + "name": "keyword.operator.type.annotation.ts" + } + }, + "end": "(?)", + "endCaptures": { + "1": { + "name": "punctuation.definition.typeparameters.end.ts" + } + }, + "patterns": [ + { + "include": "#comment" + }, + { + "name": "storage.modifier.ts", + "match": "(?)" + }, + { + "include": "#type" + }, + { + "include": "#punctuation-comma" + } + ] }, - "punctuation-semicolon": { - "name": "punctuation.terminator.statement.ts", - "match": ";" + "type": { + "patterns": [ + { + "include": "#comment" + }, + { + "include": "#string" + }, + { + "include": "#numeric-literal" + }, + { + "include": "#type-primitive" + }, + { + "include": "#type-builtin-literals" + }, + { + "include": "#type-parameters" + }, + { + "include": "#type-tuple" + }, + { + "include": "#type-object" + }, + { + "include": "#type-operators" + }, + { + "include": "#type-fn-type-parameters" + }, + { + "include": "#type-paren-or-function-parameters" + }, + { + "include": "#type-function-return-type" + }, + { + "include": "#type-name" + } + ] }, - "punctuation-accessor": { - "name": "punctuation.accessor.ts", - "match": "\\." + "type-primitive": { + "name": "support.type.primitive.ts", + "match": "(?)\n ))\n )\n )\n)", + "end": "(?<=\\))", + "patterns": [ + { + "include": "#function-parameters" + } + ] + } + ] + }, + "type-function-return-type": { + "patterns": [ + { + "name": "meta.type.function.return.ts", + "begin": "(=>)(?=\\s*\\S)", + "beginCaptures": { + "1": { + "name": "storage.type.function.arrow.ts" + } + }, + "end": "(?)(?]|//|$)", + "patterns": [ + { + "include": "#type-function-return-type-core" + } + ] + }, + { + "name": "meta.type.function.return.ts", + "begin": "=>", + "beginCaptures": { + "0": { + "name": "storage.type.function.arrow.ts" + } + }, + "end": "(?)(?]|//|^\\s*$)|((?<=\\S)(?=\\s*$)))", + "patterns": [ + { + "include": "#type-function-return-type-core" + } + ] + } + ] + }, + "type-function-return-type-core": { + "patterns": [ + { + "include": "#comment" + }, + { + "begin": "(?<==>)(?=\\s*\\{)", + "end": "(?<=\\})", + "patterns": [ + { + "include": "#type-object" + } + ] + }, + { + "include": "#type-predicate-operator" + }, + { + "include": "#type" + } + ] + }, + "type-operators": { + "patterns": [ + { + "include": "#typeof-operator" + }, + { + "begin": "([&|])(?=\\s*\\{)", + "beginCaptures": { + "0": { + "name": "keyword.operator.type.ts" + } + }, + "end": "(?<=\\})", + "patterns": [ + { + "include": "#type-object" + } + ] + }, + { + "begin": "[&|]", + "beginCaptures": { + "0": { + "name": "keyword.operator.type.ts" + } + }, + "end": "(?=\\S)" + }, + { + "name": "keyword.operator.expression.keyof.ts", + "match": "(?)\n )) |\n ((async\\s*)?(\n ([(]\\s*(([)]\\s*:)|([_$[:alpha:]][_$[:alnum:]]*\\s*:)|(\\.\\.\\.) )) |\n ([<]\\s*[_$[:alpha:]][_$[:alnum:]]*((\\s+extends\\s*[^=>])|(\\s*[,]))) |\n ((<\\s*[_$[:alpha:]\\{\\(]([^<>=]|=[^<]|\\<\\s*[_$[:alpha:]\\{\\(]([^=<>]|=[^<])+\\>)+>\\s*)?\\((\\s*[_$[:alpha:]\\{\\(]([^()]|\\((\\s*[_$[:alpha:]\\{\\(]\\{\\(][^()]*)?\\))*)?\\)(\\s*:\\s*(.)*)?\\s*=>)\n ))\n )) |\n (:\\s*(\n (<) |\n ([(]\\s*(\n ([)]) |\n (\\.\\.\\.) |\n ([_$[:alnum:]]+\\s*(\n ([:,?=])|\n ([)]\\s*=>)\n ))\n ))\n ))\n)", + "begin": "(?x)([_$[:alpha:]][_$[:alnum:]]*)(?=\\s*\n# function assignment |\n(=\\s*(\n ((async\\s+)?(\n (function\\s*[(<*]) |\n (function\\s+) |\n ([_$[:alpha:]][_$[:alnum:]]*\\s*=>)\n )) |\n ((async\\s*)?(\n # sure shot arrow functions even if => is on new line\n(\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*[_$[:alpha:]\\{\\(]([^<>=]|=[^<]|\\<\\s*[_$[:alpha:]\\{\\(]([^=<>]|=[^<])+\\>)+>\\s*)? # typeparameters\n \\((\\s*[_$[:alpha:]\\{\\(]([^()]|\\((\\s*[_$[:alpha:]\\{\\(]\\{\\(][^()]*)?\\))*)?\\) # parameteres\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)) |\n# typeannotation is fn type: < | () | (... | (param: | (param, | (param? | (param= | (param) =>\n(:\\s*(\n (<) |\n ([(]\\s*(\n ([)]) |\n (\\.\\.\\.) |\n ([_$[:alnum:]]+\\s*(\n ([:,?=])|\n ([)]\\s*=>)\n ))\n ))\n)))", "beginCaptures": { "1": { "name": "meta.definition.variable.tsx entity.name.function.tsx" @@ -346,192 +498,342 @@ } ] }, - "ternary-expression": { - "begin": "(\\?)", - "beginCaptures": { - "0": { - "name": "keyword.operator.ternary.tsx" - } - }, - "end": "(:)", - "endCaptures": { - "0": { - "name": "keyword.operator.ternary.tsx" - } - }, + "parameter-name": { "patterns": [ { - "include": "#expression" + "match": "\\s*\\b(public|protected|private|readonly)(?=\\s+(public|protected|private|readonly)\\s+)", + "captures": { + "1": { + "name": "storage.modifier.tsx" + } + } + }, + { + "match": "(?x)(?:\\s*\\b(public|private|protected|readonly)\\s+)?(\\.\\.\\.)?\\s*(?)\n )) |\n ((async\\s*)?(\n # sure shot arrow functions even if => is on new line\n(\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*[_$[:alpha:]\\{\\(]([^<>=]|=[^<]|\\<\\s*[_$[:alpha:]\\{\\(]([^=<>]|=[^<])+\\>)+>\\s*)? # typeparameters\n \\((\\s*[_$[:alpha:]\\{\\(]([^()]|\\((\\s*[_$[:alpha:]\\{\\(]\\{\\(][^()]*)?\\))*)?\\) # parameteres\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)) |\n# typeannotation is fn type: < | () | (... | (param: | (param, | (param? | (param= | (param) =>\n(:\\s*(\n (<) |\n ([(]\\s*(\n ([)]) |\n (\\.\\.\\.) |\n ([_$[:alnum:]]+\\s*(\n ([:,?=])|\n ([)]\\s*=>)\n ))\n ))\n)))", + "captures": { + "1": { + "name": "storage.modifier.tsx" + }, + "2": { + "name": "keyword.operator.rest.tsx" + }, + "3": { + "name": "entity.name.function.tsx variable.language.this.tsx" + }, + "4": { + "name": "entity.name.function.tsx" + }, + "5": { + "name": "keyword.operator.optional.tsx" + } + } + }, + { + "match": "(?:\\s*\\b(public|private|protected|readonly)\\s+)?(\\.\\.\\.)?\\s*(?)\n )) |\n ((async\\s*)?(\n # sure shot arrow functions even if => is on new line\n(\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*[_$[:alpha:]\\{\\(]([^<>=]|=[^<]|\\<\\s*[_$[:alpha:]\\{\\(]([^=<>]|=[^<])+\\>)+>\\s*)? # typeparameters\n \\((\\s*[_$[:alpha:]\\{\\(]([^()]|\\((\\s*[_$[:alpha:]\\{\\(]\\{\\(][^()]*)?\\))*)?\\) # parameteres\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)) |\n# typeannotation is fn type: < | () | (... | (param: | (param, | (param? | (param= | (param) =>\n(:\\s*(\n (<) |\n ([(]\\s*(\n ([)]) |\n (\\.\\.\\.) |\n ([_$[:alnum:]]+\\s*(\n ([:,?=])|\n ([)]\\s*=>)\n ))\n ))\n)))" + }, + { + "name": "meta.definition.property.tsx variable.object.property.tsx", + "match": "[_$[:alpha:]][_$[:alnum:]]*" + }, + { + "name": "keyword.operator.optional.tsx", + "match": "\\?" + } + ] + } + ] + }, + "variable-initializer": { + "patterns": [ + { + "begin": "(?)", + "captures": { + "1": { + "name": "storage.modifier.async.tsx" + }, + "2": { + "name": "variable.parameter.tsx" + } + } + }, + { + "name": "meta.arrow.tsx", + "begin": "(?x) (?:\n (? is on new line\n(\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*[_$[:alpha:]\\{\\(]([^<>=]|=[^<]|\\<\\s*[_$[:alpha:]\\{\\(]([^=<>]|=[^<])+\\>)+>\\s*)? # typeparameters\n \\((\\s*[_$[:alpha:]\\{\\(]([^()]|\\((\\s*[_$[:alpha:]\\{\\(]\\{\\(][^()]*)?\\))*)?\\) # parameteres\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n )\n)", + "beginCaptures": { + "1": { + "name": "storage.modifier.async.tsx" + } + }, + "end": "(?==>|\\{|(^\\s*(export|function|class|interface|let|var|const|import|enum|namespace|module|type|abstract|declare)\\s+))", + "patterns": [ + { + "include": "#comment" + }, + { + "include": "#type-parameters" + }, + { + "include": "#function-parameters" + }, + { + "include": "#arrow-return-type" + } + ] + }, + { + "name": "meta.arrow.tsx", + "begin": "=>", + "beginCaptures": { + "0": { + "name": "storage.type.function.arrow.tsx" + } + }, + "end": "(?<=\\}|\\S)(?)|((?!\\{)(?=\\S))", + "patterns": [ + { + "include": "#decl-block" + }, + { + "include": "#expression" + } + ] + } + ] + }, + "indexer-declaration": { + "name": "meta.indexer.declaration.tsx", + "begin": "(?:(?)\n )) |\n ((async\\s*)?(\n ([(]\\s*(([)]\\s*:)|([_$[:alpha:]][_$[:alnum:]]*\\s*:)|(\\.\\.\\.) )) |\n ([<]\\s*[_$[:alpha:]][_$[:alnum:]]*((\\s+extends\\s*[^=>])|(\\s*[,]))) |\n ((<\\s*[_$[:alpha:]\\{\\(]([^<>=]|=[^<]|\\<\\s*[_$[:alpha:]\\{\\(]([^=<>]|=[^<])+\\>)+>\\s*)?\\((\\s*[_$[:alpha:]\\{\\(]([^()]|\\((\\s*[_$[:alpha:]\\{\\(]\\{\\(][^()]*)?\\))*)?\\)(\\s*:\\s*(.)*)?\\s*=>)\n ))\n )) |\n (:\\s*(\n (<) |\n ([(]\\s*(\n ([)]) |\n (\\.\\.\\.) |\n ([_$[:alnum:]]+\\s*(\n ([:,?=])|\n ([)]\\s*=>)\n ))\n ))\n ))\n)" - }, - { - "name": "meta.definition.property.tsx variable.object.property.tsx", - "match": "[_$[:alpha:]][_$[:alnum:]]*" - }, - { - "name": "keyword.operator.optional.tsx", - "match": "\\?" - } - ] - } - ] - }, - "method-declaration": { - "patterns": [ - { - "name": "meta.method.declaration.tsx", - "begin": "(?)\n )) |\n ((async\\s*)?(\n ([(]\\s*(([)]\\s*:)|([_$[:alpha:]][_$[:alnum:]]*\\s*:)|(\\.\\.\\.) )) |\n ([<]\\s*[_$[:alpha:]][_$[:alnum:]]*((\\s+extends\\s*[^=>])|(\\s*[,]))) |\n ((<\\s*[_$[:alpha:]\\{\\(]([^<>=]|=[^<]|\\<\\s*[_$[:alpha:]\\{\\(]([^=<>]|=[^<])+\\>)+>\\s*)?\\((\\s*[_$[:alpha:]\\{\\(]([^()]|\\((\\s*[_$[:alpha:]\\{\\(]\\{\\(][^()]*)?\\))*)?\\)(\\s*:\\s*(.)*)?\\s*=>)\n ))\n )) |\n (:\\s*(\n (<) |\n ([(]\\s*(\n ([)]) |\n (\\.\\.\\.) |\n ([_$[:alnum:]]+\\s*(\n ([:,?=])|\n ([)]\\s*=>)\n ))\n ))\n ))\n)", - "captures": { - "1": { - "name": "storage.modifier.tsx" - }, - "2": { - "name": "keyword.operator.rest.tsx" - }, - "3": { - "name": "entity.name.function.tsx variable.language.this.tsx" - }, - "4": { - "name": "entity.name.function.tsx" - }, - "5": { - "name": "keyword.operator.optional.tsx" - } - } - }, - { - "match": "(?:\\s*\\b(public|private|protected|readonly)\\s+)?(\\.\\.\\.)?\\s*(?])|((?<=[\\}>\\]\\)]|[_$[:alpha:]])\\s*(?=\\{)))", - "patterns": [ - { - "include": "#type" - } - ] - }, - { - "name": "meta.type.annotation.tsx", - "begin": "(:)", - "beginCaptures": { - "1": { - "name": "keyword.operator.type.annotation.tsx" - } - }, - "end": "(?])|(?=^\\s*$)|((?<=\\S)(?=\\s*$))|((?<=[\\}>\\]\\)]|[_$[:alpha:]])\\s*(?=\\{)))", - "patterns": [ - { - "include": "#type" - } - ] - } - ] - }, - "type": { - "patterns": [ - { - "include": "#comment" - }, - { - "include": "#string" - }, - { - "include": "#numeric-literal" - }, - { - "include": "#type-primitive" - }, - { - "include": "#type-builtin-literals" - }, - { - "include": "#type-parameters" - }, - { - "include": "#type-tuple" - }, - { - "include": "#type-object" - }, - { - "include": "#type-operators" - }, - { - "include": "#type-fn-type-parameters" - }, - { - "include": "#type-paren-or-function-parameters" - }, - { - "include": "#type-function-return-type" - }, - { - "include": "#type-name" - } - ] - }, - "function-parameters": { - "name": "meta.parameters.tsx", - "begin": "\\(", - "beginCaptures": { - "0": { - "name": "punctuation.definition.parameters.begin.tsx" - } - }, - "end": "\\)", - "endCaptures": { - "0": { - "name": "punctuation.definition.parameters.end.tsx" - } - }, - "patterns": [ - { - "include": "#comment" - }, - { - "include": "#decorator" - }, - { - "include": "#destructuring-parameter" - }, - { - "include": "#parameter-name" - }, - { - "include": "#type-annotation" - }, - { - "include": "#variable-initializer" - }, - { - "name": "punctuation.separator.parameter.tsx", - "match": "," - } - ] - }, - "type-primitive": { - "name": "support.type.primitive.tsx", - "match": "(?)\n ))\n )\n )\n)", - "end": "(?<=\\))", - "patterns": [ - { - "include": "#function-parameters" - } - ] - } - ] - }, - "type-operators": { - "patterns": [ - { - "include": "#typeof-operator" - }, - { - "begin": "([&|])(?=\\s*\\{)", - "beginCaptures": { - "0": { - "name": "keyword.operator.type.tsx" - } - }, - "end": "(?<=\\})", - "patterns": [ - { - "include": "#type-object" - } - ] - }, - { - "begin": "[&|]", - "beginCaptures": { - "0": { - "name": "keyword.operator.type.tsx" - } - }, - "end": "(?=\\S)" - }, - { - "name": "keyword.operator.expression.keyof.tsx", - "match": "(?)(?=\\s*\\S)", - "beginCaptures": { - "1": { - "name": "storage.type.function.arrow.tsx" - } - }, - "end": "(?)(?]|//|$)", - "patterns": [ - { - "include": "#type-function-return-type-core" - } - ] - }, - { - "name": "meta.type.function.return.tsx", - "begin": "=>", - "beginCaptures": { - "0": { - "name": "storage.type.function.arrow.tsx" - } - }, - "end": "(?)(?]|//|^\\s*$)|((?<=\\S)(?=\\s*$)))", - "patterns": [ - { - "include": "#type-function-return-type-core" - } - ] - } - ] - }, - "type-function-return-type-core": { - "patterns": [ - { - "include": "#comment" - }, - { - "begin": "(?<==>)(?=\\s*\\{)", - "end": "(?<=\\})", - "patterns": [ - { - "include": "#type-object" - } - ] - }, - { - "include": "#type-predicate-operator" - }, - { - "include": "#type" - } - ] - }, - "type-tuple": { - "name": "meta.type.tuple.tsx", - "begin": "\\[", - "beginCaptures": { - "0": { - "name": "meta.brace.square.tsx" - } - }, - "end": "\\]", - "endCaptures": { - "0": { - "name": "meta.brace.square.tsx" - } - }, - "patterns": [ - { - "include": "#type" - }, - { - "include": "#punctuation-comma" - } - ] - }, - "type-name": { - "patterns": [ - { - "match": "([_$[:alpha:]][_$[:alnum:]]*)\\s*(\\.)", - "captures": { - "1": { - "name": "entity.name.type.module.tsx" - }, - "2": { - "name": "punctuation.accessor.tsx" - } - } - }, - { - "name": "entity.name.type.tsx", - "match": "[_$[:alpha:]][_$[:alnum:]]*" - } - ] - }, - "type-parameters": { - "name": "meta.type.parameters.tsx", - "begin": "(<)", - "beginCaptures": { - "1": { - "name": "punctuation.definition.typeparameters.begin.tsx" - } - }, - "end": "(>)", - "endCaptures": { - "1": { - "name": "punctuation.definition.typeparameters.end.tsx" - } - }, - "patterns": [ - { - "include": "#comment" - }, - { - "name": "storage.modifier.tsx", - "match": "(?)" - }, - { - "include": "#type" - }, - { - "include": "#punctuation-comma" - } - ] - }, - "variable-initializer": { - "patterns": [ - { - "begin": "(?)\n )) |\n ((async\\s*)?(\n # sure shot arrow functions even if => is on new line\n(\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*[_$[:alpha:]\\{\\(]([^<>=]|=[^<]|\\<\\s*[_$[:alpha:]\\{\\(]([^=<>]|=[^<])+\\>)+>\\s*)? # typeparameters\n \\((\\s*[_$[:alpha:]\\{\\(]([^()]|\\((\\s*[_$[:alpha:]\\{\\(]\\{\\(][^()]*)?\\))*)?\\) # parameteres\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)))", "captures": { + "0": { + "name": "meta.object-literal.key.tsx" + }, "1": { - "name": "support.class.console.tsx" - }, - "2": { - "name": "punctuation.accessor.tsx" - }, - "3": { - "name": "support.function.console.tsx" + "name": "entity.name.function.tsx" } } }, { - "match": "(?=]|=[^<]|\\<\\s*[_$[:alpha:]\\{\\(]([^=<>]|=[^<])+\\>)+>\\s*)?\\()", - "captures": { - "1": { - "name": "punctuation.accessor.tsx" - }, - "2": { - "name": "support.constant.dom.tsx" - }, - "3": { - "name": "support.variable.property.dom.tsx" + "name": "meta.object.member.tsx", + "begin": ":", + "beginCaptures": { + "0": { + "name": "meta.object-literal.key.tsx punctuation.separator.key-value.tsx" } - } - }, - { - "name": "support.class.node.tsx", - "match": "(?x)(?)\n )) |\n ((async\\s*)?(\n ([(]\\s*(([)]\\s*:)|([_$[:alpha:]][_$[:alnum:]]*\\s*:)|(\\.\\.\\.) )) |\n ([<]\\s*[_$[:alpha:]][_$[:alnum:]]*((\\s+extends\\s*[^=>])|(\\s*[,]))) |\n ((<\\s*[_$[:alpha:]\\{\\(]([^<>=]|=[^<]|\\<\\s*[_$[:alpha:]\\{\\(]([^=<>]|=[^<])+\\>)+>\\s*)?\\((\\s*[_$[:alpha:]\\{\\(]([^()]|\\((\\s*[_$[:alpha:]\\{\\(]\\{\\(][^()]*)?\\))*)?\\)(\\s*:\\s*(.)*)?\\s*=>)\n ))\n))", - "captures": { - "1": { - "name": "punctuation.accessor.tsx" - }, - "2": { - "name": "entity.name.function.tsx" - } - } - }, - { - "match": "(\\.)\\s*([[:upper:]][_$[:digit:][:upper:]]*)(?![_$[:alnum:]])", - "captures": { - "1": { - "name": "punctuation.accessor.tsx" - }, - "2": { - "name": "variable.other.constant.property.tsx" - } - } - }, - { - "match": "(\\.)\\s*([_$[:alpha:]][_$[:alnum:]]*)", - "captures": { - "1": { - "name": "punctuation.accessor.tsx" - }, - "2": { - "name": "variable.other.property.tsx" - } - } - }, - { - "name": "variable.other.constant.tsx", - "match": "([[:upper:]][_$[:digit:][:upper:]]*)(?![_$[:alnum:]])" - }, - { - "name": "variable.other.readwrite.tsx", - "match": "[_$[:alpha:]][_$[:alnum:]]*" - } - ] - }, - "object-identifiers": { - "patterns": [ - { - "name": "support.class.tsx", - "match": "([_$[:alpha:]][_$[:alnum:]]*)(?=\\s*\\.\\s*prototype\\b(?!\\$))" - }, - { - "match": "(?x)(\\.)\\s*(?:\n ([[:upper:]][_$[:digit:][:upper:]]*) |\n ([_$[:alpha:]][_$[:alnum:]]*)\n)(?=\\s*\\.\\s*[_$[:alpha:]][_$[:alnum:]]*)", - "captures": { - "1": { - "name": "punctuation.accessor.tsx" - }, - "2": { - "name": "variable.other.constant.object.property.tsx" - }, - "3": { - "name": "variable.other.object.property.tsx" - } - } - }, - { - "match": "(?x)(?:\n ([[:upper:]][_$[:digit:][:upper:]]*) |\n ([_$[:alpha:]][_$[:alnum:]]*)\n)(?=\\s*\\.\\s*[_$[:alpha:]][_$[:alnum:]]*)", - "captures": { - "1": { - "name": "variable.other.constant.object.tsx" - }, - "2": { - "name": "variable.other.object.tsx" - } - } - } - ] - }, - "cast": { - "patterns": [ - { - "include": "#jsx" - } - ] - }, "new-expr": { "name": "new.expr.tsx", "begin": "(?)\n )) |\n ((async\\s*)?(\n ([(]\\s*(([)]\\s*:)|([_$[:alpha:]][_$[:alnum:]]*\\s*:)|(\\.\\.\\.) )) |\n ([<]\\s*[_$[:alpha:]][_$[:alnum:]]*((\\s+extends\\s*[^=>])|(\\s*[,]))) |\n ((<\\s*[_$[:alpha:]\\{\\(]([^<>=]|=[^<]|\\<\\s*[_$[:alpha:]\\{\\(]([^=<>]|=[^<])+\\>)+>\\s*)?\\((\\s*[_$[:alpha:]\\{\\(]([^()]|\\((\\s*[_$[:alpha:]\\{\\(]\\{\\(][^()]*)?\\))*)?\\)(\\s*:\\s*(.)*)?\\s*=>)\n ))\n)))", - "captures": { - "0": { - "name": "meta.object-literal.key.tsx" - }, - "1": { - "name": "entity.name.function.tsx" - } - } - }, - { - "name": "meta.object.member.tsx", - "match": "(?:[_$[:alpha:]][_$[:alnum:]]*)\\s*(?=:)", - "captures": { - "0": { - "name": "meta.object-literal.key.tsx" - } - } - }, - { - "name": "meta.object.member.tsx", - "begin": "\\.\\.\\.", - "beginCaptures": { - "0": { - "name": "keyword.operator.spread.tsx" - } - }, - "end": "(?=,|\\})", - "patterns": [ - { - "include": "#expression" - } - ] - }, - { - "name": "meta.object.member.tsx", - "match": "([_$[:alpha:]][_$[:alnum:]]*)\\s*(?=,|\\}|$)", - "captures": { - "1": { - "name": "variable.other.readwrite.tsx" - } - } - }, - { - "name": "meta.object.member.tsx", - "begin": "(?=[_$[:alpha:]][_$[:alnum:]]*\\s*=)", - "end": "(?=,|\\}|$)", - "patterns": [ - { - "include": "#expression" - } - ] - }, - { - "include": "#object-member-body" + "include": "#expression" }, { "include": "#punctuation-comma" } ] }, - "object-member-body": { - "name": "meta.object.member.tsx", - "begin": ":", - "beginCaptures": { - "0": { - "name": "meta.object-literal.key.tsx punctuation.separator.key-value.tsx" - } - }, - "end": "(?=,|\\})", + "cast": { "patterns": [ { - "include": "#expression" + "include": "#jsx" } ] }, @@ -2913,64 +2271,473 @@ "name": "keyword.operator.expression.typeof.tsx", "match": "(?)", + "include": "#numeric-literal" + }, + { + "include": "#boolean-literal" + }, + { + "include": "#null-literal" + }, + { + "include": "#undefined-literal" + }, + { + "include": "#numericConstant-literal" + }, + { + "include": "#array-literal" + }, + { + "include": "#this-literal" + }, + { + "include": "#super-literal" + } + ] + }, + "array-literal": { + "name": "meta.array.literal.tsx", + "begin": "\\[", + "beginCaptures": { + "0": { + "name": "meta.brace.square.tsx" + } + }, + "end": "\\]", + "endCaptures": { + "0": { + "name": "meta.brace.square.tsx" + } + }, + "patterns": [ + { + "include": "#expression" + }, + { + "include": "#punctuation-comma" + } + ] + }, + "numeric-literal": { + "patterns": [ + { + "name": "constant.numeric.hex.tsx", + "match": "\\b(? is on new line\n (\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n ) |\n (\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends \n ) |\n # arrow function possible to detect only with => on same line\n (\n (<\\s*[_$[:alpha:]\\{\\(]([^<>=]|=[^<]|\\<\\s*[_$[:alpha:]\\{\\(]([^=<>]|=[^<])+\\>)+>\\s*)? # typeparameters\n \\((\\s*[_$[:alpha:]\\{\\(]([^()]|\\((\\s*[_$[:alpha:]\\{\\(]\\{\\(][^()]*)?\\))*)?\\) # parameteres\n (\\s*:\\s*(.)*)? # return type\n \\s*=> # arrow operator\n )\n )\n)", + "match": "(?x)(?=]|=[^<]|\\<\\s*[_$[:alpha:]\\{\\(]([^=<>]|=[^<])+\\>)+>\\s*)?\\()", + "captures": { + "1": { + "name": "punctuation.accessor.tsx" + }, + "2": { + "name": "support.constant.dom.tsx" + }, + "3": { + "name": "support.variable.property.dom.tsx" + } + } + }, + { + "name": "support.class.node.tsx", + "match": "(?x)(?)\n )) |\n ((async\\s*)?(\n # sure shot arrow functions even if => is on new line\n(\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*[_$[:alpha:]\\{\\(]([^<>=]|=[^<]|\\<\\s*[_$[:alpha:]\\{\\(]([^=<>]|=[^<])+\\>)+>\\s*)? # typeparameters\n \\((\\s*[_$[:alpha:]\\{\\(]([^()]|\\((\\s*[_$[:alpha:]\\{\\(]\\{\\(][^()]*)?\\))*)?\\) # parameteres\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n))", + "captures": { + "1": { + "name": "punctuation.accessor.tsx" + }, + "2": { + "name": "entity.name.function.tsx" + } + } + }, + { + "match": "(\\.)\\s*([[:upper:]][_$[:digit:][:upper:]]*)(?![_$[:alnum:]])", + "captures": { + "1": { + "name": "punctuation.accessor.tsx" + }, + "2": { + "name": "variable.other.constant.property.tsx" + } + } + }, + { + "match": "(\\.)\\s*([_$[:alpha:]][_$[:alnum:]]*)", + "captures": { + "1": { + "name": "punctuation.accessor.tsx" + }, + "2": { + "name": "variable.other.property.tsx" + } + } + }, + { + "name": "variable.other.constant.tsx", + "match": "([[:upper:]][_$[:digit:][:upper:]]*)(?![_$[:alnum:]])" + }, + { + "name": "variable.other.readwrite.tsx", + "match": "[_$[:alpha:]][_$[:alnum:]]*" + } + ] + }, + "object-identifiers": { + "patterns": [ + { + "name": "support.class.tsx", + "match": "([_$[:alpha:]][_$[:alnum:]]*)(?=\\s*\\.\\s*prototype\\b(?!\\$))" + }, + { + "match": "(?x)(\\.)\\s*(?:\n ([[:upper:]][_$[:digit:][:upper:]]*) |\n ([_$[:alpha:]][_$[:alnum:]]*)\n)(?=\\s*\\.\\s*[_$[:alpha:]][_$[:alnum:]]*)", + "captures": { + "1": { + "name": "punctuation.accessor.tsx" + }, + "2": { + "name": "variable.other.constant.object.property.tsx" + }, + "3": { + "name": "variable.other.object.property.tsx" + } + } + }, + { + "match": "(?x)(?:\n ([[:upper:]][_$[:digit:][:upper:]]*) |\n ([_$[:alpha:]][_$[:alnum:]]*)\n)(?=\\s*\\.\\s*[_$[:alpha:]][_$[:alnum:]]*)", + "captures": { + "1": { + "name": "variable.other.constant.object.tsx" + }, + "2": { + "name": "variable.other.object.tsx" + } + } + } + ] + }, + "type-annotation": { + "patterns": [ + { + "name": "meta.type.annotation.tsx", + "begin": "(:)(?=\\s*\\S)", "beginCaptures": { "1": { - "name": "storage.modifier.async.tsx" + "name": "keyword.operator.type.annotation.tsx" } }, - "end": "(?==>|\\{|(^\\s*(export|function|class|interface|let|var|const|import|enum|namespace|module|type|abstract|declare)\\s+))", + "end": "(?])|((?<=[\\}>\\]\\)]|[_$[:alpha:]])\\s*(?=\\{)))", "patterns": [ { - "include": "#comment" - }, - { - "include": "#type-parameters" - }, - { - "include": "#function-parameters" - }, - { - "include": "#arrow-return-type" + "include": "#type" } ] }, { - "name": "meta.arrow.tsx", - "begin": "=>", + "name": "meta.type.annotation.tsx", + "begin": "(:)", "beginCaptures": { - "0": { - "name": "storage.type.function.arrow.tsx" + "1": { + "name": "keyword.operator.type.annotation.tsx" } }, - "end": "(?<=\\}|\\S)(?)|((?!\\{)(?=\\S))", + "end": "(?])|(?=^\\s*$)|((?<=\\S)(?=\\s*$))|((?<=[\\}>\\]\\)]|[_$[:alpha:]])\\s*(?=\\{)))", "patterns": [ { - "include": "#decl-block" - }, - { - "include": "#expression" + "include": "#type" } ] } ] }, + "return-type": { + "patterns": [ + { + "name": "meta.return.type.tsx", + "begin": "(?<=\\))\\s*(:)(?=\\s*\\S)", + "beginCaptures": { + "1": { + "name": "keyword.operator.type.annotation.tsx" + } + }, + "end": "(?)", + "endCaptures": { + "1": { + "name": "punctuation.definition.typeparameters.end.tsx" + } + }, + "patterns": [ + { + "include": "#comment" + }, + { + "name": "storage.modifier.tsx", + "match": "(?)" + }, + { + "include": "#type" + }, + { + "include": "#punctuation-comma" + } + ] }, - "punctuation-semicolon": { - "name": "punctuation.terminator.statement.tsx", - "match": ";" + "type": { + "patterns": [ + { + "include": "#comment" + }, + { + "include": "#string" + }, + { + "include": "#numeric-literal" + }, + { + "include": "#type-primitive" + }, + { + "include": "#type-builtin-literals" + }, + { + "include": "#type-parameters" + }, + { + "include": "#type-tuple" + }, + { + "include": "#type-object" + }, + { + "include": "#type-operators" + }, + { + "include": "#type-fn-type-parameters" + }, + { + "include": "#type-paren-or-function-parameters" + }, + { + "include": "#type-function-return-type" + }, + { + "include": "#type-name" + } + ] }, - "punctuation-accessor": { - "name": "punctuation.accessor.tsx", - "match": "\\." + "type-primitive": { + "name": "support.type.primitive.tsx", + "match": "(?)\n ))\n )\n )\n)", + "end": "(?<=\\))", + "patterns": [ + { + "include": "#function-parameters" + } + ] + } + ] + }, + "type-function-return-type": { + "patterns": [ + { + "name": "meta.type.function.return.tsx", + "begin": "(=>)(?=\\s*\\S)", + "beginCaptures": { + "1": { + "name": "storage.type.function.arrow.tsx" + } + }, + "end": "(?)(?]|//|$)", + "patterns": [ + { + "include": "#type-function-return-type-core" + } + ] + }, + { + "name": "meta.type.function.return.tsx", + "begin": "=>", + "beginCaptures": { + "0": { + "name": "storage.type.function.arrow.tsx" + } + }, + "end": "(?)(?]|//|^\\s*$)|((?<=\\S)(?=\\s*$)))", + "patterns": [ + { + "include": "#type-function-return-type-core" + } + ] + } + ] + }, + "type-function-return-type-core": { + "patterns": [ + { + "include": "#comment" + }, + { + "begin": "(?<==>)(?=\\s*\\{)", + "end": "(?<=\\})", + "patterns": [ + { + "include": "#type-object" + } + ] + }, + { + "include": "#type-predicate-operator" + }, + { + "include": "#type" + } + ] + }, + "type-operators": { + "patterns": [ + { + "include": "#typeof-operator" + }, + { + "begin": "([&|])(?=\\s*\\{)", + "beginCaptures": { + "0": { + "name": "keyword.operator.type.tsx" + } + }, + "end": "(?<=\\})", + "patterns": [ + { + "include": "#type-object" + } + ] + }, + { + "begin": "[&|]", + "beginCaptures": { + "0": { + "name": "keyword.operator.type.tsx" + } + }, + "end": "(?=\\S)" + }, + { + "name": "keyword.operator.expression.keyof.tsx", + "match": "(?|/\\*|//)", - "captures": { - "1": { - "name": "entity.other.attribute-name.tsx" - } - } - }, - "jsx-tag-attribute-assignment": { - "name": "keyword.operator.assignment.tsx", - "match": "=(?=\\s*(?:'|\"|{|/\\*|//|\\n))" - }, - "jsx-string-double-quoted": { - "name": "string.quoted.double.tsx", - "begin": "\"", - "end": "\"", - "beginCaptures": { - "0": { - "name": "punctuation.definition.string.begin.tsx" - } - }, - "endCaptures": { - "0": { - "name": "punctuation.definition.string.end.tsx" - } - }, - "patterns": [ - { - "include": "#jsx-entities" - } - ] - }, - "jsx-string-single-quoted": { - "name": "string.quoted.single.tsx", - "begin": "'", - "end": "'", - "beginCaptures": { - "0": { - "name": "punctuation.definition.string.begin.tsx" - } - }, - "endCaptures": { - "0": { - "name": "punctuation.definition.string.end.tsx" - } - }, - "patterns": [ - { - "include": "#jsx-entities" - } - ] - }, - "jsx-entities": { - "patterns": [ - { - "name": "constant.character.entity.tsx", - "match": "(&)([a-zA-Z0-9]+|#[0-9]+|#x[0-9a-fA-F]+)(;)", - "captures": { - "1": { - "name": "punctuation.definition.entity.tsx" - }, - "3": { - "name": "punctuation.definition.entity.tsx" - } - } - }, - { - "name": "invalid.illegal.bad-ampersand.tsx", - "match": "&" - } - ] - }, - "jsx-evaluated-code": { - "name": "meta.embedded.expression.tsx", - "begin": "\\{", - "end": "\\}", - "beginCaptures": { - "0": { - "name": "punctuation.section.embedded.begin.tsx" - } - }, - "endCaptures": { - "0": { - "name": "punctuation.section.embedded.end.tsx" - } - }, - "patterns": [ - { - "include": "#expression" - } - ] - }, - "jsx-tag-attributes-illegal": { - "name": "invalid.illegal.attribute.tsx", - "match": "\\S+" - }, "jsx-tag-without-attributes-in-expression": { "begin": "(?x)\n (?<=[({\\[,?=>:*]|&&|\\|\\||\\?|\\Wreturn|^return|\\Wdefault|^)\\s*\n (?=(<)\\s*((?:[a-z][a-z0-9]*|([_$a-zA-Z][-$\\w.]*))(?))", "end": "(?!\\s*(<)\\s*((?:[a-z][a-z0-9]*|([_$a-zA-Z][-$\\w.]*))(?))", @@ -4311,18 +4153,120 @@ } ] }, - "jsx": { + "jsx-evaluated-code": { + "name": "meta.embedded.expression.tsx", + "begin": "\\{", + "end": "\\}", + "beginCaptures": { + "0": { + "name": "punctuation.section.embedded.begin.tsx" + } + }, + "endCaptures": { + "0": { + "name": "punctuation.section.embedded.end.tsx" + } + }, "patterns": [ { - "include": "#jsx-tag-without-attributes-in-expression" - }, - { - "include": "#jsx-tag-in-expression" - }, - { - "include": "#jsx-tag-invalid" + "include": "#expression" } ] + }, + "jsx-entities": { + "patterns": [ + { + "name": "constant.character.entity.tsx", + "match": "(&)([a-zA-Z0-9]+|#[0-9]+|#x[0-9a-fA-F]+)(;)", + "captures": { + "1": { + "name": "punctuation.definition.entity.tsx" + }, + "3": { + "name": "punctuation.definition.entity.tsx" + } + } + }, + { + "name": "invalid.illegal.bad-ampersand.tsx", + "match": "&" + } + ] + }, + "jsx-tag-attributes": { + "patterns": [ + { + "include": "#jsx-tag-attribute-name" + }, + { + "include": "#jsx-tag-attribute-assignment" + }, + { + "include": "#jsx-string-double-quoted" + }, + { + "include": "#jsx-string-single-quoted" + }, + { + "include": "#jsx-evaluated-code" + } + ] + }, + "jsx-tag-attribute-name": { + "match": "(?x)\n \\s*\n ([_$a-zA-Z][-$\\w]*)\n (?=\\s|=|/?>|/\\*|//)", + "captures": { + "1": { + "name": "entity.other.attribute-name.tsx" + } + } + }, + "jsx-tag-attribute-assignment": { + "name": "keyword.operator.assignment.tsx", + "match": "=(?=\\s*(?:'|\"|{|/\\*|//|\\n))" + }, + "jsx-string-double-quoted": { + "name": "string.quoted.double.tsx", + "begin": "\"", + "end": "\"", + "beginCaptures": { + "0": { + "name": "punctuation.definition.string.begin.tsx" + } + }, + "endCaptures": { + "0": { + "name": "punctuation.definition.string.end.tsx" + } + }, + "patterns": [ + { + "include": "#jsx-entities" + } + ] + }, + "jsx-string-single-quoted": { + "name": "string.quoted.single.tsx", + "begin": "'", + "end": "'", + "beginCaptures": { + "0": { + "name": "punctuation.definition.string.begin.tsx" + } + }, + "endCaptures": { + "0": { + "name": "punctuation.definition.string.end.tsx" + } + }, + "patterns": [ + { + "include": "#jsx-entities" + } + ] + }, + "jsx-tag-attributes-illegal": { + "name": "invalid.illegal.attribute.tsx", + "match": "\\S+" } } } \ No newline at end of file From d95f9a43c4c422f11ed4c19f1c599343939e92bf Mon Sep 17 00:00:00 2001 From: "Yemi Bedu @ P&R" Date: Mon, 9 Oct 2017 12:08:11 -0400 Subject: [PATCH 087/158] expand editor code region styles Expand editor code region styles. Allow a space after the leading comment indicator. Allow both single line and block comments. Examples: // #region name (* region name *) --- extensions/fsharp/language-configuration.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/extensions/fsharp/language-configuration.json b/extensions/fsharp/language-configuration.json index 9d684e6f9d9..9cdb97d7912 100644 --- a/extensions/fsharp/language-configuration.json +++ b/extensions/fsharp/language-configuration.json @@ -24,8 +24,8 @@ "folding": { "offSide": true, "markers": { - "start": "^\\s*//#region", - "end": "^\\s*//#endregion" + "start": "^\\s*//\\s*#region|^\\s*\\(\\*\\s*#region(.*)\\*\\)", + "end": "^\\s*//\\s*#endregion|^\\s*\\(\\*\\s*#endregion\\s*\\*\\)" } } } From 0bd33bbd965b9093b92a1188c1ea305efe1b2443 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Mon, 9 Oct 2017 11:21:00 -0700 Subject: [PATCH 088/158] Use strict versions for @types. Fixes #35561 --- build/monaco/package.json | 8 ++++---- build/package.json | 12 ++++++------ extensions/javascript/package.json | 2 +- extensions/markdown/package.json | 4 ++-- extensions/merge-conflict/package.json | 2 +- extensions/typescript/package.json | 4 ++-- package.json | 12 ++++++------ test/smoke/package.json | 14 +++++++------- 8 files changed, 29 insertions(+), 29 deletions(-) diff --git a/build/monaco/package.json b/build/monaco/package.json index 4cc3beb09b8..db28b0b9287 100644 --- a/build/monaco/package.json +++ b/build/monaco/package.json @@ -13,10 +13,10 @@ "url": "https://github.com/Microsoft/vscode/issues" }, "devDependencies": { - "@types/minimist": "^1.2.0", - "@types/mocha": "^2.2.39", - "@types/semver": "^5.3.30", - "@types/sinon": "^1.16.34", + "@types/minimist": "1.2.0", + "@types/mocha": "2.2.39", + "@types/semver": "5.3.30", + "@types/sinon": "1.16.34", "debounce": "^1.0.0", "eslint": "^3.4.0", "event-stream": "^3.1.7", diff --git a/build/package.json b/build/package.json index d94f9aad64a..cebb65f3d42 100644 --- a/build/package.json +++ b/build/package.json @@ -2,13 +2,13 @@ "name": "code-oss-dev-build", "version": "1.0.0", "devDependencies": { - "@types/azure": "^0.9.18", - "@types/documentdb": "^1.10.1", - "@types/es6-collections": "^0.5.30", - "@types/es6-promise": "0.0.32", + "@types/azure": "0.9.19", + "@types/documentdb": "1.10.2", + "@types/es6-collections": "0.5.31", + "@types/es6-promise": "0.0.33", "@types/mime": "0.0.29", - "@types/node": "^7.0.13", - "@types/xml2js": "^0.0.33", + "@types/node": "8.0.33", + "@types/xml2js": "0.0.33", "azure-storage": "^2.1.0", "documentdb": "^1.11.0", "mime": "^1.3.4", diff --git a/extensions/javascript/package.json b/extensions/javascript/package.json index 4e176f58679..8cc0db74250 100644 --- a/extensions/javascript/package.json +++ b/extensions/javascript/package.json @@ -132,6 +132,6 @@ ] }, "devDependencies": { - "@types/node": "^7.0.4" + "@types/node": "8.0.33" } } diff --git a/extensions/markdown/package.json b/extensions/markdown/package.json index d07b223fda5..769c6091855 100644 --- a/extensions/markdown/package.json +++ b/extensions/markdown/package.json @@ -299,9 +299,9 @@ "vscode-nls": "2.0.2" }, "devDependencies": { - "@types/highlight.js": "^9.1.9", + "@types/highlight.js": "9.1.10", "@types/markdown-it": "0.0.2", - "@types/node": "^7.0.4", + "@types/node": "8.0.33", "gulp-rename": "^1.2.2", "gulp-replace": "^0.5.4" } diff --git a/extensions/merge-conflict/package.json b/extensions/merge-conflict/package.json index 4ecece640ea..38a33087345 100644 --- a/extensions/merge-conflict/package.json +++ b/extensions/merge-conflict/package.json @@ -88,6 +88,6 @@ "vscode-nls": "^2.0.2" }, "devDependencies": { - "@types/node": "^7.0.4" + "@types/node": "8.0.33" } } \ No newline at end of file diff --git a/extensions/typescript/package.json b/extensions/typescript/package.json index a5093c1f0c3..11b93b77e10 100644 --- a/extensions/typescript/package.json +++ b/extensions/typescript/package.json @@ -17,8 +17,8 @@ "vscode-nls": "2.0.1" }, "devDependencies": { - "@types/node": "^7.0.4", - "@types/semver": "^5.3.30" + "@types/node": "8.0.33", + "@types/semver": "5.4.0" }, "scripts": { "vscode:prepublish": "node ../../node_modules/gulp/bin/gulp.js --gulpfile ../../build/gulpfile.extensions.js compile-extension:typescript ./tsconfig.json", diff --git a/package.json b/package.json index c59d4358d0a..f6036ed00bc 100644 --- a/package.json +++ b/package.json @@ -50,12 +50,12 @@ }, "devDependencies": { "7zip": "0.0.6", - "@types/keytar": "^4.0.0", - "@types/minimist": "^1.2.0", - "@types/mocha": "^2.2.39", - "@types/semver": "^5.3.30", - "@types/sinon": "^1.16.34", - "@types/winreg": "^1.2.30", + "@types/keytar": "4.0.1", + "@types/minimist": "1.2.0", + "@types/mocha": "2.2.39", + "@types/semver": "5.3.30", + "@types/sinon": "1.16.34", + "@types/winreg": "1.2.30", "azure-storage": "^0.3.1", "clean-css": "3.4.6", "coveralls": "^2.11.11", diff --git a/test/smoke/package.json b/test/smoke/package.json index c6458a2173a..1908b5ebca7 100644 --- a/test/smoke/package.json +++ b/test/smoke/package.json @@ -9,13 +9,13 @@ }, "devDependencies": { "@types/electron": "~1.4.37", - "@types/htmlparser2": "^3.7.29", - "@types/mkdirp": "^0.5.1", - "@types/mocha": "^2.2.41", - "@types/ncp": "^2.0.1", - "@types/node": "^8.0.26", - "@types/rimraf": "^2.0.2", - "@types/webdriverio": "^4.6.1", + "@types/htmlparser2": "3.7.29", + "@types/mkdirp": "0.5.1", + "@types/mocha": "2.2.41", + "@types/ncp": "2.0.1", + "@types/node": "8.0.33", + "@types/rimraf": "2.0.2", + "@types/webdriverio": "4.6.1", "htmlparser2": "^3.9.2", "mocha": "^3.2.0", "ncp": "^2.0.0", From 214437bd7587f2abaa1f98d54240b60cdf1a69a2 Mon Sep 17 00:00:00 2001 From: prog-rajkamal Date: Tue, 10 Oct 2017 01:02:38 +0530 Subject: [PATCH 089/158] Fix #35322: Modenrize javascript snippets (#35444) --- .../javascript/snippets/javascript.json | 19 +++++++++++++++++++ .../javascript/snippets/javascriptreact.json | 19 +++++++++++++++++++ 2 files changed, 38 insertions(+) diff --git a/extensions/javascript/snippets/javascript.json b/extensions/javascript/snippets/javascript.json index 99723509494..6f13a64c51f 100644 --- a/extensions/javascript/snippets/javascript.json +++ b/extensions/javascript/snippets/javascript.json @@ -22,6 +22,16 @@ ], "description": "For Loop" }, + "For Loop (let)": { + "prefix": "forl", + "body": [ + "for (let ${1:index} = 0; ${1:index} < ${2:array}.length; ${1:index}++) {", + "\tlet ${3:element} = ${2:array}[${1:index}];", + "\t$0", + "}" + ], + "description": "For Loop (let)" + }, "For-Each Loop": { "prefix": "foreach", "body": [ @@ -43,6 +53,15 @@ ], "description": "For-In Loop" }, + "For-Of Loop": { + "prefix": "forof", + "body": [ + "for (let ${1:iterator} of ${2:object}) {", + "\t$0", + "}" + ], + "description": "For-Of Loop" + }, "Function Statement": { "prefix": "function", "body": [ diff --git a/extensions/javascript/snippets/javascriptreact.json b/extensions/javascript/snippets/javascriptreact.json index 044282e4c4f..3801be57a0a 100644 --- a/extensions/javascript/snippets/javascriptreact.json +++ b/extensions/javascript/snippets/javascriptreact.json @@ -22,6 +22,16 @@ ], "description": "For Loop" }, + "For Loop (let)": { + "prefix": "forl", + "body": [ + "for (let ${1:index} = 0; ${1:index} < ${2:array}.length; ${1:index}++) {", + "\tlet ${3:element} = ${2:array}[${1:index}];", + "\t$0", + "}" + ], + "description": "For Loop (let)" + }, "For-Each Loop": { "prefix": "foreach", "body": [ @@ -43,6 +53,15 @@ ], "description": "For-In Loop" }, + "For-Of Loop": { + "prefix": "forof", + "body": [ + "for (let ${1:iterator} of ${2:object}) {", + "\t$0", + "}" + ], + "description": "For-Of Loop" + }, "Function Statement": { "prefix": "function", "body": [ From 971196d820b658025ec66b689666376e6264b741 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Mon, 9 Oct 2017 12:59:36 -0700 Subject: [PATCH 090/158] Force DejaVu Sans Mono font in terminal on Fedora Fixes #35644 --- .../parts/terminal/electron-browser/terminal.ts | 17 +++++++++++++++++ .../electron-browser/terminalConfigHelper.ts | 11 ++++++++++- 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminal.ts b/src/vs/workbench/parts/terminal/electron-browser/terminal.ts index 4601182e9a7..48da0534572 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminal.ts +++ b/src/vs/workbench/parts/terminal/electron-browser/terminal.ts @@ -8,6 +8,7 @@ import * as cp from 'child_process'; import * as os from 'os'; import * as platform from 'vs/base/common/platform'; import * as processes from 'vs/base/node/processes'; +import { readFile, fileExists } from 'vs/base/node/pfs'; export const TERMINAL_DEFAULT_SHELL_LINUX = !platform.isWindows ? (process.env.SHELL || 'sh') : 'sh'; export const TERMINAL_DEFAULT_SHELL_OSX = !platform.isWindows ? (process.env.SHELL || 'sh') : 'sh'; @@ -21,3 +22,19 @@ export const TERMINAL_DEFAULT_SHELL_WINDOWS = isAtLeastWindows10 ? powerShellPat export interface ITerminalProcessFactory { create(env: { [key: string]: string }): cp.ChildProcess; } + +if (platform.isLinux) { + fileExists('/etc/os-release').then(exists => { + if (!exists) { + return; + } + readFile('/etc/os-release').then(b => { + const contents = b.toString(); + if (contents.indexOf('NAME=Fedora')) { + isFedora = true; + } + }); + }); +} + +export let isFedora = false; \ No newline at end of file diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminalConfigHelper.ts b/src/vs/workbench/parts/terminal/electron-browser/terminalConfigHelper.ts index 6507587aa97..b1793339026 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminalConfigHelper.ts +++ b/src/vs/workbench/parts/terminal/electron-browser/terminalConfigHelper.ts @@ -14,6 +14,7 @@ import { IStorageService, StorageScope } from 'vs/platform/storage/common/storag import { ITerminalConfiguration, ITerminalConfigHelper, ITerminalFont, IShellLaunchConfig, IS_WORKSPACE_SHELL_ALLOWED_STORAGE_KEY } from 'vs/workbench/parts/terminal/common/terminal'; import { TPromise } from 'vs/base/common/winjs.base'; import Severity from 'vs/base/common/severity'; +import { isFedora } from 'vs/workbench/parts/terminal/electron-browser/terminal'; interface IEditorConfiguration { editor: IEditorOptions; @@ -89,7 +90,15 @@ export class TerminalConfigHelper implements ITerminalConfigHelper { const editorConfig = (config).editor; const terminalConfig = this.config; - const fontFamily = terminalConfig.fontFamily || editorConfig.fontFamily; + let fontFamily = terminalConfig.fontFamily || editorConfig.fontFamily; + + // Work around bad font on Fedora + if (!terminalConfig.fontFamily) { + if (isFedora) { + fontFamily = '\'DejaVu Sans Mono\''; + } + } + let fontSize = this._toInteger(terminalConfig.fontSize, 0); if (fontSize <= 0) { fontSize = EDITOR_FONT_DEFAULTS.fontSize; From 266a1af40a7ce8cd87e24ac36507692ba4ec5388 Mon Sep 17 00:00:00 2001 From: Rob Lourens Date: Mon, 9 Oct 2017 15:05:43 -0700 Subject: [PATCH 091/158] Bump node-debug2 --- build/gulpfile.vscode.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/gulpfile.vscode.js b/build/gulpfile.vscode.js index 0d4d70aa0e5..9f7088b945e 100644 --- a/build/gulpfile.vscode.js +++ b/build/gulpfile.vscode.js @@ -46,7 +46,7 @@ const nodeModules = ['electron', 'original-fs'] const builtInExtensions = [ { name: 'ms-vscode.node-debug', version: '1.17.18' }, - { name: 'ms-vscode.node-debug2', version: '1.17.6' } + { name: 'ms-vscode.node-debug2', version: '1.18.1' } ]; const excludedExtensions = [ From 30056ee7c57449cef57abe37c2d96cfbf9f29972 Mon Sep 17 00:00:00 2001 From: Rob Lourens Date: Mon, 9 Oct 2017 14:14:16 -0700 Subject: [PATCH 092/158] Bump ripgrep --- npm-shrinkwrap.json | 6 +++--- package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index bb6e64467f2..17ee6622a1e 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -552,9 +552,9 @@ "resolved": "https://registry.npmjs.org/vscode-debugprotocol/-/vscode-debugprotocol-1.24.0.tgz" }, "vscode-ripgrep": { - "version": "0.0.27", - "from": "vscode-ripgrep@0.0.27", - "resolved": "https://registry.npmjs.org/vscode-ripgrep/-/vscode-ripgrep-0.0.27.tgz" + "version": "0.6.0-patch.0", + "from": "vscode-ripgrep@0.6.0-patch.0", + "resolved": "https://registry.npmjs.org/vscode-ripgrep/-/vscode-ripgrep-0.6.0-patch.0.tgz" }, "vscode-textmate": { "version": "3.1.5", diff --git a/package.json b/package.json index f6036ed00bc..2133570b711 100644 --- a/package.json +++ b/package.json @@ -42,7 +42,7 @@ "semver": "4.3.6", "v8-profiler": "jrieken/v8-profiler#vscode", "vscode-debugprotocol": "1.24.0", - "vscode-ripgrep": "0.0.27", + "vscode-ripgrep": "0.6.0-patch.0", "vscode-textmate": "^3.1.5", "winreg": "1.2.0", "xterm": "Tyriar/xterm.js#vscode-release/1.18", From d3bbec5b129a43538c6965a2c27d842239cd65e1 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Mon, 9 Oct 2017 16:05:35 -0700 Subject: [PATCH 093/158] Fix links in suggestWidget Fixes #35319 --- src/vs/editor/contrib/suggest/browser/suggestWidget.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/vs/editor/contrib/suggest/browser/suggestWidget.ts b/src/vs/editor/contrib/suggest/browser/suggestWidget.ts index af7e4287af1..ebd0216c50a 100644 --- a/src/vs/editor/contrib/suggest/browser/suggestWidget.ts +++ b/src/vs/editor/contrib/suggest/browser/suggestWidget.ts @@ -253,7 +253,8 @@ class SuggestionDetails { this.docs.textContent = item.suggestion.documentation; } else { addClass(this.docs, 'markdown-docs'); - this.docs.innerHTML = this.markdownRenderer.render(item.suggestion.documentation).innerHTML; + this.docs.innerHTML = ''; + this.docs.appendChild(this.markdownRenderer.render(item.suggestion.documentation)); } if (item.suggestion.detail) { From 3a13840209b431c39c0c4f14b6fad0ffe41c1456 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Mon, 9 Oct 2017 16:20:33 -0700 Subject: [PATCH 094/158] Return HtmlElement from renderText and renderFormattedText to remove need for casts --- src/vs/base/browser/htmlContentRenderer.ts | 4 +-- src/vs/base/browser/ui/inputbox/inputBox.ts | 4 +-- src/vs/base/test/browser/htmlContent.test.ts | 30 +++++++++---------- .../services/message/browser/messageList.ts | 2 +- 4 files changed, 20 insertions(+), 20 deletions(-) diff --git a/src/vs/base/browser/htmlContentRenderer.ts b/src/vs/base/browser/htmlContentRenderer.ts index 7087efd5e66..bf8dfd41504 100644 --- a/src/vs/base/browser/htmlContentRenderer.ts +++ b/src/vs/base/browser/htmlContentRenderer.ts @@ -29,13 +29,13 @@ function createElement(options: RenderOptions): HTMLElement { return element; } -export function renderText(text: string, options: RenderOptions = {}): Node { +export function renderText(text: string, options: RenderOptions = {}): HTMLElement { const element = createElement(options); element.textContent = text; return element; } -export function renderFormattedText(formattedText: string, options: RenderOptions = {}): Node { +export function renderFormattedText(formattedText: string, options: RenderOptions = {}): HTMLElement { const element = createElement(options); _renderFormattedText(element, parseFormattedText(formattedText), options.actionCallback); return element; diff --git a/src/vs/base/browser/ui/inputbox/inputBox.ts b/src/vs/base/browser/ui/inputbox/inputBox.ts index 603024b7c73..378ec0c525d 100644 --- a/src/vs/base/browser/ui/inputbox/inputBox.ts +++ b/src/vs/base/browser/ui/inputbox/inputBox.ts @@ -391,9 +391,9 @@ export class InputBox extends Widget { className: 'monaco-inputbox-message' }; - let spanElement: HTMLElement = (this.message.formatContent + const spanElement = (this.message.formatContent ? renderFormattedText(this.message.content, renderOptions) - : renderText(this.message.content, renderOptions)) as any; + : renderText(this.message.content, renderOptions)); dom.addClass(spanElement, this.classForType(this.message.type)); const styles = this.stylesForType(this.message.type); diff --git a/src/vs/base/test/browser/htmlContent.test.ts b/src/vs/base/test/browser/htmlContent.test.ts index dcd1c4d5afb..b91068ae15e 100644 --- a/src/vs/base/test/browser/htmlContent.test.ts +++ b/src/vs/base/test/browser/htmlContent.test.ts @@ -10,7 +10,7 @@ import { renderMarkdown, renderText, renderFormattedText } from 'vs/base/browser suite('HtmlContent', () => { test('render simple element', () => { - var result: HTMLElement = renderText('testing'); + var result: HTMLElement = renderText('testing'); assert.strictEqual(result.nodeType, document.ELEMENT_NODE); assert.strictEqual(result.textContent, 'testing'); @@ -18,7 +18,7 @@ suite('HtmlContent', () => { }); test('render element with class', () => { - var result: HTMLElement = renderText('testing', { + var result: HTMLElement = renderText('testing', { className: 'testClass' }); assert.strictEqual(result.nodeType, document.ELEMENT_NODE); @@ -26,32 +26,32 @@ suite('HtmlContent', () => { }); test('simple formatting', () => { - var result: HTMLElement = renderFormattedText('**bold**'); + var result: HTMLElement = renderFormattedText('**bold**'); assert.strictEqual(result.children.length, 1); assert.strictEqual(result.firstChild.textContent, 'bold'); assert.strictEqual((result.firstChild).tagName, 'B'); assert.strictEqual(result.innerHTML, 'bold'); - result = renderFormattedText('__italics__'); + result = renderFormattedText('__italics__'); assert.strictEqual(result.innerHTML, 'italics'); - result = renderFormattedText('this string has **bold** and __italics__'); + result = renderFormattedText('this string has **bold** and __italics__'); assert.strictEqual(result.innerHTML, 'this string has bold and italics'); }); test('no formatting', () => { - var result: HTMLElement = renderFormattedText('this is just a string'); + var result: HTMLElement = renderFormattedText('this is just a string'); assert.strictEqual(result.innerHTML, 'this is just a string'); }); test('preserve newlines', () => { - var result: HTMLElement = renderFormattedText('line one\nline two'); + var result: HTMLElement = renderFormattedText('line one\nline two'); assert.strictEqual(result.innerHTML, 'line one
line two'); }); test('action', () => { var callbackCalled = false; - var result: HTMLElement = renderFormattedText('[[action]]', { + var result: HTMLElement = renderFormattedText('[[action]]', { actionCallback(content) { assert.strictEqual(content, '0'); callbackCalled = true; @@ -67,7 +67,7 @@ suite('HtmlContent', () => { test('fancy action', () => { var callbackCalled = false; - var result: HTMLElement = renderFormattedText('__**[[action]]**__', { + var result: HTMLElement = renderFormattedText('__**[[action]]**__', { actionCallback(content) { assert.strictEqual(content, '0'); callbackCalled = true; @@ -82,13 +82,13 @@ suite('HtmlContent', () => { }); test('escaped formatting', () => { - var result: HTMLElement = renderFormattedText('\\*\\*bold\\*\\*'); + var result: HTMLElement = renderFormattedText('\\*\\*bold\\*\\*'); assert.strictEqual(result.children.length, 0); assert.strictEqual(result.innerHTML, '**bold**'); }); test('image rendering conforms to default', () => { const markdown = { value: `![image](someimageurl 'caption')` }; - const result: HTMLElement = renderMarkdown(markdown); + const result: HTMLElement = renderMarkdown(markdown); const renderer = new marked.Renderer(); const imageFromMarked = marked(markdown.value, { sanitize: true, @@ -98,7 +98,7 @@ suite('HtmlContent', () => { }); test('image rendering conforms to default without title', () => { const markdown = { value: `![image](someimageurl)` }; - const result: HTMLElement = renderMarkdown(markdown); + const result: HTMLElement = renderMarkdown(markdown); const renderer = new marked.Renderer(); const imageFromMarked = marked(markdown.value, { sanitize: true, @@ -107,15 +107,15 @@ suite('HtmlContent', () => { assert.strictEqual(result.innerHTML, imageFromMarked); }); test('image width from title params', () => { - var result: HTMLElement = renderMarkdown({ value: `![image](someimageurl|width=100 'caption')` }); + var result: HTMLElement = renderMarkdown({ value: `![image](someimageurl|width=100 'caption')` }); assert.strictEqual(result.innerHTML, `

image

`); }); test('image height from title params', () => { - var result: HTMLElement = renderMarkdown({ value: `![image](someimageurl|height=100 'caption')` }); + var result: HTMLElement = renderMarkdown({ value: `![image](someimageurl|height=100 'caption')` }); assert.strictEqual(result.innerHTML, `

image

`); }); test('image width and height from title params', () => { - var result: HTMLElement = renderMarkdown({ value: `![image](someimageurl|height=200,width=100 'caption')` }); + var result: HTMLElement = renderMarkdown({ value: `![image](someimageurl|height=200,width=100 'caption')` }); assert.strictEqual(result.innerHTML, `

image

`); }); }); diff --git a/src/vs/workbench/services/message/browser/messageList.ts b/src/vs/workbench/services/message/browser/messageList.ts index e1b5be6d5a6..a882703c7ae 100644 --- a/src/vs/workbench/services/message/browser/messageList.ts +++ b/src/vs/workbench/services/message/browser/messageList.ts @@ -353,7 +353,7 @@ export class MessageList { sevLabel.title(title); - $(messageContentElement as HTMLElement).title(title).appendTo(div); + $(messageContentElement).title(title).appendTo(div); }); }); } From 52d14dae63551b5a37d954e9fc448f9c6b89166e Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Mon, 9 Oct 2017 20:14:11 -0700 Subject: [PATCH 095/158] Correct condition --- .../workbench/parts/terminal/electron-browser/terminal.ts | 7 ++++--- .../test/electron-browser/terminalConfigHelper.test.ts | 8 ++++++-- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminal.ts b/src/vs/workbench/parts/terminal/electron-browser/terminal.ts index 48da0534572..e91d9b86fda 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminal.ts +++ b/src/vs/workbench/parts/terminal/electron-browser/terminal.ts @@ -24,13 +24,14 @@ export interface ITerminalProcessFactory { } if (platform.isLinux) { - fileExists('/etc/os-release').then(exists => { + const file = '/etc/os-release'; + fileExists(file).then(exists => { if (!exists) { return; } - readFile('/etc/os-release').then(b => { + readFile(file).then(b => { const contents = b.toString(); - if (contents.indexOf('NAME=Fedora')) { + if (contents.indexOf('NAME=Fedora') >= 0) { isFedora = true; } }); diff --git a/src/vs/workbench/parts/terminal/test/electron-browser/terminalConfigHelper.test.ts b/src/vs/workbench/parts/terminal/test/electron-browser/terminalConfigHelper.test.ts index e95533d078f..3eecd534b8c 100644 --- a/src/vs/workbench/parts/terminal/test/electron-browser/terminalConfigHelper.test.ts +++ b/src/vs/workbench/parts/terminal/test/electron-browser/terminalConfigHelper.test.ts @@ -11,7 +11,7 @@ import { Platform } from 'vs/base/common/platform'; import { TPromise } from 'vs/base/common/winjs.base'; import { TerminalConfigHelper } from 'vs/workbench/parts/terminal/electron-browser/terminalConfigHelper'; import { EDITOR_FONT_DEFAULTS } from 'vs/editor/common/config/editorOptions'; - +import { isFedora } from 'vs/workbench/parts/terminal/electron-browser/terminal'; class MockConfigurationService implements IConfigurationService { public _serviceBrand: any; @@ -63,7 +63,11 @@ suite('Workbench - TerminalConfigHelper', () => { }); configHelper = new TerminalConfigHelper(Platform.Linux, configurationService, null, null, null); configHelper.panelContainer = fixture; - assert.equal(configHelper.getFont().fontFamily, 'foo', 'editor.fontFamily should be the fallback when terminal.integrated.fontFamily not set'); + if (isFedora) { + assert.equal(configHelper.getFont().fontFamily, '\'DejaVu Sans Mono\'', 'Fedora should have its font overridden when terminal.integrated.fontFamily not set'); + } else { + assert.equal(configHelper.getFont().fontFamily, 'foo', 'editor.fontFamily should be the fallback when terminal.integrated.fontFamily not set'); + } }); test('TerminalConfigHelper - getFont fontSize', function () { From 4ceb9142184723e93bf4ed443d7f55aec49f1d6e Mon Sep 17 00:00:00 2001 From: Rob Lourens Date: Mon, 9 Oct 2017 19:22:35 -0700 Subject: [PATCH 096/158] Strip BOM from search result on first line - Fix #35633 --- src/vs/base/common/strings.ts | 4 ++++ src/vs/base/test/common/strings.test.ts | 17 +++++++++++++++++ .../services/search/node/ripgrepTextSearch.ts | 4 ++++ 3 files changed, 25 insertions(+) diff --git a/src/vs/base/common/strings.ts b/src/vs/base/common/strings.ts index 9f758d0e2f5..af01d2aed55 100644 --- a/src/vs/base/common/strings.ts +++ b/src/vs/base/common/strings.ts @@ -715,6 +715,10 @@ export function startsWithUTF8BOM(str: string): boolean { return (str && str.length > 0 && str.charCodeAt(0) === CharCode.UTF8_BOM); } +export function stripUTF8BOM(str: string): string { + return startsWithUTF8BOM(str) ? str.substr(1) : str; +} + /** * Appends two strings. If the appended result is longer than maxLength, * trims the start of the result and replaces it with '...'. diff --git a/src/vs/base/test/common/strings.test.ts b/src/vs/base/test/common/strings.test.ts index 2368d35add7..d9530ec5d48 100644 --- a/src/vs/base/test/common/strings.test.ts +++ b/src/vs/base/test/common/strings.test.ts @@ -334,4 +334,21 @@ suite('Strings', () => { assert.ok(!strings.fuzzyContains('hello world', 'wh')); assert.ok(!strings.fuzzyContains('d', 'dd')); }); + + test('startsWithUTF8BOM', () => { + assert(strings.startsWithUTF8BOM(strings.UTF8_BOM_CHARACTER)); + assert(strings.startsWithUTF8BOM(strings.UTF8_BOM_CHARACTER + 'a')); + assert(strings.startsWithUTF8BOM(strings.UTF8_BOM_CHARACTER + 'aaaaaaaaaa')); + assert(!strings.startsWithUTF8BOM(' ' + strings.UTF8_BOM_CHARACTER)); + assert(!strings.startsWithUTF8BOM('foo')); + assert(!strings.startsWithUTF8BOM('')); + }); + + test('stripUTF8BOM', () => { + assert.equal(strings.stripUTF8BOM(strings.UTF8_BOM_CHARACTER), ''); + assert.equal(strings.stripUTF8BOM(strings.UTF8_BOM_CHARACTER + 'foobar'), 'foobar'); + assert.equal(strings.stripUTF8BOM('foobar' + strings.UTF8_BOM_CHARACTER), 'foobar' + strings.UTF8_BOM_CHARACTER); + assert.equal(strings.stripUTF8BOM('abc'), 'abc'); + assert.equal(strings.stripUTF8BOM(''), ''); + }); }); diff --git a/src/vs/workbench/services/search/node/ripgrepTextSearch.ts b/src/vs/workbench/services/search/node/ripgrepTextSearch.ts index 0feb4151cb9..da61448ee47 100644 --- a/src/vs/workbench/services/search/node/ripgrepTextSearch.ts +++ b/src/vs/workbench/services/search/node/ripgrepTextSearch.ts @@ -237,6 +237,10 @@ export class RipgrepParser extends EventEmitter { } private handleMatchLine(outputLine: string, lineNum: number, text: string): void { + if (lineNum === 0) { + text = strings.stripUTF8BOM(text); + } + const lineMatch = new LineMatch(text, lineNum); this.fileMatch.addMatch(lineMatch); From b1407a87b05c2e9512eba9f44247dfd64c33cdfe Mon Sep 17 00:00:00 2001 From: Brendan Forster Date: Tue, 10 Oct 2017 18:04:14 +1100 Subject: [PATCH 097/158] disable lookup for GitHub's version of Git If the classic GitHub for Windows (creatively named github.exe) is installed alongside the new GitHub Desktop (which installs a github.bat file to PATH), we can get into the situation where Code can ask the GUI to authenticate for a private repository, which it doesn't understand. --- extensions/git/src/git.ts | 17 +---------------- 1 file changed, 1 insertion(+), 16 deletions(-) diff --git a/extensions/git/src/git.ts b/extensions/git/src/git.ts index bc9ac5398a8..5edc8c6d258 100644 --- a/extensions/git/src/git.ts +++ b/extensions/git/src/git.ts @@ -118,26 +118,11 @@ function findSystemGitWin32(base: string): Promise { return findSpecificGit(path.join(base, 'Git', 'cmd', 'git.exe')); } -function findGitHubGitWin32(): Promise { - const github = path.join(process.env['LOCALAPPDATA'], 'GitHub'); - - return readdir(github).then(children => { - const git = children.filter(child => /^PortableGit/.test(child))[0]; - - if (!git) { - return Promise.reject('Not found'); - } - - return findSpecificGit(path.join(github, git, 'cmd', 'git.exe')); - }); -} - function findGitWin32(): Promise { return findSystemGitWin32(process.env['ProgramW6432']) .then(void 0, () => findSystemGitWin32(process.env['ProgramFiles(x86)'])) .then(void 0, () => findSystemGitWin32(process.env['ProgramFiles'])) - .then(void 0, () => findSpecificGit('git')) - .then(void 0, () => findGitHubGitWin32()); + .then(void 0, () => findSpecificGit('git')); } export function findGit(hint: string | undefined): Promise { From ccb79101280d629dbdfa34e2905de0c3a793b148 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Tue, 10 Oct 2017 10:13:26 +0200 Subject: [PATCH 098/158] git content provider checks the wrong cache key fixes #35559 --- extensions/git/src/contentProvider.ts | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/extensions/git/src/contentProvider.ts b/extensions/git/src/contentProvider.ts index 78852ec6685..4e591c1ae32 100644 --- a/extensions/git/src/contentProvider.ts +++ b/extensions/git/src/contentProvider.ts @@ -82,7 +82,7 @@ export class GitContentProvider { const cacheKey = uri.toString(); const timestamp = new Date().getTime(); - const cacheValue = { uri, timestamp }; + const cacheValue: CacheRow = { uri, timestamp }; this.cache[cacheKey] = cacheValue; @@ -108,7 +108,10 @@ export class GitContentProvider { Object.keys(this.cache).forEach(key => { const row = this.cache[key]; - const isOpen = window.visibleTextEditors.some(e => e.document.toString() === row.uri.toString()); + const { path } = fromGitUri(row.uri); + const isOpen = workspace.textDocuments + .filter(d => d.uri.scheme === 'file') + .some(d => d.uri.fsPath === path); if (isOpen || now - row.timestamp < THREE_MINUTES) { cache[row.uri.toString()] = row; From dbcc641f8aa9587e600921e219562158ffbb9204 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Tue, 10 Oct 2017 11:18:12 +0200 Subject: [PATCH 099/158] Fix #35903 --- .../extensionManagement/node/extensionManagementService.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/platform/extensionManagement/node/extensionManagementService.ts b/src/vs/platform/extensionManagement/node/extensionManagementService.ts index 5b3bdfe9265..58c2a514205 100644 --- a/src/vs/platform/extensionManagement/node/extensionManagementService.ts +++ b/src/vs/platform/extensionManagement/node/extensionManagementService.ts @@ -268,7 +268,7 @@ export class ExtensionManagementService implements IExtensionManagementService { const promises = installed .filter(e => e.manifest.publisher === extension.manifest.publisher && e.manifest.name === extension.manifest.name) .map(e => this.checkForDependenciesAndUninstall(e, installed, force)); - return TPromise.join(promises).then(null, errors => TPromise.wrapError(this.joinErrors(errors))); + return TPromise.join(promises).then(null, error => TPromise.wrapError(Array.isArray(error) ? this.joinErrors(error) : error)); })) .then(() => { /* drop resolved value */ }); } From 0b03de632ae66ad24da6d9bb5ce8d2bdbeb0d7c8 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Tue, 10 Oct 2017 12:20:09 +0200 Subject: [PATCH 100/158] avoid disk search trouble when having workspace folders that aren't on disk --- .../services/search/node/searchService.ts | 35 +++++++++++++------ 1 file changed, 25 insertions(+), 10 deletions(-) diff --git a/src/vs/workbench/services/search/node/searchService.ts b/src/vs/workbench/services/search/node/searchService.ts index 8fdb18b45af..b7adc8e63a9 100644 --- a/src/vs/workbench/services/search/node/searchService.ts +++ b/src/vs/workbench/services/search/node/searchService.ts @@ -15,13 +15,14 @@ import { IUntitledEditorService } from 'vs/workbench/services/untitled/common/un import { IModelService } from 'vs/editor/common/services/modelService'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; -import { IRawSearch, IFolderSearch, ISerializedSearchComplete, ISerializedSearchProgressItem, ISerializedFileMatch, IRawSearchService, ITelemetryEvent } from './search'; +import { IRawSearch, ISerializedSearchComplete, ISerializedSearchProgressItem, ISerializedFileMatch, IRawSearchService, ITelemetryEvent } from './search'; import { ISearchChannel, SearchChannelClient } from './searchIpc'; import { IEnvironmentService, IDebugParams } from 'vs/platform/environment/common/environment'; import { ResourceMap } from 'vs/base/common/map'; import { IDisposable } from 'vs/base/common/lifecycle'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { onUnexpectedError } from 'vs/base/common/errors'; +import { Schemas } from 'vs/base/common/network'; export class SearchService implements ISearchService { public _serviceBrand: any; @@ -259,15 +260,8 @@ export class DiskSearch implements ISearchResultProvider { let request: PPromise; let rawSearch: IRawSearch = { - folderQueries: query.folderQueries ? query.folderQueries.map(q => { - return { - excludePattern: q.excludePattern, - includePattern: q.includePattern, - fileEncoding: q.fileEncoding, - folder: q.folder.fsPath - }; - }) : [], - extraFiles: query.extraFileResources ? query.extraFileResources.map(r => r.fsPath) : [], + folderQueries: [], + extraFiles: [], filePattern: query.filePattern, excludePattern: query.excludePattern, includePattern: query.includePattern, @@ -278,6 +272,27 @@ export class DiskSearch implements ISearchResultProvider { disregardIgnoreFiles: query.disregardIgnoreFiles }; + if (query.folderQueries) { + for (const q of query.folderQueries) { + if (q.folder.scheme === Schemas.file) { + rawSearch.folderQueries.push({ + excludePattern: q.excludePattern, + includePattern: q.includePattern, + fileEncoding: q.fileEncoding, + folder: q.folder.fsPath + }); + } + } + } + + if (query.extraFileResources) { + for (const r of query.extraFileResources) { + if (r.scheme === Schemas.file) { + rawSearch.extraFiles.push(r.fsPath); + } + } + } + if (query.type === QueryType.Text) { rawSearch.contentPattern = query.contentPattern; } From 51b0bf3c7891fd014fc1508b9f1686c1c5d46355 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Tue, 10 Oct 2017 12:20:38 +0200 Subject: [PATCH 101/158] support `findFiles` --- src/vs/vscode.proposed.d.ts | 3 + .../electron-browser/mainThreadFileSystem.ts | 58 ++++++++++++++++--- src/vs/workbench/api/node/extHost.protocol.ts | 3 + .../workbench/api/node/extHostFileSystem.ts | 8 +++ 4 files changed, 65 insertions(+), 7 deletions(-) diff --git a/src/vs/vscode.proposed.d.ts b/src/vs/vscode.proposed.d.ts index 85ca4a72cd1..0a2e63c7729 100644 --- a/src/vs/vscode.proposed.d.ts +++ b/src/vs/vscode.proposed.d.ts @@ -155,6 +155,9 @@ declare module 'vscode' { // todo@remote // create(resource: Uri): Thenable; + + // find files by names + findFiles?(query: string, progress: Progress, token: CancellationToken): Thenable; } export namespace workspace { diff --git a/src/vs/workbench/api/electron-browser/mainThreadFileSystem.ts b/src/vs/workbench/api/electron-browser/mainThreadFileSystem.ts index 76aac923806..5b6ea8b6f3a 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadFileSystem.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadFileSystem.ts @@ -5,7 +5,7 @@ 'use strict'; import URI from 'vs/base/common/uri'; -import { TPromise } from 'vs/base/common/winjs.base'; +import { TPromise, PPromise } from 'vs/base/common/winjs.base'; import { ExtHostContext, MainContext, IExtHostContext, MainThreadFileSystemShape, ExtHostFileSystemShape } from '../node/extHost.protocol'; import { IFileService, IFileSystemProvider, IStat, IFileChange } from 'vs/platform/files/common/files'; import { IDisposable, dispose } from 'vs/base/common/lifecycle'; @@ -13,6 +13,7 @@ import Event, { Emitter } from 'vs/base/common/event'; import { extHostNamedCustomer } from 'vs/workbench/api/electron-browser/extHostCustomers'; import { IProgress } from 'vs/platform/progress/common/progress'; import { IWorkspaceEditingService } from 'vs/workbench/services/workspace/common/workspaceEditing'; +import { ISearchResultProvider, ISearchQuery, ISearchComplete, ISearchProgressItem, QueryType, IFileMatch, ISearchService } from 'vs/platform/search/common/search'; @extHostNamedCustomer(MainContext.MainThreadFileSystem) export class MainThreadFileSystem implements MainThreadFileSystemShape { @@ -24,6 +25,7 @@ export class MainThreadFileSystem implements MainThreadFileSystemShape { constructor( extHostContext: IExtHostContext, @IFileService private readonly _fileService: IFileService, + @ISearchService private readonly _searchService: ISearchService, @IWorkspaceEditingService private readonly _workspaceEditService: IWorkspaceEditingService ) { this._proxy = extHostContext.get(ExtHostContext.ExtHostFileSystem); @@ -34,7 +36,7 @@ export class MainThreadFileSystem implements MainThreadFileSystemShape { } $registerFileSystemProvider(handle: number, scheme: string): void { - this._provider.set(handle, new RemoteFileSystemProvider(this._fileService, scheme, handle, this._proxy)); + this._provider.set(handle, new RemoteFileSystemProvider(this._fileService, this._searchService, scheme, handle, this._proxy)); } $unregisterFileSystemProvider(handle: number): void { @@ -53,28 +55,38 @@ export class MainThreadFileSystem implements MainThreadFileSystemShape { $reportFileChunk(handle: number, resource: URI, chunk: number[]): void { this._provider.get(handle).reportFileChunk(resource, chunk); } + + // --- search + + $handleSearchProgress(handle: number, session: number, resource: URI): void { + this._provider.get(handle).handleSearchProgress(session, resource); + } } -class RemoteFileSystemProvider implements IFileSystemProvider { +class RemoteFileSystemProvider implements IFileSystemProvider, ISearchResultProvider { private readonly _onDidChange = new Emitter(); - private readonly _registration: IDisposable; private readonly _reads = new Map>(); + private readonly _registrations: IDisposable[]; readonly onDidChange: Event = this._onDidChange.event; constructor( - service: IFileService, + fileService: IFileService, + searchService: ISearchService, scheme: string, private readonly _handle: number, private readonly _proxy: ExtHostFileSystemShape ) { - this._registration = service.registerProvider(scheme, this); + this._registrations = [ + fileService.registerProvider(scheme, this), + searchService.registerSearchResultProvider(this), + ]; } dispose(): void { - this._registration.dispose(); + dispose(this._registrations); this._onDidChange.dispose(); } @@ -115,4 +127,36 @@ class RemoteFileSystemProvider implements IFileSystemProvider { rmdir(resource: URI): TPromise { return this._proxy.$rmdir(this._handle, resource); } + + // --- search + + private _searches = new Map void>(); + private _searchesIdPool = 0; + + search(query: ISearchQuery): PPromise { + if (query.type === QueryType.Text) { + return PPromise.as({ results: [], stats: undefined }); + } + const id = ++this._searchesIdPool; + const matches: IFileMatch[] = []; + return new PPromise((resolve, reject, report) => { + this._proxy.$fileFiles(this._handle, id, query.filePattern).then(() => { + this._searches.delete(id); + resolve({ + results: matches, + stats: undefined + }); + }, reject); + + this._searches.set(id, resource => { + const match: IFileMatch = { resource }; + matches.push(match); + report(match); + }); + }); + } + + handleSearchProgress(session: number, resource: URI): void { + this._searches.get(session)(resource); + } } diff --git a/src/vs/workbench/api/node/extHost.protocol.ts b/src/vs/workbench/api/node/extHost.protocol.ts index 4016299feed..07a65209fe6 100644 --- a/src/vs/workbench/api/node/extHost.protocol.ts +++ b/src/vs/workbench/api/node/extHost.protocol.ts @@ -324,6 +324,8 @@ export interface MainThreadFileSystemShape extends IDisposable { $onDidAddFileSystemRoot(root: URI): void; $onFileSystemChange(handle: number, resource: IFileChange[]): void; $reportFileChunk(handle: number, resource: URI, chunk: number[] | null): void; + + $handleSearchProgress(handle: number, session: number, resource: URI): void; } export interface MainThreadTaskShape extends IDisposable { @@ -489,6 +491,7 @@ export interface ExtHostFileSystemShape { $mkdir(handle: number, resource: URI): TPromise; $readdir(handle: number, resource: URI): TPromise<[URI, IStat][]>; $rmdir(handle: number, resource: URI): TPromise; + $fileFiles(handle: number, session: number, query: string): TPromise; } export interface ExtHostExtensionServiceShape { diff --git a/src/vs/workbench/api/node/extHostFileSystem.ts b/src/vs/workbench/api/node/extHostFileSystem.ts index 6b7466381f5..a7b8c787310 100644 --- a/src/vs/workbench/api/node/extHostFileSystem.ts +++ b/src/vs/workbench/api/node/extHostFileSystem.ts @@ -74,4 +74,12 @@ export class ExtHostFileSystem implements ExtHostFileSystemShape { $rmdir(handle: number, resource: URI): TPromise { return asWinJsPromise(token => this._provider.get(handle).rmdir(resource)); } + $fileFiles(handle: number, session: number, query: string): TPromise { + const provider = this._provider.get(handle); + if (!provider.findFiles) { + return TPromise.as(undefined); + } + const progress = { report: (uri) => this._proxy.$handleSearchProgress(handle, session, uri) }; + return asWinJsPromise(token => provider.findFiles(query, progress, token)); + } } From dad2c89e76163971b75d0dc90d38e6d914b7f583 Mon Sep 17 00:00:00 2001 From: isidor Date: Tue, 10 Oct 2017 12:25:21 +0200 Subject: [PATCH 102/158] fixes #35898 --- src/vs/workbench/parts/debug/browser/debugStatus.ts | 5 +++-- .../parts/debug/browser/media/debug.contribution.css | 4 ++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/vs/workbench/parts/debug/browser/debugStatus.ts b/src/vs/workbench/parts/debug/browser/debugStatus.ts index 9e575478b01..821b34d783b 100644 --- a/src/vs/workbench/parts/debug/browser/debugStatus.ts +++ b/src/vs/workbench/parts/debug/browser/debugStatus.ts @@ -54,8 +54,9 @@ export class DebugStatus extends Themable implements IStatusbarItem { this.quickOpenService.show('debug ').done(undefined, errors.onUnexpectedError); })); statusBarItem.title = nls.localize('debug', "Debug"); - this.icon = dom.append(statusBarItem, $('.icon')); - this.label = dom.append(statusBarItem, $('span.label')); + const a = dom.append(statusBarItem, $('a')); + this.icon = dom.append(a, $('.icon')); + this.label = dom.append(a, $('span.label')); this.setLabel(); this.updateStyles(); } diff --git a/src/vs/workbench/parts/debug/browser/media/debug.contribution.css b/src/vs/workbench/parts/debug/browser/media/debug.contribution.css index 69bf974a45f..2796a460a0d 100644 --- a/src/vs/workbench/parts/debug/browser/media/debug.contribution.css +++ b/src/vs/workbench/parts/debug/browser/media/debug.contribution.css @@ -103,8 +103,8 @@ } /* Debug status */ -.monaco-workbench .part.statusbar .debug-statusbar-item { - cursor: pointer; +/* A very precise css rule to overwrite the display set in statusbar.css */ +.monaco-workbench > .part.statusbar > .statusbar-item > .debug-statusbar-item > a:not([disabled]):not(.disabled) { display: flex; } From e6df58e5d9a90d27eb4304abdff521e32a58b957 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Tue, 10 Oct 2017 12:28:47 +0200 Subject: [PATCH 103/158] debt - additional quick scorer result tweaks --- .../parts/quickopen/common/quickOpenScorer.ts | 306 +++++++++++------- .../test/common/quickOpenScorer.test.ts | 94 +++++- .../browser/parts/editor/editorPicker.ts | 9 +- .../parts/quickopen/quickOpenController.ts | 8 +- .../search/browser/openAnythingHandler.ts | 16 +- 5 files changed, 282 insertions(+), 151 deletions(-) diff --git a/src/vs/base/parts/quickopen/common/quickOpenScorer.ts b/src/vs/base/parts/quickopen/common/quickOpenScorer.ts index 1dce6a05bad..750a6961ca1 100644 --- a/src/vs/base/parts/quickopen/common/quickOpenScorer.ts +++ b/src/vs/base/parts/quickopen/common/quickOpenScorer.ts @@ -8,12 +8,103 @@ import { compareAnything } from 'vs/base/common/comparers'; import { matchesPrefix, IMatch, createMatches, matchesCamelCase, isSeparatorAtPos, isUpper } from 'vs/base/common/filters'; import { isEqual, nativeSep } from 'vs/base/common/paths'; +import { isWindows } from 'vs/base/common/platform'; +import { stripWildcards } from 'vs/base/common/strings'; export type Score = [number /* score */, number[] /* match positions */]; export type ScorerCache = { [key: string]: IItemScore }; const NO_SCORE: Score = [0, []]; +/** + * Compute a score for the given string and the given query. + * + * Rules: + * Character score: 1 + * Same case bonus: 1 + * Upper case bonus: 1 + * Consecutive match bonus: 5 + * Start of word/path bonus: 7 + * Start of string bonus: 8 + */ +export function _doScore(target: string, query: string, fuzzy: boolean): Score { + if (!target || !query) { + return NO_SCORE; // return early if target or query are undefined + } + + if (target.length < query.length) { + return NO_SCORE; // impossible for query to be contained in target + } + + // console.group(`Target: ${target}, Query: ${query}`); + + const queryLen = query.length; + const targetLower = target.toLowerCase(); + const queryLower = query.toLowerCase(); + + let res = NO_SCORE; + + // When not searching fuzzy, we require the query to be contained fully + // in the target string. We set the offset to search from to that location. + if (!fuzzy) { + const indexOfQueryInTarget = targetLower.indexOf(queryLower); + if (indexOfQueryInTarget === -1) { + // console.log(`Characters not matching consecutively ${queryLower} within ${targetLower}`); + + return NO_SCORE; + } + + res = _doScoreFromOffset(target, query, targetLower, queryLower, queryLen, indexOfQueryInTarget); + } + + // When searching fuzzy we run the scorer for each location of the first query + // character so that we can produce better results in case the pattern matches + // multiple times on the target (prevent scattering of matching positions). + else { + const queryFirstCharacter = queryLower[0]; + + let offset = 0; + while ((offset = targetLower.indexOf(queryFirstCharacter, offset)) !== -1) { + const scoreFromOffset = _doScoreFromOffset(target, query, targetLower, queryLower, queryLen, offset); + if (isBetterScore(res, scoreFromOffset)) { + res = scoreFromOffset; + } + + offset++; + } + } + + // console.log(`%cFinal Score: ${score}`, 'font-weight: bold'); + // console.groupEnd(); + + return res; +} + +function isBetterScore(score: Score, candidate: Score): boolean { + if (candidate[0] > score[0]) { + return true; // candidate has higher score + } + + if (score[0] > candidate[0]) { + return false; // candidate has lower score + } + + // Score is the same, check by match compactness + const matchStart = score[1][0]; + const matchEnd = score[1][score[1].length - 1]; + const matchLength = matchEnd - matchStart; + + const candidateMatchStart = candidate[1][0]; + const candidateMatchEnd = candidate[1][candidate[1].length - 1]; + const candidateMatchLength = candidateMatchEnd - candidateMatchStart; + + if (candidateMatchLength < matchLength) { + return true; // candidate has more compact matches + } + + return false; +} + // Based on material from: /*! BEGIN THIRD PARTY @@ -31,81 +122,18 @@ BEGIN THIRD PARTY * Date: Tue Mar 1 2011 * Updated: Tue Mar 10 2015 */ - -/** - * Compute a score for the given string and the given query. - * - * Rules: - * Character score: 1 - * Same case bonus: 1 - * Upper case bonus: 1 - * Consecutive match bonus: 5 - * Start of word/path bonus: 7 - * Start of string bonus: 8 - */ -export function _doScore(target: string, query: string, fuzzy: boolean, inverse?: boolean): Score { - if (!target || !query) { - return NO_SCORE; // return early if target or query are undefined - } - - if (target.length < query.length) { - return NO_SCORE; // impossible for query to be contained in target - } - - // console.group(`Target: ${target}, Query: ${query}`); - - const queryLen = query.length; - const targetLower = target.toLowerCase(); - const queryLower = query.toLowerCase(); - +export function _doScoreFromOffset(target: string, query: string, targetLower: string, queryLower: string, queryLen: number, offset: number): Score { const matchingPositions: number[] = []; - let index: number; - let startAt: number; - if (!inverse) { - index = 0; - startAt = 0; - } else { - index = queryLen - 1; // inverse: from end of query to beginning - startAt = target.length - 1; // inverse: from end of target to beginning - } - - // When not searching fuzzy, we require the query to be contained fully - // in the target string. - if (!fuzzy) { - let indexOfQueryInTarget: number; - if (!inverse) { - indexOfQueryInTarget = targetLower.indexOf(queryLower); - } else { - indexOfQueryInTarget = targetLower.lastIndexOf(queryLower); - } - - if (indexOfQueryInTarget === -1) { - // console.log(`Characters not matching consecutively ${queryLower} within ${targetLower}`); - - return NO_SCORE; - } - - // Adjust the start position with the offset of the query - if (!inverse) { - startAt = indexOfQueryInTarget; - } else { - startAt = indexOfQueryInTarget + query.length; - } - } - + let targetIndex = offset; + let queryIndex = 0; let score = 0; - while (inverse ? index >= 0 : index < queryLen) { + while (queryIndex < queryLen) { // Check for query character being contained in target - let indexOf: number; - if (!inverse) { - indexOf = targetLower.indexOf(queryLower[index], startAt); - } else { - indexOf = targetLower.lastIndexOf(queryLower[index], startAt); // inverse: look from the end - } + const indexOfQueryInTarget = targetLower.indexOf(queryLower[queryIndex], targetIndex); - if (indexOf < 0) { + if (indexOfQueryInTarget < 0) { // console.log(`Character not part of target ${query[index]}`); score = 0; @@ -113,7 +141,7 @@ export function _doScore(target: string, query: string, fuzzy: boolean, inverse? } // Fill into positions array - matchingPositions.push(indexOf); + matchingPositions.push(indexOfQueryInTarget); // Character match bonus score += 1; @@ -121,35 +149,35 @@ export function _doScore(target: string, query: string, fuzzy: boolean, inverse? // console.groupCollapsed(`%cCharacter match bonus: +1 (char: ${query[index]} at index ${indexOf}, total score: ${score})`, 'font-weight: normal'); // Consecutive match bonus - if (startAt === indexOf && index > 0) { + if (targetIndex === indexOfQueryInTarget && queryIndex > 0) { score += 5; // console.log('Consecutive match bonus: +5'); } // Same case bonus - if (target[indexOf] === query[index]) { + if (target[indexOfQueryInTarget] === query[queryIndex]) { score += 1; // console.log('Same case bonus: +1'); } // Start of word bonus - if (indexOf === 0) { + if (indexOfQueryInTarget === 0) { score += 8; // console.log('Start of word bonus: +8'); } // After separator bonus - else if (isSeparatorAtPos(target, indexOf - 1)) { + else if (isSeparatorAtPos(target, indexOfQueryInTarget - 1)) { score += 7; // console.log('After separtor bonus: +7'); } // Inside word upper case bonus - else if (isUpper(target.charCodeAt(indexOf))) { + else if (isUpper(target.charCodeAt(indexOfQueryInTarget))) { score += 1; // console.log('Inside word upper case bonus: +1'); @@ -157,18 +185,8 @@ export function _doScore(target: string, query: string, fuzzy: boolean, inverse? // console.groupEnd(); - if (!inverse) { - startAt = indexOf + 1; - index++; - } else { - startAt = indexOf - 1; // inverse: go to begining from end - index--; // inverse: also for query index - } - } - - // inverse: flip the matching positions so that they appear in order - if (inverse) { - matchingPositions.reverse(); + targetIndex = indexOfQueryInTarget + 1; + queryIndex++; } const res: Score = (score > 0) ? [score, matchingPositions] : NO_SCORE; @@ -266,22 +284,27 @@ function doScoreItem(label: string, description: string, path: string, query: return { score: PATH_IDENTITY_SCORE, labelMatch: [{ start: 0, end: label.length }], descriptionMatch: description ? [{ start: 0, end: description.length }] : void 0 }; } - // 2.) treat prefix matches on the label second highest - const prefixLabelMatch = matchesPrefix(query, label); - if (prefixLabelMatch) { - return { score: LABEL_PREFIX_SCORE, labelMatch: prefixLabelMatch }; - } + // We only consider label matches if the query is not including file path separators + const preferLabelMatches = !path || query.indexOf(nativeSep) === -1; + if (preferLabelMatches) { - // 3.) treat camelcase matches on the label third highest - const camelcaseLabelMatch = matchesCamelCase(query, label); - if (camelcaseLabelMatch) { - return { score: LABEL_CAMELCASE_SCORE, labelMatch: camelcaseLabelMatch }; - } + // 2.) treat prefix matches on the label second highest + const prefixLabelMatch = matchesPrefix(query, label); + if (prefixLabelMatch) { + return { score: LABEL_PREFIX_SCORE, labelMatch: prefixLabelMatch }; + } - // 4.) prefer scores on the label if any - const [labelScore, labelPositions] = _doScore(label, query, fuzzy); - if (labelScore) { - return { score: labelScore + LABEL_SCORE_THRESHOLD, labelMatch: createMatches(labelPositions) }; + // 3.) treat camelcase matches on the label third highest + const camelcaseLabelMatch = matchesCamelCase(query, label); + if (camelcaseLabelMatch) { + return { score: LABEL_CAMELCASE_SCORE, labelMatch: camelcaseLabelMatch }; + } + + // 4.) prefer scores on the label if any + const [labelScore, labelPositions] = _doScore(label, query, fuzzy); + if (labelScore) { + return { score: labelScore + LABEL_SCORE_THRESHOLD, labelMatch: createMatches(labelPositions) }; + } } // 5.) finally compute description + label scores if we have a description @@ -294,18 +317,7 @@ function doScoreItem(label: string, description: string, path: string, query: const descriptionPrefixLength = descriptionPrefix.length; const descriptionAndLabel = `${descriptionPrefix}${label}`; - let [labelDescriptionScore, labelDescriptionPositions] = _doScore(descriptionAndLabel, query, fuzzy); - - // Optimize for file paths: score from the back to the beginning to catch more specific folder - // names that match on the end of the file. This yields better results in most cases. - if (!!path) { - const [labelDescriptionScoreInverse, labelDescriptionPositionsInverse] = _doScore(descriptionAndLabel, query, fuzzy, true /* inverse */); - if (labelDescriptionScoreInverse && labelDescriptionScoreInverse > labelDescriptionScore) { - labelDescriptionScore = labelDescriptionScoreInverse; - labelDescriptionPositions = labelDescriptionPositionsInverse; - } - } - + const [labelDescriptionScore, labelDescriptionPositions] = _doScore(descriptionAndLabel, query, fuzzy); if (labelDescriptionScore) { const labelDescriptionMatches = createMatches(labelDescriptionPositions); const labelMatch: IMatch[] = []; @@ -339,8 +351,11 @@ function doScoreItem(label: string, description: string, path: string, query: } export function compareItemsByScore(itemA: T, itemB: T, query: string, fuzzy: boolean, accessor: IItemAccessor, cache: ScorerCache, fallbackComparer = fallbackCompare): number { - const scoreA = scoreItem(itemA, query, fuzzy, accessor, cache).score; - const scoreB = scoreItem(itemB, query, fuzzy, accessor, cache).score; + const itemScoreA = scoreItem(itemA, query, fuzzy, accessor, cache); + const itemScoreB = scoreItem(itemB, query, fuzzy, accessor, cache); + + const scoreA = itemScoreA.score; + const scoreB = itemScoreB.score; // 1.) check for identity matches if (scoreA === PATH_IDENTITY_SCORE || scoreB === PATH_IDENTITY_SCORE) { @@ -373,6 +388,12 @@ export function compareItemsByScore(itemA: T, itemB: T, query: string, fuzzy: const labelA = accessor.getItemLabel(itemA); const labelB = accessor.getItemLabel(itemB); + // prefer more compact camel case matches over longer + const comparedByMatchLength = compareByMatchLength(itemScoreA.labelMatch, itemScoreB.labelMatch); + if (comparedByMatchLength !== 0) { + return comparedByMatchLength; + } + // prefer shorter names when both match on label camelcase if (labelA.length !== labelB.length) { return labelA.length - labelB.length; @@ -395,10 +416,49 @@ export function compareItemsByScore(itemA: T, itemB: T, query: string, fuzzy: return scoreA > scoreB ? -1 : 1; } - // 6.) at this point, scores are identical for both items so we start to use the fallback compare + // 6.) scores are identical, prefer more compact matches (label and description) + const labelMatchCompactness = compareByMatchLength(itemScoreA.labelMatch, itemScoreB.labelMatch); + if (labelMatchCompactness !== 0) { + return labelMatchCompactness; + } + + const descriptionMatchCompactness = compareByMatchLength(itemScoreA.descriptionMatch, itemScoreB.descriptionMatch); + if (descriptionMatchCompactness !== 0) { + return descriptionMatchCompactness; + } + + // 7.) at this point, scores are identical and match compactness as well + // for both items so we start to use the fallback compare return fallbackComparer(itemA, itemB, query, accessor); } +function compareByMatchLength(matchesA?: IMatch[], matchesB?: IMatch[]): number { + if ((!matchesA && !matchesB) || (!matchesA.length && !matchesB.length)) { + return 0; // make sure to not cause bad comparing when matches are not provided + } + + if (!matchesB || !matchesB.length) { + return -1; + } + + if (!matchesA || !matchesA.length) { + return 1; + } + + // Compute match length of A (first to last match) + const matchStartA = matchesA[0].start; + const matchEndA = matchesA[matchesA.length - 1].end; + const matchLengthA = matchEndA - matchStartA; + + // Compute match length of B (first to last match) + const matchStartB = matchesB[0].start; + const matchEndB = matchesB[matchesB.length - 1].end; + const matchLengthB = matchEndB - matchStartB; + + // Prefer shorter match length + return matchLengthA === matchLengthB ? 0 : matchLengthB < matchLengthA ? 1 : -1; +} + export function fallbackCompare(itemA: T, itemB: T, query: string, accessor: IItemAccessor): number { // check for label + description length and prefer shorter @@ -442,4 +502,18 @@ export function fallbackCompare(itemA: T, itemB: T, query: string, accessor: // equal return 0; +} + +/** + * Helper function to prepare a search value for scoring in quick open by removing unwanted characters. + */ +export function massageSearchForScoring(searchValue: string): string { + if (searchValue) { + searchValue = stripWildcards(searchValue).replace(/\s/g, ''); // get rid of all wildcards and whitespace + if (isWindows) { + searchValue = searchValue.replace(/\//g, '\\'); // Help Windows users to search for paths when using slash + } + } + + return searchValue; } \ No newline at end of file diff --git a/src/vs/base/parts/quickopen/test/common/quickOpenScorer.test.ts b/src/vs/base/parts/quickopen/test/common/quickOpenScorer.test.ts index 5af281048e2..ed47435cbc0 100644 --- a/src/vs/base/parts/quickopen/test/common/quickOpenScorer.test.ts +++ b/src/vs/base/parts/quickopen/test/common/quickOpenScorer.test.ts @@ -57,10 +57,10 @@ suite('Quick Open Scorer', () => { scores.push(scorer._doScore(target, 'hw', true)); // direct mix-case prefix (multiple) scores.push(scorer._doScore(target, 'H', true)); // direct case prefix scores.push(scorer._doScore(target, 'h', true)); // direct mix-case prefix + scores.push(scorer._doScore(target, 'ld', true)); // in-string mix-case match (consecutive, avoids scattered hit) scores.push(scorer._doScore(target, 'W', true)); // direct case word prefix scores.push(scorer._doScore(target, 'w', true)); // direct mix-case word prefix scores.push(scorer._doScore(target, 'Ld', true)); // in-string case match (multiple) - scores.push(scorer._doScore(target, 'ld', true)); // in-string mix-case match scores.push(scorer._doScore(target, 'L', true)); // in-string case match scores.push(scorer._doScore(target, 'l', true)); // in-string mix-case match scores.push(scorer._doScore(target, '4', true)); // no match @@ -93,20 +93,6 @@ suite('Quick Open Scorer', () => { assert.equal(scorer._doScore(target, 'eo', false)[0], 0); }); - test('score (non fuzzy, inverse)', function () { - const target = 'HeLlo-World'; - - assert.ok(scorer._doScore(target, 'HelLo-World', false, true)[0] > 0); - assert.equal(scorer._doScore(target, 'HelLo-World', false, true)[1].length, 'HelLo-World'.length); - - assert.ok(scorer._doScore(target, 'hello-world', false, true)[0] > 0); - assert.equal(scorer._doScore(target, 'HW', false, true)[0], 0); - assert.ok(scorer._doScore(target, 'h', false, true)[0] > 0); - assert.ok(scorer._doScore(target, 'ello', false, true)[0] > 0); - assert.ok(scorer._doScore(target, 'ld', false, true)[0] > 0); - assert.equal(scorer._doScore(target, 'eo', false, true)[0], 0); - }); - test('scoreItem - matches are proper', function () { let res = scorer.scoreItem(null, 'something', true, ResourceAccessor, cache); assert.ok(!res.score); @@ -197,6 +183,22 @@ suite('Quick Open Scorer', () => { assert.equal(pathRes.descriptionMatch[0].end, 26); }); + test('scoreItem - prefers more compact matches', function () { + const resource = URI.file('/1a111d1/11a1d1/something.txt'); + + // expect "ad" to be matched towards the end of the file because the + // match is more compact + const res = scorer.scoreItem(resource, 'ad', true, ResourceAccessor, cache); + assert.ok(res.score); + assert.ok(res.descriptionMatch); + assert.ok(!res.labelMatch.length); + assert.equal(res.descriptionMatch.length, 2); + assert.equal(res.descriptionMatch[0].start, 11); + assert.equal(res.descriptionMatch[0].end, 12); + assert.equal(res.descriptionMatch[1].start, 13); + assert.equal(res.descriptionMatch[1].end, 14); + }); + test('compareItemsByScore - identity', function () { const resourceA = URI.file('/some/path/fileA.txt'); const resourceB = URI.file('/some/path/other/fileB.txt'); @@ -422,4 +424,66 @@ suite('Quick Open Scorer', () => { assert.equal(res[0], resourceB); assert.equal(res[1], resourceA); }); + + test('compareFilesByScore - prefer more compact camel case matches', function () { + const resourceA = URI.file('config/test/openthisAnythingHandler.js'); + const resourceB = URI.file('config/test/openthisisnotsorelevantforthequeryAnyHand.js'); + + let query = 'AH'; + + let res = [resourceA, resourceB].sort((r1, r2) => scorer.compareItemsByScore(r1, r2, query, true, ResourceAccessor, cache)); + assert.equal(res[0], resourceB); + assert.equal(res[1], resourceA); + + res = [resourceB, resourceA].sort((r1, r2) => scorer.compareItemsByScore(r1, r2, query, true, ResourceAccessor, cache)); + assert.equal(res[0], resourceB); + assert.equal(res[1], resourceA); + }); + + test('compareFilesByScore - prefer more compact matches (label)', function () { + const resourceA = URI.file('config/test/examasdaple.js'); + const resourceB = URI.file('config/test/exampleasdaasd.ts'); + + let query = 'xp'; + + let res = [resourceA, resourceB].sort((r1, r2) => scorer.compareItemsByScore(r1, r2, query, true, ResourceAccessor, cache)); + assert.equal(res[0], resourceB); + assert.equal(res[1], resourceA); + + res = [resourceB, resourceA].sort((r1, r2) => scorer.compareItemsByScore(r1, r2, query, true, ResourceAccessor, cache)); + assert.equal(res[0], resourceB); + assert.equal(res[1], resourceA); + }); + + test('compareFilesByScore - prefer more compact matches (path)', function () { + const resourceA = URI.file('config/test/examasdaple/file.js'); + const resourceB = URI.file('config/test/exampleasdaasd/file.ts'); + + let query = 'xp'; + + let res = [resourceA, resourceB].sort((r1, r2) => scorer.compareItemsByScore(r1, r2, query, true, ResourceAccessor, cache)); + assert.equal(res[0], resourceB); + assert.equal(res[1], resourceA); + + res = [resourceB, resourceA].sort((r1, r2) => scorer.compareItemsByScore(r1, r2, query, true, ResourceAccessor, cache)); + assert.equal(res[0], resourceB); + assert.equal(res[1], resourceA); + }); + + test('compareFilesByScore - avoid match scattering (bug #34210)', function () { + const resourceA = URI.file('node_modules1/bundle/lib/model/modules/ot1/index.js'); + const resourceB = URI.file('node_modules1/bundle/lib/model/modules/un1/index.js'); + const resourceC = URI.file('node_modules1/bundle/lib/model/modules/modu1/index.js'); + const resourceD = URI.file('node_modules1/bundle/lib/model/modules/oddl1/index.js'); + + let query = 'modu1/index.js'; + + let res = [resourceA, resourceB, resourceC, resourceD].sort((r1, r2) => scorer.compareItemsByScore(r1, r2, query, true, ResourceAccessor, cache)); + assert.equal(res[0], resourceC); + + query = 'un1/index.js'; + + res = [resourceA, resourceB, resourceC, resourceD].sort((r1, r2) => scorer.compareItemsByScore(r1, r2, query, true, ResourceAccessor, cache)); + assert.equal(res[0], resourceB); + }); }); \ No newline at end of file diff --git a/src/vs/workbench/browser/parts/editor/editorPicker.ts b/src/vs/workbench/browser/parts/editor/editorPicker.ts index f02a2e68452..f7c63fa7e08 100644 --- a/src/vs/workbench/browser/parts/editor/editorPicker.ts +++ b/src/vs/workbench/browser/parts/editor/editorPicker.ts @@ -22,8 +22,7 @@ import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/edi import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; import { EditorInput, toResource, IEditorGroup, IEditorStacksModel } from 'vs/workbench/common/editor'; -import { stripWildcards } from 'vs/base/common/strings'; -import { compareItemsByScore, scoreItem, ScorerCache } from 'vs/base/parts/quickopen/common/quickOpenScorer'; +import { compareItemsByScore, scoreItem, ScorerCache, massageSearchForScoring } from 'vs/base/parts/quickopen/common/quickOpenScorer'; export class EditorPickerEntry extends QuickOpenEntryGroup { private stacks: IEditorStacksModel; @@ -107,9 +106,8 @@ export abstract class BaseEditorPicker extends QuickOpenHandler { return TPromise.as(null); } - const stacks = this.editorGroupService.getStacksModel(); - - searchValue = stripWildcards(searchValue.trim()); + // Massage search for scoring + searchValue = massageSearchForScoring(searchValue); const entries = editorEntries.filter(e => { if (!searchValue) { @@ -127,6 +125,7 @@ export abstract class BaseEditorPicker extends QuickOpenHandler { }); // Sorting + const stacks = this.editorGroupService.getStacksModel(); if (searchValue) { entries.sort((e1, e2) => { if (e1.group !== e2.group) { diff --git a/src/vs/workbench/browser/parts/quickopen/quickOpenController.ts b/src/vs/workbench/browser/parts/quickopen/quickOpenController.ts index 27b098e9604..00bd2d8d83a 100644 --- a/src/vs/workbench/browser/parts/quickopen/quickOpenController.ts +++ b/src/vs/workbench/browser/parts/quickopen/quickOpenController.ts @@ -55,7 +55,7 @@ import { IEnvironmentService } from 'vs/platform/environment/common/environment' import { ITree, IActionProvider } from 'vs/base/parts/tree/browser/tree'; import { BaseActionItem } from 'vs/base/browser/ui/actionbar/actionbar'; import { FileKind, IFileService } from 'vs/platform/files/common/files'; -import { scoreItem, ScorerCache, compareItemsByScore } from 'vs/base/parts/quickopen/common/quickOpenScorer'; +import { scoreItem, ScorerCache, compareItemsByScore, massageSearchForScoring } from 'vs/base/parts/quickopen/common/quickOpenScorer'; const HELP_PREFIX = '?'; @@ -1177,9 +1177,9 @@ class EditorHistoryHandler { } public getResults(searchValue?: string): QuickOpenEntry[] { - if (searchValue) { - searchValue = strings.stripWildcards(searchValue.replace(/ /g, '')); // get rid of all whitespace and wildcards - } + + // Massage search for scoring + searchValue = massageSearchForScoring(searchValue); // Just return all if we are not searching const history = this.historyService.getHistory(); diff --git a/src/vs/workbench/parts/search/browser/openAnythingHandler.ts b/src/vs/workbench/parts/search/browser/openAnythingHandler.ts index 1814995bbef..69c76344f67 100644 --- a/src/vs/workbench/parts/search/browser/openAnythingHandler.ts +++ b/src/vs/workbench/parts/search/browser/openAnythingHandler.ts @@ -11,8 +11,6 @@ import { TPromise } from 'vs/base/common/winjs.base'; import nls = require('vs/nls'); import { ThrottledDelayer } from 'vs/base/common/async'; import types = require('vs/base/common/types'); -import { isWindows } from 'vs/base/common/platform'; -import strings = require('vs/base/common/strings'); import { IAutoFocus } from 'vs/base/parts/quickopen/common/quickOpen'; import { QuickOpenEntry, QuickOpenModel, QuickOpenItemAccessor } from 'vs/base/parts/quickopen/browser/quickOpenModel'; import { QuickOpenHandler } from 'vs/workbench/browser/quickopen'; @@ -25,7 +23,7 @@ import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IWorkbenchSearchConfiguration } from 'vs/workbench/parts/search/common/search'; import { IRange } from 'vs/editor/common/core/range'; -import { compareItemsByScore, scoreItem, ScorerCache } from 'vs/base/parts/quickopen/common/quickOpenScorer'; +import { compareItemsByScore, scoreItem, ScorerCache, massageSearchForScoring } from 'vs/base/parts/quickopen/common/quickOpenScorer'; export import OpenSymbolHandler = openSymbolHandler.OpenSymbolHandler; // OpenSymbolHandler is used from an extension and must be in the main bundle file so it can load @@ -175,11 +173,8 @@ export class OpenAnythingHandler extends QuickOpenHandler { this.cancelPendingSearch(); this.isClosed = false; // Treat this call as the handler being in use - // Massage search value - searchValue = searchValue.replace(/ /g, ''); // get rid of all whitespace - if (isWindows) { - searchValue = searchValue.replace(/\//g, '\\'); // Help Windows users to search for paths when using slash - } + // Massage search for scoring + searchValue = massageSearchForScoring(searchValue); const searchWithRange = this.extractRange(searchValue); // Find a suitable range from the pattern looking for ":" and "#" if (searchWithRange) { @@ -217,8 +212,7 @@ export class OpenAnythingHandler extends QuickOpenHandler { // Sort const unsortedResultTime = Date.now(); - const normalizedSearchValue = strings.stripWildcards(searchValue); - const compare = (elementA: QuickOpenEntry, elementB: QuickOpenEntry) => compareItemsByScore(elementA, elementB, normalizedSearchValue, true, QuickOpenItemAccessor, this.scorerCache); + const compare = (elementA: QuickOpenEntry, elementB: QuickOpenEntry) => compareItemsByScore(elementA, elementB, searchValue, true, QuickOpenItemAccessor, this.scorerCache); const viewResults = arrays.top(mergedResults, compare, OpenAnythingHandler.MAX_DISPLAYED_RESULTS); const sortedResultTime = Date.now(); @@ -227,7 +221,7 @@ export class OpenAnythingHandler extends QuickOpenHandler { if (entry instanceof FileEntry) { entry.setRange(searchWithRange ? searchWithRange.range : null); - const itemScore = scoreItem(entry, normalizedSearchValue, true, QuickOpenItemAccessor, this.scorerCache); + const itemScore = scoreItem(entry, searchValue, true, QuickOpenItemAccessor, this.scorerCache); entry.setHighlights(itemScore.labelMatch, itemScore.descriptionMatch); } }); From b862b187499fe549920276b833f130fc67d4986e Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Tue, 10 Oct 2017 12:45:36 +0200 Subject: [PATCH 104/158] fix tests --- .../base/parts/quickopen/test/common/quickOpenScorer.test.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/vs/base/parts/quickopen/test/common/quickOpenScorer.test.ts b/src/vs/base/parts/quickopen/test/common/quickOpenScorer.test.ts index ed47435cbc0..b6d972787d2 100644 --- a/src/vs/base/parts/quickopen/test/common/quickOpenScorer.test.ts +++ b/src/vs/base/parts/quickopen/test/common/quickOpenScorer.test.ts @@ -9,6 +9,7 @@ import * as assert from 'assert'; import * as scorer from 'vs/base/parts/quickopen/common/quickOpenScorer'; import URI from 'vs/base/common/uri'; import { basename, dirname } from 'vs/base/common/paths'; +import { isWindows } from 'vs/base/common/platform'; class ResourceAccessorClass implements scorer.IItemAccessor { @@ -476,12 +477,12 @@ suite('Quick Open Scorer', () => { const resourceC = URI.file('node_modules1/bundle/lib/model/modules/modu1/index.js'); const resourceD = URI.file('node_modules1/bundle/lib/model/modules/oddl1/index.js'); - let query = 'modu1/index.js'; + let query = isWindows ? 'modu1\\index.js' : 'modu1/index.js'; let res = [resourceA, resourceB, resourceC, resourceD].sort((r1, r2) => scorer.compareItemsByScore(r1, r2, query, true, ResourceAccessor, cache)); assert.equal(res[0], resourceC); - query = 'un1/index.js'; + query = isWindows ? 'un1\\index.js' : 'un1/index.js'; res = [resourceA, resourceB, resourceC, resourceD].sort((r1, r2) => scorer.compareItemsByScore(r1, r2, query, true, ResourceAccessor, cache)); assert.equal(res[0], resourceB); From aef33be94167f5331a689802d68d37476c2e9729 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Tue, 10 Oct 2017 15:36:42 +0200 Subject: [PATCH 105/158] Missing workspace prevents start of vscode (fixes #35871) --- .../workspaces/electron-main/workspacesMainService.ts | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/vs/platform/workspaces/electron-main/workspacesMainService.ts b/src/vs/platform/workspaces/electron-main/workspacesMainService.ts index c3b3bb22264..8ac75f1fce2 100644 --- a/src/vs/platform/workspaces/electron-main/workspacesMainService.ts +++ b/src/vs/platform/workspaces/electron-main/workspacesMainService.ts @@ -70,7 +70,14 @@ export class WorkspacesMainService implements IWorkspacesMainService { return null; // does not look like a valid workspace config file } - return this.doResolveWorkspace(path, readFileSync(path, 'utf8')); + let contents: string; + try { + contents = readFileSync(path, 'utf8'); + } catch (error) { + return null; // invalid workspace + } + + return this.doResolveWorkspace(path, contents); } private isWorkspacePath(path: string): boolean { From ad42cac7b2cddfa7c6df5bcf8485171ed6c5d0aa Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Tue, 10 Oct 2017 15:41:53 +0200 Subject: [PATCH 106/158] New setting "workbench.editor.labelFormat": "default" does not work (Linux) (fixes #35721) --- src/vs/workbench/browser/parts/editor/tabsTitleControl.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/browser/parts/editor/tabsTitleControl.ts b/src/vs/workbench/browser/parts/editor/tabsTitleControl.ts index fe92a09cb72..3a12c2226cf 100644 --- a/src/vs/workbench/browser/parts/editor/tabsTitleControl.ts +++ b/src/vs/workbench/browser/parts/editor/tabsTitleControl.ts @@ -364,7 +364,7 @@ export class TabsTitleControl extends TitleControl { // Gather duplicate titles, while filtering out invalid descriptions const mapTitleToDuplicates = new Map(); for (const label of labels) { - if (typeof label.description === 'string' && label.description) { + if (typeof label.description === 'string') { getOrSet(mapTitleToDuplicates, label.name, []).push(label); } else { label.description = ''; From 5a8042dbaaa3352f918c50a20d6acd41a6eab0ca Mon Sep 17 00:00:00 2001 From: Beyang Liu Date: Tue, 10 Oct 2017 06:44:39 -0700 Subject: [PATCH 107/158] remove kludge that adds history item when new input is set on an editor (#35682) --- .../parts/files/browser/editors/textFileEditor.ts | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/src/vs/workbench/parts/files/browser/editors/textFileEditor.ts b/src/vs/workbench/parts/files/browser/editors/textFileEditor.ts index 4b70527ce55..b60b3bce030 100644 --- a/src/vs/workbench/parts/files/browser/editors/textFileEditor.ts +++ b/src/vs/workbench/parts/files/browser/editors/textFileEditor.ts @@ -24,7 +24,6 @@ import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; import { IStorageService } from 'vs/platform/storage/common/storage'; import { ITextResourceConfigurationService } from 'vs/editor/common/services/resourceConfiguration'; -import { IHistoryService } from 'vs/workbench/services/history/common/history'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { CancelAction } from 'vs/platform/message/common/message'; import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService'; @@ -47,7 +46,6 @@ export class TextFileEditor extends BaseTextEditor { @IInstantiationService instantiationService: IInstantiationService, @IWorkspaceContextService private contextService: IWorkspaceContextService, @IStorageService storageService: IStorageService, - @IHistoryService private historyService: IHistoryService, @ITextResourceConfigurationService configurationService: ITextResourceConfigurationService, @IWorkbenchEditorService private editorService: IWorkbenchEditorService, @IThemeService themeService: IThemeService, @@ -87,16 +85,6 @@ export class TextFileEditor extends BaseTextEditor { public setInput(input: FileEditorInput, options?: EditorOptions): TPromise { - // We have a current input in this editor and are about to either open a new editor or jump to a different - // selection inside the editor. Thus we store the current selection into the navigation history so that - // a user can navigate back to the exact position he left off. - if (this.input) { - const selection = this.getControl().getSelection(); - if (selection) { - this.historyService.add(this.input, { startLineNumber: selection.startLineNumber, startColumn: selection.startColumn }); - } - } - // Return early for same input unless we force to open const forceOpen = options && options.forceOpen; if (!forceOpen && input.matches(this.input)) { From 4b38a9a5367d7a466ee3043f729fb79e3fc787bd Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Tue, 10 Oct 2017 15:46:48 +0200 Subject: [PATCH 108/158] :lipstick: --- src/vs/workbench/services/history/common/history.ts | 7 +------ src/vs/workbench/test/workbenchTestServices.ts | 5 +---- 2 files changed, 2 insertions(+), 10 deletions(-) diff --git a/src/vs/workbench/services/history/common/history.ts b/src/vs/workbench/services/history/common/history.ts index 4e262196b68..823f3f5f073 100644 --- a/src/vs/workbench/services/history/common/history.ts +++ b/src/vs/workbench/services/history/common/history.ts @@ -5,7 +5,7 @@ 'use strict'; import { createDecorator, ServiceIdentifier } from 'vs/platform/instantiation/common/instantiation'; -import { IEditorInput, IResourceInput, ITextEditorSelection } from 'vs/platform/editor/common/editor'; +import { IEditorInput, IResourceInput } from 'vs/platform/editor/common/editor'; import URI from 'vs/base/common/uri'; export const IHistoryService = createDecorator('historyService'); @@ -19,11 +19,6 @@ export interface IHistoryService { */ reopenLastClosedEditor(): void; - /** - * Add an entry to the navigation stack of the history. - */ - add(input: IEditorInput, selection?: ITextEditorSelection): void; - /** * Navigate forwards in history. * diff --git a/src/vs/workbench/test/workbenchTestServices.ts b/src/vs/workbench/test/workbenchTestServices.ts index e09df0d1813..18d72e4d754 100644 --- a/src/vs/workbench/test/workbenchTestServices.ts +++ b/src/vs/workbench/test/workbenchTestServices.ts @@ -24,7 +24,7 @@ import { IStorageService, StorageScope } from 'vs/platform/storage/common/storag import { IPartService, Parts } from 'vs/workbench/services/part/common/partService'; import { TextModelResolverService } from 'vs/workbench/services/textmodelResolver/common/textModelResolverService'; import { ITextModelService } from 'vs/editor/common/services/resolverService'; -import { IEditorInput, IEditorOptions, Position, Direction, IEditor, IResourceInput, ITextEditorSelection } from 'vs/platform/editor/common/editor'; +import { IEditorInput, IEditorOptions, Position, Direction, IEditor, IResourceInput } from 'vs/platform/editor/common/editor'; import { IUntitledEditorService, UntitledEditorService } from 'vs/workbench/services/untitled/common/untitledEditorService'; import { IMessageService, IConfirmation, IConfirmationResult } from 'vs/platform/message/common/message'; import { IWorkspaceContextService, IWorkspace as IWorkbenchWorkspace, WorkbenchState, IWorkspaceFolder, IWorkspaceFoldersChangeEvent } from 'vs/platform/workspace/common/workspace'; @@ -271,9 +271,6 @@ export class TestHistoryService implements IHistoryService { public reopenLastClosedEditor(): void { } - public add(input: IEditorInput, selection?: ITextEditorSelection): void { - } - public forward(acrossEditors?: boolean): void { } From dfc3c944a46589bd783aedd0b09ebd2ff861e55a Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Tue, 10 Oct 2017 16:05:29 +0200 Subject: [PATCH 109/158] remove unused variable --- extensions/git/src/git.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/extensions/git/src/git.ts b/extensions/git/src/git.ts index 5edc8c6d258..d0f69123a04 100644 --- a/extensions/git/src/git.ts +++ b/extensions/git/src/git.ts @@ -13,7 +13,6 @@ import { EventEmitter } from 'events'; import iconv = require('iconv-lite'); import { assign, uniqBy, groupBy, denodeify, IDisposable, toDisposable, dispose, mkdirp } from './util'; -const readdir = denodeify(fs.readdir); const readfile = denodeify(fs.readFile); export interface IGit { From f593206841221da1a3a49cab08ab166ff240400e Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Tue, 10 Oct 2017 16:29:10 +0200 Subject: [PATCH 110/158] tests --- .../test/common/quickOpenScorer.test.ts | 52 +++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/src/vs/base/parts/quickopen/test/common/quickOpenScorer.test.ts b/src/vs/base/parts/quickopen/test/common/quickOpenScorer.test.ts index b6d972787d2..2df8c19f1ac 100644 --- a/src/vs/base/parts/quickopen/test/common/quickOpenScorer.test.ts +++ b/src/vs/base/parts/quickopen/test/common/quickOpenScorer.test.ts @@ -487,4 +487,56 @@ suite('Quick Open Scorer', () => { res = [resourceA, resourceB, resourceC, resourceD].sort((r1, r2) => scorer.compareItemsByScore(r1, r2, query, true, ResourceAccessor, cache)); assert.equal(res[0], resourceB); }); + + test('compareFilesByScore - avoid match scattering (bug #21019)', function () { + const resourceA = URI.file('app/containers/Services/NetworkData/ServiceDetails/ServiceLoad/index.js'); + const resourceB = URI.file('app/containers/Services/NetworkData/ServiceDetails/ServiceDistribution/index.js'); + const resourceC = URI.file('app/containers/Services/NetworkData/ServiceDetailTabs/ServiceTabs/StatVideo/index.js'); + + let query = 'StatVideoindex'; + + let res = [resourceA, resourceB, resourceC].sort((r1, r2) => scorer.compareItemsByScore(r1, r2, query, true, ResourceAccessor, cache)); + assert.equal(res[0], resourceC); + }); + + test('compareFilesByScore - avoid match scattering (bug #26649)', function () { + const resourceA = URI.file('photobook/src/components/AddPagesButton/index.js'); + const resourceB = URI.file('photobook/src/components/ApprovalPageHeader/index.js'); + const resourceC = URI.file('photobook/src/canvasComponents/BookPage/index.js'); + + let query = 'bookpageIndex'; + + let res = [resourceA, resourceB, resourceC].sort((r1, r2) => scorer.compareItemsByScore(r1, r2, query, true, ResourceAccessor, cache)); + assert.equal(res[0], resourceC); + }); + + test('compareFilesByScore - avoid match scattering (bug #33247)', function () { + const resourceA = URI.file('ui/src/utils/constants.js'); + const resourceB = URI.file('ui/src/ui/Icons/index.js'); + + let query = isWindows ? 'ui\\icons' : 'ui/icons'; + + let res = [resourceA, resourceB].sort((r1, r2) => scorer.compareItemsByScore(r1, r2, query, true, ResourceAccessor, cache)); + assert.equal(res[0], resourceB); + }); + + test('compareFilesByScore - avoid match scattering (bug #33247 comment)', function () { + const resourceA = URI.file('ui/src/components/IDInput/index.js'); + const resourceB = URI.file('ui/src/ui/Input/index.js'); + + let query = isWindows ? 'ui\\input\\index' : 'ui/input/index'; + + let res = [resourceA, resourceB].sort((r1, r2) => scorer.compareItemsByScore(r1, r2, query, true, ResourceAccessor, cache)); + assert.equal(res[0], resourceB); + }); + + test('compareFilesByScore - prefer shorter hit (bug #20546)', function () { + const resourceA = URI.file('editor/core/components/tests/list-view-spec.js'); + const resourceB = URI.file('editor/core/components/list-view.js'); + + let query = 'listview'; + + let res = [resourceA, resourceB].sort((r1, r2) => scorer.compareItemsByScore(r1, r2, query, true, ResourceAccessor, cache)); + assert.equal(res[0], resourceB); + }); }); \ No newline at end of file From a57c8ec73c6a12904323d8047b558d533ce8335c Mon Sep 17 00:00:00 2001 From: Christof Marti Date: Tue, 10 Oct 2017 07:38:44 -0700 Subject: [PATCH 111/158] Disable 'new release' --- .github/new_release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/new_release.yml b/.github/new_release.yml index 3877cb6f8a2..be3fd91e8b1 100644 --- a/.github/new_release.yml +++ b/.github/new_release.yml @@ -1,5 +1,5 @@ { newReleaseLabel: 'new release', newReleases: ['1.17'], - perform: true + perform: false } \ No newline at end of file From 7f9ff2b1c89755a408aa43bbd353f2296e3fafd1 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Thu, 5 Oct 2017 15:35:23 +0200 Subject: [PATCH 112/158] add FileDecorationsService and use it with markers --- .../workbench/electron-browser/workbench.ts | 5 + .../parts/files/browser/views/explorerView.ts | 18 ++- .../files/browser/views/explorerViewer.ts | 7 +- .../markers/browser/markersFileDecorations.ts | 64 +++++++++++ .../browser/markersWorkbenchContributions.ts | 4 +- .../browser/fileDecorations.ts | 53 +++++++++ .../browser/fileDecorationsService.ts | 104 ++++++++++++++++++ 7 files changed, 252 insertions(+), 3 deletions(-) create mode 100644 src/vs/workbench/parts/markers/browser/markersFileDecorations.ts create mode 100644 src/vs/workbench/services/fileDecorations/browser/fileDecorations.ts create mode 100644 src/vs/workbench/services/fileDecorations/browser/fileDecorationsService.ts diff --git a/src/vs/workbench/electron-browser/workbench.ts b/src/vs/workbench/electron-browser/workbench.ts index c565be4c877..0a894a8df22 100644 --- a/src/vs/workbench/electron-browser/workbench.ts +++ b/src/vs/workbench/electron-browser/workbench.ts @@ -98,6 +98,8 @@ import { KeyMod, KeyCode } from 'vs/base/common/keyCodes'; import { IWorkspaceEditingService } from 'vs/workbench/services/workspace/common/workspaceEditing'; import { WorkspaceEditingService } from 'vs/workbench/services/workspace/node/workspaceEditingService'; import URI from 'vs/base/common/uri'; +import { FileDecorationsService } from 'vs/workbench/services/fileDecorations/browser/fileDecorationsService'; +import { IFileDecorationsService } from 'vs/workbench/services/fileDecorations/browser/fileDecorations'; export const MessagesVisibleContext = new RawContextKey('globalMessageVisible', false); export const EditorsVisibleContext = new RawContextKey('editorIsOpen', false); @@ -583,6 +585,9 @@ export class Workbench implements IPartService { // Text File Service serviceCollection.set(ITextFileService, new SyncDescriptor(TextFileService)); + // File Decorations + serviceCollection.set(IFileDecorationsService, new SyncDescriptor(FileDecorationsService)); + // SCM Service serviceCollection.set(ISCMService, new SyncDescriptor(SCMService)); diff --git a/src/vs/workbench/parts/files/browser/views/explorerView.ts b/src/vs/workbench/parts/files/browser/views/explorerView.ts index eb9f3dbdc9b..20fc00c0ff2 100644 --- a/src/vs/workbench/parts/files/browser/views/explorerView.ts +++ b/src/vs/workbench/parts/files/browser/views/explorerView.ts @@ -45,6 +45,7 @@ import { IWorkbenchThemeService, IFileIconTheme } from 'vs/workbench/services/th import { isLinux } from 'vs/base/common/platform'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { attachListStyler } from 'vs/platform/theme/common/styler'; +import { IFileDecorationsService } from 'vs/workbench/services/fileDecorations/browser/fileDecorations'; export interface IExplorerViewOptions extends IViewletViewOptions { viewletState: FileViewletState; @@ -98,7 +99,8 @@ export class ExplorerView extends ViewsViewletPanel { @IContextKeyService contextKeyService: IContextKeyService, @IConfigurationService private configurationService: IConfigurationService, @IWorkbenchThemeService private themeService: IWorkbenchThemeService, - @IEnvironmentService private environmentService: IEnvironmentService + @IEnvironmentService private environmentService: IEnvironmentService, + @IFileDecorationsService private fileDecorationsService: IFileDecorationsService ) { super({ ...(options as IViewOptions), ariaHeaderLabel: nls.localize('explorerSection', "Files Explorer Section") }, keybindingService, contextMenuService); @@ -166,6 +168,7 @@ export class ExplorerView extends ViewsViewletPanel { this.disposables.push(this.themeService.onDidFileIconThemeChange(onFileIconThemeChange)); this.disposables.push(this.contextService.onDidChangeWorkspaceFolders(e => this.refreshFromEvent(e.added))); this.disposables.push(this.contextService.onDidChangeWorkbenchState(e => this.refreshFromEvent())); + this.disposables.push(this.fileDecorationsService.onDidChangeFileDecoration(this.onDidChangeFileDecorations, this)); onFileIconThemeChange(this.themeService.getFileIconTheme()); } @@ -681,6 +684,19 @@ export class ExplorerView extends ViewsViewletPanel { })); } + private onDidChangeFileDecorations(uris: URI[]): void { + let seen = new Set(); + let stack = uris.map(uri => this.model.findClosest(uri)); + while (stack.length > 0) { + let stat = stack.shift(); + if (stat && !seen.has(stat)) { + this.explorerViewer.refresh(stat, false); + stack.push(stat.parent); + seen.add(stat); + } + } + } + private refreshFromEvent(newRoots: IWorkspaceFolder[] = []): void { if (this.isVisible()) { this.explorerRefreshDelayer.trigger(() => { diff --git a/src/vs/workbench/parts/files/browser/views/explorerViewer.ts b/src/vs/workbench/parts/files/browser/views/explorerViewer.ts index d60aa33d4d8..a2eaf2bdb45 100644 --- a/src/vs/workbench/parts/files/browser/views/explorerViewer.ts +++ b/src/vs/workbench/parts/files/browser/views/explorerViewer.ts @@ -58,6 +58,7 @@ import { IEnvironmentService } from 'vs/platform/environment/common/environment' import { getPathLabel } from 'vs/base/common/labels'; import { extractResources } from 'vs/base/browser/dnd'; import { IConfigurationEditingService, ConfigurationTarget } from 'vs/workbench/services/configuration/common/configurationEditing'; +import { IFileDecorationsService } from 'vs/workbench/services/fileDecorations/browser/fileDecorations'; export class FileDataSource implements IDataSource { constructor( @@ -290,7 +291,8 @@ export class FileRenderer implements IRenderer { state: FileViewletState, @IContextViewService private contextViewService: IContextViewService, @IInstantiationService private instantiationService: IInstantiationService, - @IThemeService private themeService: IThemeService + @IThemeService private themeService: IThemeService, + @IFileDecorationsService private decorationsService: IFileDecorationsService ) { this.state = state; } @@ -324,6 +326,9 @@ export class FileRenderer implements IRenderer { extraClasses.push('nonexistent-root'); } templateData.label.setFile(stat.resource, { hidePath: true, fileKind: stat.isRoot ? FileKind.ROOT_FOLDER : stat.isDirectory ? FileKind.FOLDER : FileKind.FILE, extraClasses }); + + let top = this.decorationsService.getTopDecoration(stat.resource, stat.isDirectory); + templateData.label.element.style.color = top ? top.color.toString() : ''; } // Input Box diff --git a/src/vs/workbench/parts/markers/browser/markersFileDecorations.ts b/src/vs/workbench/parts/markers/browser/markersFileDecorations.ts new file mode 100644 index 00000000000..9030dd7375e --- /dev/null +++ b/src/vs/workbench/parts/markers/browser/markersFileDecorations.ts @@ -0,0 +1,64 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +'use strict'; + +import { IWorkbenchContribution, IWorkbenchContributionsRegistry, Extensions } from 'vs/workbench/common/contributions'; +import { IMarkerService, IMarker } from 'vs/platform/markers/common/markers'; +import { IFileDecorationsService, DecorationType, IFileDecorationData } from 'vs/workbench/services/fileDecorations/browser/fileDecorations'; +import { IDisposable, dispose } from 'vs/base/common/lifecycle'; +import URI from 'vs/base/common/uri'; +import { localize } from 'vs/nls'; +import { isFalsyOrEmpty } from 'vs/base/common/arrays'; +import { Registry } from 'vs/platform/registry/common/platform'; +import Severity from 'vs/base/common/severity'; +import { IThemeService } from 'vs/platform/theme/common/themeService'; +import { editorErrorForeground, editorWarningForeground } from 'vs/editor/common/view/editorColorRegistry'; + +class MarkersFileDecorations implements IWorkbenchContribution { + + private readonly _disposables: IDisposable[]; + private readonly _type: DecorationType; + + constructor( + @IMarkerService private _markerService: IMarkerService, + @IFileDecorationsService private _decorationsService: IFileDecorationsService, + @IThemeService private _themeService: IThemeService + ) { + // + this._disposables = [ + this._markerService.onMarkerChanged(this._onDidChangeMarker, this), + this._type = this._decorationsService.registerDecorationType(localize('errorAndWarnings', "Errors & Warnings")) + ]; + } + + dispose(): void { + dispose(this._disposables); + } + + getId(): string { + return 'markers.MarkersFileDecorations'; + } + + private _onDidChangeMarker(resources: URI[]): void { + for (const resource of resources) { + const markers = this._markerService.read({ resource }); + if (!isFalsyOrEmpty(markers)) { + const data = markers.map(this._toFileDecorationData, this); + this._decorationsService.setFileDecorations(this._type, resource, data); + } else { + this._decorationsService.unsetFileDecorations(this._type, resource); + } + } + } + + private _toFileDecorationData(marker: IMarker): IFileDecorationData { + const { message, severity } = marker; + const color = this._themeService.getTheme().getColor(severity === Severity.Error ? editorErrorForeground : editorWarningForeground); + return { message, severity, color }; + } +} + +Registry.as(Extensions.Workbench).registerWorkbenchContribution(MarkersFileDecorations); diff --git a/src/vs/workbench/parts/markers/browser/markersWorkbenchContributions.ts b/src/vs/workbench/parts/markers/browser/markersWorkbenchContributions.ts index d6b4f686ffd..5c20e92410b 100644 --- a/src/vs/workbench/parts/markers/browser/markersWorkbenchContributions.ts +++ b/src/vs/workbench/parts/markers/browser/markersWorkbenchContributions.ts @@ -17,6 +17,8 @@ import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; import { IPanelService } from 'vs/workbench/services/panel/common/panelService'; import { MarkersPanel } from 'vs/workbench/parts/markers/browser/markersPanel'; +import './markersFileDecorations'; + export function registerContributions(): void { KeybindingsRegistry.registerCommandAndKeybindingRule({ @@ -66,4 +68,4 @@ export function registerContributions(): void { // Retaining old action to show errors and warnings, so that custom bindings to this action for existing users works. registry.registerWorkbenchAction(new SyncActionDescriptor(ToggleErrorsAndWarningsAction, ToggleErrorsAndWarningsAction.ID, ToggleErrorsAndWarningsAction.LABEL), 'Show Errors and Warnings'); -} \ No newline at end of file +} diff --git a/src/vs/workbench/services/fileDecorations/browser/fileDecorations.ts b/src/vs/workbench/services/fileDecorations/browser/fileDecorations.ts new file mode 100644 index 00000000000..3bb20dba223 --- /dev/null +++ b/src/vs/workbench/services/fileDecorations/browser/fileDecorations.ts @@ -0,0 +1,53 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +'use strict'; + +import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; +import { Color } from 'vs/base/common/color'; +import URI from 'vs/base/common/uri'; +import Event from 'vs/base/common/event'; +import Severity from 'vs/base/common/severity'; + +export const IFileDecorationsService = createDecorator('IFileDecorationsService'); + +export interface IFileDecoration { + readonly type: DecorationType; + readonly message: string; + readonly color: Color; + readonly severity: Severity; +} + +export abstract class DecorationType { + readonly label: string; + protected constructor(label: string) { + this.label = label; + } + dispose(): void { + // + } +} + +export interface IFileDecorationData { + message: string; + color: Color; + severity: Severity; +} + +export interface IFileDecorationsService { + + readonly _serviceBrand: any; + + readonly onDidChangeFileDecoration: Event; + + registerDecorationType(label: string): DecorationType; + + setFileDecorations(type: DecorationType, target: URI, data: IFileDecorationData[]): void; + + unsetFileDecorations(type: DecorationType, target: URI): void; + + getDecorations(uri: URI, includeChildren: boolean): IFileDecoration[]; + + getTopDecoration(uri: URI, includeChildren: boolean): IFileDecoration; +} diff --git a/src/vs/workbench/services/fileDecorations/browser/fileDecorationsService.ts b/src/vs/workbench/services/fileDecorations/browser/fileDecorationsService.ts new file mode 100644 index 00000000000..392f6ece311 --- /dev/null +++ b/src/vs/workbench/services/fileDecorations/browser/fileDecorationsService.ts @@ -0,0 +1,104 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +'use strict'; + +import URI from 'vs/base/common/uri'; +import Severity from 'vs/base/common/severity'; +import Event, { Emitter, debounceEvent } from 'vs/base/common/event'; +import { IFileDecorationsService, IFileDecoration, DecorationType, IFileDecorationData } from 'vs/workbench/services/fileDecorations/browser/fileDecorations'; +import { TernarySearchTree } from 'vs/base/common/map'; +import { mergeSort, isFalsyOrEmpty } from 'vs/base/common/arrays'; + + +export class FileDecorationsService implements IFileDecorationsService { + + readonly _serviceBrand; + + private readonly _onDidChangeFileDecoration = new Emitter(); + private readonly _types = new Map>(); + + readonly onDidChangeFileDecoration: Event = debounceEvent( + this._onDidChangeFileDecoration.event, + (last, current) => { + if (!last) { + last = []; + } + last.push(current); + return last; + } + ); + + registerDecorationType(label: string): DecorationType { + const outer = this; + const type = new class extends DecorationType { + constructor() { + super(label); + } + dispose() { + outer._types.delete(type); + } + }; + this._types.set(type, TernarySearchTree.forPaths()); + return type; + } + + setFileDecorations(type: DecorationType, target: URI, data: IFileDecorationData[]): void { + let decorations = mergeSort(data.map(data => ({ type, ...data })), FileDecorationsService._compareFileDecorationsBySeverity); + this._types.get(type).set(target.toString(), decorations); + this._onDidChangeFileDecoration.fire(target); + } + + unsetFileDecorations(type: DecorationType, target: URI): void { + this._types.get(type).delete(target.toString()); + this._onDidChangeFileDecoration.fire(target); + } + + getDecorations(uri: URI, includeChildren: boolean): IFileDecoration[] { + let ret: IFileDecoration[] = []; + this._someFileDecoration(uri, includeChildren, decoration => { + ret.push(decoration); + return false; + }); + return ret; + } + + getTopDecoration(uri: URI, includeChildren: boolean): IFileDecoration { + let top: IFileDecoration; + this._someFileDecoration(uri, includeChildren, decoration => { + // top is the most severe one, + // stop as soon as an error is found + if (!top || FileDecorationsService._compareFileDecorationsBySeverity(top, decoration) > 0) { + top = decoration; + } + return top.severity === Severity.Error; + }); + return top; + } + + private _someFileDecoration(uri: URI, includeChildren: boolean, callback: (a: IFileDecoration) => boolean): void { + let key = uri.toString(); + let done = false; + this._types.forEach(tree => { + if (done) { + return; + } + if (includeChildren) { + let newTree = tree.findSuperstr(key); + if (newTree) { + newTree.forEach(([, data]) => done = done || data.some(callback)); + } + } else { + let list = tree.get(key); + if (!isFalsyOrEmpty(list)) { + done = list.some(callback); + } + } + }); + } + + private static _compareFileDecorationsBySeverity(a: IFileDecoration, b: IFileDecoration): number { + return Severity.compare(a.severity, b.severity); + } +} From 9fa1f52ac2f33ddf62ec37b093a81a39a00a3162 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Thu, 5 Oct 2017 16:48:12 +0200 Subject: [PATCH 113/158] start with scm file decorations --- .../scm/electron-browser/scm.contribution.ts | 4 + .../electron-browser/scmFileDecorations.ts | 94 +++++++++++++++++++ .../browser/fileDecorationsService.ts | 6 +- 3 files changed, 103 insertions(+), 1 deletion(-) create mode 100644 src/vs/workbench/parts/scm/electron-browser/scmFileDecorations.ts diff --git a/src/vs/workbench/parts/scm/electron-browser/scm.contribution.ts b/src/vs/workbench/parts/scm/electron-browser/scm.contribution.ts index b5ee2acfc51..93da15cee69 100644 --- a/src/vs/workbench/parts/scm/electron-browser/scm.contribution.ts +++ b/src/vs/workbench/parts/scm/electron-browser/scm.contribution.ts @@ -17,6 +17,7 @@ import { SyncActionDescriptor } from 'vs/platform/actions/common/actions'; import { IViewletService } from 'vs/workbench/services/viewlet/browser/viewlet'; import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService'; import { StatusUpdater, StatusBarController } from './scmActivity'; +import { FileDecorations } from './scmFileDecorations'; import { SCMViewlet } from 'vs/workbench/parts/scm/electron-browser/scmViewlet'; class OpenSCMViewletAction extends ToggleViewletAction { @@ -49,6 +50,9 @@ Registry.as(WorkbenchExtensions.Workbench) Registry.as(WorkbenchExtensions.Workbench) .registerWorkbenchContribution(StatusBarController); +Registry.as(WorkbenchExtensions.Workbench) + .registerWorkbenchContribution(FileDecorations); + // Register Action to Open Viewlet Registry.as(WorkbenchActionExtensions.WorkbenchActions).registerWorkbenchAction( new SyncActionDescriptor(OpenSCMViewletAction, VIEWLET_ID, localize('toggleSCMViewlet', "Show SCM"), { diff --git a/src/vs/workbench/parts/scm/electron-browser/scmFileDecorations.ts b/src/vs/workbench/parts/scm/electron-browser/scmFileDecorations.ts new file mode 100644 index 00000000000..ff401a62713 --- /dev/null +++ b/src/vs/workbench/parts/scm/electron-browser/scmFileDecorations.ts @@ -0,0 +1,94 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +'use strict'; + +import { IWorkbenchContribution } from 'vs/workbench/common/contributions'; +import { IFileDecorationsService } from 'vs/workbench/services/fileDecorations/browser/fileDecorations'; +import { IDisposable, dispose } from 'vs/base/common/lifecycle'; +import { ISCMService, ISCMRepository } from 'vs/workbench/services/scm/common/scm'; +import URI from 'vs/base/common/uri'; +import Severity from 'vs/base/common/severity'; +import { Color } from 'vs/base/common/color'; + +export class FileDecorations implements IWorkbenchContribution { + + private readonly _disposables: IDisposable[]; + // private readonly _type: DecorationType; + private readonly _repositoryListeners = new Map(); + + constructor( + @IFileDecorationsService private _decorationsService: IFileDecorationsService, + @ISCMService private _scmService: ISCMService, + ) { + this._scmService.repositories.forEach(this._onDidAddRepository, this); + this._disposables = [ + this._scmService.onDidAddRepository(this._onDidAddRepository, this), + this._scmService.onDidRemoveRepository(this._onDidRemoveRepository, this), + ]; + } + + dispose(): void { + dispose(this._disposables); + } + + private _onDidAddRepository(repo: ISCMRepository): void { + const type = this._decorationsService.registerDecorationType(repo.provider.label); + const { provider } = repo; + + let oldDecorations = new Map(); + const listener = provider.onDidChangeResources(() => { + + let newDecorations = new Map(); + let baseColor = Color.fromHex('#007acc'); + let factor = 0.0; + for (const group of provider.resources) { + + factor += 0.1; + let color = Color.getDarkerColor(baseColor, Color.black, factor); + + for (const resource of group.resourceCollection.resources) { + + this._decorationsService.setFileDecorations(type, resource.sourceUri, [{ + severity: Severity.Info, + message: resource.decorations.tooltip, + color + }]); + + newDecorations.set(resource.sourceUri.toString(), resource.sourceUri); + } + } + + oldDecorations.forEach((value, key) => { + if (!newDecorations.has(key)) { + this._decorationsService.unsetFileDecorations(type, value); + } + }); + + oldDecorations = newDecorations; + }); + + this._repositoryListeners.set(repo, { + dispose() { + listener.dispose(); + type.dispose(); + } + }); + } + + private _onDidRemoveRepository(repo: ISCMRepository): void { + let listener = this._repositoryListeners.get(repo); + if (listener) { + this._repositoryListeners.delete(repo); + listener.dispose(); + } + } + + + getId(): string { + throw new Error('smc.SCMFileDecorations'); + } + +} diff --git a/src/vs/workbench/services/fileDecorations/browser/fileDecorationsService.ts b/src/vs/workbench/services/fileDecorations/browser/fileDecorationsService.ts index 392f6ece311..a7c225ba106 100644 --- a/src/vs/workbench/services/fileDecorations/browser/fileDecorationsService.ts +++ b/src/vs/workbench/services/fileDecorations/browser/fileDecorationsService.ts @@ -37,7 +37,11 @@ export class FileDecorationsService implements IFileDecorationsService { super(label); } dispose() { - outer._types.delete(type); + let tree = outer._types.get(type); + if (tree) { + tree.forEach(([key]) => outer._onDidChangeFileDecoration.fire(URI.parse(key))); + outer._types.delete(type); + } } }; this._types.set(type, TernarySearchTree.forPaths()); From b5b3208739386fb151d68313505df4e78255fd4c Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Thu, 5 Oct 2017 17:12:13 +0200 Subject: [PATCH 114/158] one scm color --- .../parts/scm/electron-browser/scmFileDecorations.ts | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/vs/workbench/parts/scm/electron-browser/scmFileDecorations.ts b/src/vs/workbench/parts/scm/electron-browser/scmFileDecorations.ts index ff401a62713..13f3ffb8f8e 100644 --- a/src/vs/workbench/parts/scm/electron-browser/scmFileDecorations.ts +++ b/src/vs/workbench/parts/scm/electron-browser/scmFileDecorations.ts @@ -42,15 +42,13 @@ export class FileDecorations implements IWorkbenchContribution { const listener = provider.onDidChangeResources(() => { let newDecorations = new Map(); - let baseColor = Color.fromHex('#007acc'); - let factor = 0.0; + let color = Color.fromHex('#007aCC'); + for (const group of provider.resources) { - factor += 0.1; - let color = Color.getDarkerColor(baseColor, Color.black, factor); - for (const resource of group.resourceCollection.resources) { - + // TODO@Joh have a better color and icon which is based + // on the resource decoration this._decorationsService.setFileDecorations(type, resource.sourceUri, [{ severity: Severity.Info, message: resource.decorations.tooltip, From 040f338dda89673e4ce0c13716cfc3a574ca4d84 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Fri, 6 Oct 2017 09:40:29 +0200 Subject: [PATCH 115/158] refine service, allow to set only one decoration per type and resource --- .../markers/browser/markersFileDecorations.ts | 10 ++++---- .../electron-browser/scmFileDecorations.ts | 6 ++--- .../browser/fileDecorations.ts | 4 ++-- .../browser/fileDecorationsService.ts | 23 ++++++++----------- 4 files changed, 20 insertions(+), 23 deletions(-) diff --git a/src/vs/workbench/parts/markers/browser/markersFileDecorations.ts b/src/vs/workbench/parts/markers/browser/markersFileDecorations.ts index 9030dd7375e..b5dad47b841 100644 --- a/src/vs/workbench/parts/markers/browser/markersFileDecorations.ts +++ b/src/vs/workbench/parts/markers/browser/markersFileDecorations.ts @@ -44,12 +44,14 @@ class MarkersFileDecorations implements IWorkbenchContribution { private _onDidChangeMarker(resources: URI[]): void { for (const resource of resources) { - const markers = this._markerService.read({ resource }); + const markers = this._markerService.read({ resource }) + .sort((a, b) => Severity.compare(a.severity, b.severity)); + if (!isFalsyOrEmpty(markers)) { - const data = markers.map(this._toFileDecorationData, this); - this._decorationsService.setFileDecorations(this._type, resource, data); + const data = this._toFileDecorationData(markers[0]); + this._decorationsService.setFileDecoration(this._type, resource, data); } else { - this._decorationsService.unsetFileDecorations(this._type, resource); + this._decorationsService.unsetFileDecoration(this._type, resource); } } } diff --git a/src/vs/workbench/parts/scm/electron-browser/scmFileDecorations.ts b/src/vs/workbench/parts/scm/electron-browser/scmFileDecorations.ts index 13f3ffb8f8e..59509fd3c01 100644 --- a/src/vs/workbench/parts/scm/electron-browser/scmFileDecorations.ts +++ b/src/vs/workbench/parts/scm/electron-browser/scmFileDecorations.ts @@ -49,11 +49,11 @@ export class FileDecorations implements IWorkbenchContribution { for (const resource of group.resourceCollection.resources) { // TODO@Joh have a better color and icon which is based // on the resource decoration - this._decorationsService.setFileDecorations(type, resource.sourceUri, [{ + this._decorationsService.setFileDecoration(type, resource.sourceUri, { severity: Severity.Info, message: resource.decorations.tooltip, color - }]); + }); newDecorations.set(resource.sourceUri.toString(), resource.sourceUri); } @@ -61,7 +61,7 @@ export class FileDecorations implements IWorkbenchContribution { oldDecorations.forEach((value, key) => { if (!newDecorations.has(key)) { - this._decorationsService.unsetFileDecorations(type, value); + this._decorationsService.unsetFileDecoration(type, value); } }); diff --git a/src/vs/workbench/services/fileDecorations/browser/fileDecorations.ts b/src/vs/workbench/services/fileDecorations/browser/fileDecorations.ts index 3bb20dba223..15e1feb21d4 100644 --- a/src/vs/workbench/services/fileDecorations/browser/fileDecorations.ts +++ b/src/vs/workbench/services/fileDecorations/browser/fileDecorations.ts @@ -43,9 +43,9 @@ export interface IFileDecorationsService { registerDecorationType(label: string): DecorationType; - setFileDecorations(type: DecorationType, target: URI, data: IFileDecorationData[]): void; + setFileDecoration(type: DecorationType, target: URI, data: IFileDecorationData): void; - unsetFileDecorations(type: DecorationType, target: URI): void; + unsetFileDecoration(type: DecorationType, target: URI): void; getDecorations(uri: URI, includeChildren: boolean): IFileDecoration[]; diff --git a/src/vs/workbench/services/fileDecorations/browser/fileDecorationsService.ts b/src/vs/workbench/services/fileDecorations/browser/fileDecorationsService.ts index a7c225ba106..e4f2932b524 100644 --- a/src/vs/workbench/services/fileDecorations/browser/fileDecorationsService.ts +++ b/src/vs/workbench/services/fileDecorations/browser/fileDecorationsService.ts @@ -9,15 +9,13 @@ import Severity from 'vs/base/common/severity'; import Event, { Emitter, debounceEvent } from 'vs/base/common/event'; import { IFileDecorationsService, IFileDecoration, DecorationType, IFileDecorationData } from 'vs/workbench/services/fileDecorations/browser/fileDecorations'; import { TernarySearchTree } from 'vs/base/common/map'; -import { mergeSort, isFalsyOrEmpty } from 'vs/base/common/arrays'; - export class FileDecorationsService implements IFileDecorationsService { readonly _serviceBrand; private readonly _onDidChangeFileDecoration = new Emitter(); - private readonly _types = new Map>(); + private readonly _types = new Map>(); readonly onDidChangeFileDecoration: Event = debounceEvent( this._onDidChangeFileDecoration.event, @@ -44,17 +42,16 @@ export class FileDecorationsService implements IFileDecorationsService { } } }; - this._types.set(type, TernarySearchTree.forPaths()); + this._types.set(type, TernarySearchTree.forPaths()); return type; } - setFileDecorations(type: DecorationType, target: URI, data: IFileDecorationData[]): void { - let decorations = mergeSort(data.map(data => ({ type, ...data })), FileDecorationsService._compareFileDecorationsBySeverity); - this._types.get(type).set(target.toString(), decorations); + setFileDecoration(type: DecorationType, target: URI, data: IFileDecorationData): void { + this._types.get(type).set(target.toString(), { type, ...data }); this._onDidChangeFileDecoration.fire(target); } - unsetFileDecorations(type: DecorationType, target: URI): void { + unsetFileDecoration(type: DecorationType, target: URI): void { this._types.get(type).delete(target.toString()); this._onDidChangeFileDecoration.fire(target); } @@ -76,7 +73,7 @@ export class FileDecorationsService implements IFileDecorationsService { if (!top || FileDecorationsService._compareFileDecorationsBySeverity(top, decoration) > 0) { top = decoration; } - return top.severity === Severity.Error; + return top !== undefined && top.severity === Severity.Error; }); return top; } @@ -91,13 +88,11 @@ export class FileDecorationsService implements IFileDecorationsService { if (includeChildren) { let newTree = tree.findSuperstr(key); if (newTree) { - newTree.forEach(([, data]) => done = done || data.some(callback)); + newTree.forEach(([, deco]) => done = done || callback(deco)); } } else { - let list = tree.get(key); - if (!isFalsyOrEmpty(list)) { - done = list.some(callback); - } + let deco = tree.get(key); + done = done || deco && callback(deco); } }); } From e980c39e60bf00a312228905031277278cd17edf Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Fri, 6 Oct 2017 10:10:40 +0200 Subject: [PATCH 116/158] add setting 'problems.showOnFiles' --- .../markers/browser/markersFileDecorations.ts | 20 +++++++++++++++++-- .../browser/markersWorkbenchContributions.ts | 16 +++++++++++++++ 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/parts/markers/browser/markersFileDecorations.ts b/src/vs/workbench/parts/markers/browser/markersFileDecorations.ts index b5dad47b841..dae31174494 100644 --- a/src/vs/workbench/parts/markers/browser/markersFileDecorations.ts +++ b/src/vs/workbench/parts/markers/browser/markersFileDecorations.ts @@ -16,25 +16,31 @@ import { Registry } from 'vs/platform/registry/common/platform'; import Severity from 'vs/base/common/severity'; import { IThemeService } from 'vs/platform/theme/common/themeService'; import { editorErrorForeground, editorWarningForeground } from 'vs/editor/common/view/editorColorRegistry'; +import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; class MarkersFileDecorations implements IWorkbenchContribution { private readonly _disposables: IDisposable[]; private readonly _type: DecorationType; + private _markerListener: IDisposable; constructor( @IMarkerService private _markerService: IMarkerService, @IFileDecorationsService private _decorationsService: IFileDecorationsService, - @IThemeService private _themeService: IThemeService + @IThemeService private _themeService: IThemeService, + @IConfigurationService private _configurationService: IConfigurationService ) { // this._disposables = [ - this._markerService.onMarkerChanged(this._onDidChangeMarker, this), + this._configurationService.onDidUpdateConfiguration(this._updateEnablement, this), this._type = this._decorationsService.registerDecorationType(localize('errorAndWarnings', "Errors & Warnings")) ]; + + this._updateEnablement(); } dispose(): void { + dispose(this._markerListener); dispose(this._disposables); } @@ -42,6 +48,16 @@ class MarkersFileDecorations implements IWorkbenchContribution { return 'markers.MarkersFileDecorations'; } + private _updateEnablement(): void { + let value = this._configurationService.getConfiguration<{ showOnFiles: boolean }>('problems'); + if (value) { + this._markerListener = this._markerService.onMarkerChanged(this._onDidChangeMarker, this); + this._onDidChangeMarker(this._markerService.read().map(marker => marker.resource)); + } else if (this._markerListener) { + this._markerListener.dispose(); + } + } + private _onDidChangeMarker(resources: URI[]): void { for (const resource of resources) { const markers = this._markerService.read({ resource }) diff --git a/src/vs/workbench/parts/markers/browser/markersWorkbenchContributions.ts b/src/vs/workbench/parts/markers/browser/markersWorkbenchContributions.ts index 5c20e92410b..45e7ca37718 100644 --- a/src/vs/workbench/parts/markers/browser/markersWorkbenchContributions.ts +++ b/src/vs/workbench/parts/markers/browser/markersWorkbenchContributions.ts @@ -18,6 +18,7 @@ import { IPanelService } from 'vs/workbench/services/panel/common/panelService'; import { MarkersPanel } from 'vs/workbench/parts/markers/browser/markersPanel'; import './markersFileDecorations'; +import { localize } from 'vs/nls'; export function registerContributions(): void { @@ -50,6 +51,21 @@ export function registerContributions(): void { } }); + Registry.as(Extensions.Configuration).registerConfiguration({ + 'id': 'problems', + 'order': 101, + 'type': 'object', + 'properties': { + 'problems.showOnFiles': { + 'description': localize('markers.showOnFile', "Show Errors & Warnings in the file explorer."), + 'type': 'boolean', + 'default': true + } + } + }); + + + // markers panel Registry.as(PanelExtensions.Panels).registerPanel(new PanelDescriptor( MarkersPanel, From 5c109769f0d9a2bf3af51e978f5e4558bf3b9177 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Fri, 6 Oct 2017 11:40:24 +0200 Subject: [PATCH 117/158] use ColorIdentifier instead of Color, define some git colors for untracked, modifed, and ignored --- extensions/git/package.json | 33 +++++++++++++++++-- extensions/git/src/repository.ts | 19 +++++++++-- src/vs/vscode.d.ts | 6 ++++ .../api/electron-browser/mainThreadSCM.ts | 5 +-- src/vs/workbench/api/node/extHost.protocol.ts | 3 +- src/vs/workbench/api/node/extHostSCM.ts | 3 +- .../files/browser/views/explorerViewer.ts | 4 ++- .../markers/browser/markersFileDecorations.ts | 4 +-- .../electron-browser/scmFileDecorations.ts | 12 +++---- .../browser/fileDecorations.ts | 6 ++-- src/vs/workbench/services/scm/common/scm.ts | 4 ++- 11 files changed, 76 insertions(+), 23 deletions(-) diff --git a/extensions/git/package.json b/extensions/git/package.json index 3dbdb6604bf..c8408252664 100644 --- a/extensions/git/package.json +++ b/extensions/git/package.json @@ -803,7 +803,36 @@ "default": false } } - } + }, + "colors": [ + { + "id": "git.color.untracked", + "description": "Color for untracked resources", + "defaults": { + "light": "#b47d16", + "dark": "#cf9425", + "highContrast": "#cf9425" + } + }, + { + "id": "git.color.modified", + "description": "Color for modified resources", + "defaults": { + "light": "#007acc", + "dark": "#007acc", + "highContrast": "#007acc" + } + }, + { + "id": "git.color.ignored", + "description": "Color for ignored resources", + "defaults": { + "light": "#00000033", + "dark": "#ffffff33", + "highContrast": "#ffffff33" + } + } + ] }, "dependencies": { "byline": "^5.0.0", @@ -816,4 +845,4 @@ "@types/node": "7.0.43", "mocha": "^3.2.0" } -} \ No newline at end of file +} diff --git a/extensions/git/src/repository.ts b/extensions/git/src/repository.ts index da154939744..465c9211f70 100644 --- a/extensions/git/src/repository.ts +++ b/extensions/git/src/repository.ts @@ -5,7 +5,7 @@ 'use strict'; -import { Uri, Command, EventEmitter, Event, scm, SourceControl, SourceControlInputBox, SourceControlResourceGroup, SourceControlResourceState, SourceControlResourceDecorations, Disposable, ProgressLocation, window, workspace, WorkspaceEdit } from 'vscode'; +import { Uri, Command, EventEmitter, Event, scm, SourceControl, SourceControlInputBox, SourceControlResourceGroup, SourceControlResourceState, SourceControlResourceDecorations, Disposable, ProgressLocation, window, workspace, WorkspaceEdit, ThemeColor } from 'vscode'; import { Repository as BaseRepository, Ref, Branch, Remote, Commit, GitErrorCodes, Stash, RefType } from './git'; import { anyEvent, filterEvent, eventToPromise, dispose, find } from './util'; import { memoize, throttle, debounce } from './decorators'; @@ -170,14 +170,29 @@ export class Resource implements SourceControlResourceState { // return this.resourceUri.fsPath.substr(0, workspaceRootPath.length) !== workspaceRootPath; } + private get color(): ThemeColor | undefined { + switch (this.type) { + case Status.INDEX_MODIFIED: + case Status.MODIFIED: + return new ThemeColor('git.color.modified'); + case Status.UNTRACKED: + return new ThemeColor('git.color.untracked'); + case Status.IGNORED: + return new ThemeColor('git.color.ignored'); + default: + return undefined; + } + } + get decorations(): SourceControlResourceDecorations { const light = { iconPath: this.getIconPath('light') }; const dark = { iconPath: this.getIconPath('dark') }; const tooltip = this.tooltip; const strikeThrough = this.strikeThrough; const faded = this.faded; + const color = this.color; - return { strikeThrough, faded, tooltip, light, dark }; + return { strikeThrough, faded, tooltip, light, dark, color }; } constructor( diff --git a/src/vs/vscode.d.ts b/src/vs/vscode.d.ts index 1a63221b1f9..d81912cebe7 100644 --- a/src/vs/vscode.d.ts +++ b/src/vs/vscode.d.ts @@ -5630,6 +5630,12 @@ declare module 'vscode' { */ readonly tooltip?: string; + /** + * A color for a specific + * [source control resource state](#SourceControlResourceState). + */ + readonly color?: ThemeColor; + /** * The light theme decorations. */ diff --git a/src/vs/workbench/api/electron-browser/mainThreadSCM.ts b/src/vs/workbench/api/electron-browser/mainThreadSCM.ts index 64253cfa2d4..69b253930b7 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadSCM.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadSCM.ts @@ -182,7 +182,7 @@ class MainThreadSCMProvider implements ISCMProvider { for (const [start, deleteCount, rawResources] of groupSlices) { const resources = rawResources.map(rawResource => { - const [handle, sourceUri, icons, tooltip, strikeThrough, faded] = rawResource; + const [handle, sourceUri, icons, tooltip, strikeThrough, faded, color] = rawResource; const icon = icons[0]; const iconDark = icons[1] || icon; const decorations = { @@ -190,7 +190,8 @@ class MainThreadSCMProvider implements ISCMProvider { iconDark: iconDark && URI.parse(iconDark), tooltip, strikeThrough, - faded + faded, + color: color && color.id }; return new MainThreadSCMResource( diff --git a/src/vs/workbench/api/node/extHost.protocol.ts b/src/vs/workbench/api/node/extHost.protocol.ts index 07a65209fe6..a3d65955516 100644 --- a/src/vs/workbench/api/node/extHost.protocol.ts +++ b/src/vs/workbench/api/node/extHost.protocol.ts @@ -357,7 +357,8 @@ export type SCMRawResource = [ string[] /*icons: light, dark*/, string /*tooltip*/, boolean /*strike through*/, - boolean /*faded*/ + boolean /*faded*/, + { id: string } /*ThemeColor*/ ]; export type SCMRawResourceSplice = [ diff --git a/src/vs/workbench/api/node/extHostSCM.ts b/src/vs/workbench/api/node/extHostSCM.ts index ec9ad8b38ee..a9c1e63af2e 100644 --- a/src/vs/workbench/api/node/extHostSCM.ts +++ b/src/vs/workbench/api/node/extHostSCM.ts @@ -243,8 +243,9 @@ class ExtHostSourceControlResourceGroup implements vscode.SourceControlResourceG const tooltip = (r.decorations && r.decorations.tooltip) || ''; const strikeThrough = r.decorations && !!r.decorations.strikeThrough; const faded = r.decorations && !!r.decorations.faded; + const color = r.decorations && r.decorations.color; - return [handle, sourceUri, icons, tooltip, strikeThrough, faded] as SCMRawResource; + return [handle, sourceUri, icons, tooltip, strikeThrough, faded, color] as SCMRawResource; }); handlesToDelete.push(...this._handlesSnapshot.splice(start, deleteCount, ...handles)); diff --git a/src/vs/workbench/parts/files/browser/views/explorerViewer.ts b/src/vs/workbench/parts/files/browser/views/explorerViewer.ts index a2eaf2bdb45..25f102e95c1 100644 --- a/src/vs/workbench/parts/files/browser/views/explorerViewer.ts +++ b/src/vs/workbench/parts/files/browser/views/explorerViewer.ts @@ -328,7 +328,9 @@ export class FileRenderer implements IRenderer { templateData.label.setFile(stat.resource, { hidePath: true, fileKind: stat.isRoot ? FileKind.ROOT_FOLDER : stat.isDirectory ? FileKind.FOLDER : FileKind.FILE, extraClasses }); let top = this.decorationsService.getTopDecoration(stat.resource, stat.isDirectory); - templateData.label.element.style.color = top ? top.color.toString() : ''; + templateData.label.element.style.color = top + ? this.themeService.getTheme().getColor(top.color, true).toString() + : ''; } // Input Box diff --git a/src/vs/workbench/parts/markers/browser/markersFileDecorations.ts b/src/vs/workbench/parts/markers/browser/markersFileDecorations.ts index dae31174494..b4cb3d739b5 100644 --- a/src/vs/workbench/parts/markers/browser/markersFileDecorations.ts +++ b/src/vs/workbench/parts/markers/browser/markersFileDecorations.ts @@ -14,7 +14,6 @@ import { localize } from 'vs/nls'; import { isFalsyOrEmpty } from 'vs/base/common/arrays'; import { Registry } from 'vs/platform/registry/common/platform'; import Severity from 'vs/base/common/severity'; -import { IThemeService } from 'vs/platform/theme/common/themeService'; import { editorErrorForeground, editorWarningForeground } from 'vs/editor/common/view/editorColorRegistry'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; @@ -27,7 +26,6 @@ class MarkersFileDecorations implements IWorkbenchContribution { constructor( @IMarkerService private _markerService: IMarkerService, @IFileDecorationsService private _decorationsService: IFileDecorationsService, - @IThemeService private _themeService: IThemeService, @IConfigurationService private _configurationService: IConfigurationService ) { // @@ -74,7 +72,7 @@ class MarkersFileDecorations implements IWorkbenchContribution { private _toFileDecorationData(marker: IMarker): IFileDecorationData { const { message, severity } = marker; - const color = this._themeService.getTheme().getColor(severity === Severity.Error ? editorErrorForeground : editorWarningForeground); + const color = severity === Severity.Error ? editorErrorForeground : editorWarningForeground; return { message, severity, color }; } } diff --git a/src/vs/workbench/parts/scm/electron-browser/scmFileDecorations.ts b/src/vs/workbench/parts/scm/electron-browser/scmFileDecorations.ts index 59509fd3c01..d145507ce19 100644 --- a/src/vs/workbench/parts/scm/electron-browser/scmFileDecorations.ts +++ b/src/vs/workbench/parts/scm/electron-browser/scmFileDecorations.ts @@ -11,7 +11,6 @@ import { IDisposable, dispose } from 'vs/base/common/lifecycle'; import { ISCMService, ISCMRepository } from 'vs/workbench/services/scm/common/scm'; import URI from 'vs/base/common/uri'; import Severity from 'vs/base/common/severity'; -import { Color } from 'vs/base/common/color'; export class FileDecorations implements IWorkbenchContribution { @@ -42,19 +41,18 @@ export class FileDecorations implements IWorkbenchContribution { const listener = provider.onDidChangeResources(() => { let newDecorations = new Map(); - let color = Color.fromHex('#007aCC'); - for (const group of provider.resources) { for (const resource of group.resourceCollection.resources) { - // TODO@Joh have a better color and icon which is based - // on the resource decoration + if (!resource.decorations.color) { + continue; + } + this._decorationsService.setFileDecoration(type, resource.sourceUri, { severity: Severity.Info, message: resource.decorations.tooltip, - color + color: resource.decorations.color }); - newDecorations.set(resource.sourceUri.toString(), resource.sourceUri); } } diff --git a/src/vs/workbench/services/fileDecorations/browser/fileDecorations.ts b/src/vs/workbench/services/fileDecorations/browser/fileDecorations.ts index 15e1feb21d4..2aa9f04fbe1 100644 --- a/src/vs/workbench/services/fileDecorations/browser/fileDecorations.ts +++ b/src/vs/workbench/services/fileDecorations/browser/fileDecorations.ts @@ -5,17 +5,17 @@ 'use strict'; import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; -import { Color } from 'vs/base/common/color'; import URI from 'vs/base/common/uri'; import Event from 'vs/base/common/event'; import Severity from 'vs/base/common/severity'; +import { ColorIdentifier } from 'vs/platform/theme/common/colorRegistry'; export const IFileDecorationsService = createDecorator('IFileDecorationsService'); export interface IFileDecoration { readonly type: DecorationType; readonly message: string; - readonly color: Color; + readonly color: ColorIdentifier; readonly severity: Severity; } @@ -31,7 +31,7 @@ export abstract class DecorationType { export interface IFileDecorationData { message: string; - color: Color; + color: ColorIdentifier; severity: Severity; } diff --git a/src/vs/workbench/services/scm/common/scm.ts b/src/vs/workbench/services/scm/common/scm.ts index a9337cf69b8..e5dda8e6e2b 100644 --- a/src/vs/workbench/services/scm/common/scm.ts +++ b/src/vs/workbench/services/scm/common/scm.ts @@ -11,6 +11,7 @@ import { createDecorator } from 'vs/platform/instantiation/common/instantiation' import Event from 'vs/base/common/event'; import { IDisposable } from 'vs/base/common/lifecycle'; import { Command } from 'vs/editor/common/modes'; +import { ColorIdentifier } from 'vs/platform/theme/common/colorRegistry'; export interface IBaselineResourceProvider { getBaselineResource(resource: URI): TPromise; @@ -24,6 +25,7 @@ export interface ISCMResourceDecorations { tooltip?: string; strikeThrough?: boolean; faded?: boolean; + color?: ColorIdentifier; } export interface ISCMResourceSplice { @@ -92,4 +94,4 @@ export interface ISCMService { readonly repositories: ISCMRepository[]; registerSCMProvider(provider: ISCMProvider): ISCMRepository; -} \ No newline at end of file +} From 737f55bb2ffebdc3caad9501470d3765adb28ece Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Fri, 6 Oct 2017 17:07:07 +0200 Subject: [PATCH 118/158] TST#clear --- src/vs/base/common/map.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/vs/base/common/map.ts b/src/vs/base/common/map.ts index 72284c76d1a..894f82082b6 100644 --- a/src/vs/base/common/map.ts +++ b/src/vs/base/common/map.ts @@ -323,6 +323,10 @@ export class TernarySearchTree { this._segments = segments; } + clear(): void { + this._root = undefined; + } + set(key: string, element: E): void { const segements = this._segments.reset(key); this._root = this._set(this._root, segements.next(), segements, element); From 5a57f27d5a86cdc90e912cd1bedc5c01af8392c3 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Fri, 6 Oct 2017 17:16:48 +0200 Subject: [PATCH 119/158] refine interfaces --- .../markers/browser/markersFileDecorations.ts | 12 ++++------- .../electron-browser/scmFileDecorations.ts | 7 +++---- .../browser/fileDecorations.ts | 21 +++++++------------ .../browser/fileDecorationsService.ts | 13 ++++++------ 4 files changed, 21 insertions(+), 32 deletions(-) diff --git a/src/vs/workbench/parts/markers/browser/markersFileDecorations.ts b/src/vs/workbench/parts/markers/browser/markersFileDecorations.ts index b4cb3d739b5..558a0814392 100644 --- a/src/vs/workbench/parts/markers/browser/markersFileDecorations.ts +++ b/src/vs/workbench/parts/markers/browser/markersFileDecorations.ts @@ -61,19 +61,15 @@ class MarkersFileDecorations implements IWorkbenchContribution { const markers = this._markerService.read({ resource }) .sort((a, b) => Severity.compare(a.severity, b.severity)); - if (!isFalsyOrEmpty(markers)) { - const data = this._toFileDecorationData(markers[0]); - this._decorationsService.setFileDecoration(this._type, resource, data); - } else { - this._decorationsService.unsetFileDecoration(this._type, resource); - } + const data = !isFalsyOrEmpty(markers) ? this._toFileDecorationData(markers[0]) : undefined; + this._decorationsService.setFileDecoration(this._type, resource, data); } } private _toFileDecorationData(marker: IMarker): IFileDecorationData { - const { message, severity } = marker; + const { severity } = marker; const color = severity === Severity.Error ? editorErrorForeground : editorWarningForeground; - return { message, severity, color }; + return { severity, color }; } } diff --git a/src/vs/workbench/parts/scm/electron-browser/scmFileDecorations.ts b/src/vs/workbench/parts/scm/electron-browser/scmFileDecorations.ts index d145507ce19..0e228dc6208 100644 --- a/src/vs/workbench/parts/scm/electron-browser/scmFileDecorations.ts +++ b/src/vs/workbench/parts/scm/electron-browser/scmFileDecorations.ts @@ -15,7 +15,6 @@ import Severity from 'vs/base/common/severity'; export class FileDecorations implements IWorkbenchContribution { private readonly _disposables: IDisposable[]; - // private readonly _type: DecorationType; private readonly _repositoryListeners = new Map(); constructor( @@ -50,8 +49,8 @@ export class FileDecorations implements IWorkbenchContribution { this._decorationsService.setFileDecoration(type, resource.sourceUri, { severity: Severity.Info, - message: resource.decorations.tooltip, - color: resource.decorations.color + color: resource.decorations.color, + icon: { light: resource.decorations.icon, dark: resource.decorations.iconDark } }); newDecorations.set(resource.sourceUri.toString(), resource.sourceUri); } @@ -59,7 +58,7 @@ export class FileDecorations implements IWorkbenchContribution { oldDecorations.forEach((value, key) => { if (!newDecorations.has(key)) { - this._decorationsService.unsetFileDecoration(type, value); + this._decorationsService.setFileDecoration(type, value); } }); diff --git a/src/vs/workbench/services/fileDecorations/browser/fileDecorations.ts b/src/vs/workbench/services/fileDecorations/browser/fileDecorations.ts index 2aa9f04fbe1..0f89b41c00f 100644 --- a/src/vs/workbench/services/fileDecorations/browser/fileDecorations.ts +++ b/src/vs/workbench/services/fileDecorations/browser/fileDecorations.ts @@ -12,13 +12,6 @@ import { ColorIdentifier } from 'vs/platform/theme/common/colorRegistry'; export const IFileDecorationsService = createDecorator('IFileDecorationsService'); -export interface IFileDecoration { - readonly type: DecorationType; - readonly message: string; - readonly color: ColorIdentifier; - readonly severity: Severity; -} - export abstract class DecorationType { readonly label: string; protected constructor(label: string) { @@ -29,10 +22,14 @@ export abstract class DecorationType { } } + +export interface IFileDecoration extends IFileDecorationData { + readonly type: DecorationType; +} export interface IFileDecorationData { - message: string; - color: ColorIdentifier; - severity: Severity; + readonly severity: Severity; + readonly color?: ColorIdentifier; + readonly icon?: URI | { dark: URI, light: URI }; } export interface IFileDecorationsService { @@ -43,9 +40,7 @@ export interface IFileDecorationsService { registerDecorationType(label: string): DecorationType; - setFileDecoration(type: DecorationType, target: URI, data: IFileDecorationData): void; - - unsetFileDecoration(type: DecorationType, target: URI): void; + setFileDecoration(type: DecorationType, target: URI, data?: IFileDecorationData): void; getDecorations(uri: URI, includeChildren: boolean): IFileDecoration[]; diff --git a/src/vs/workbench/services/fileDecorations/browser/fileDecorationsService.ts b/src/vs/workbench/services/fileDecorations/browser/fileDecorationsService.ts index e4f2932b524..39bb9c6de2a 100644 --- a/src/vs/workbench/services/fileDecorations/browser/fileDecorationsService.ts +++ b/src/vs/workbench/services/fileDecorations/browser/fileDecorationsService.ts @@ -46,13 +46,12 @@ export class FileDecorationsService implements IFileDecorationsService { return type; } - setFileDecoration(type: DecorationType, target: URI, data: IFileDecorationData): void { - this._types.get(type).set(target.toString(), { type, ...data }); - this._onDidChangeFileDecoration.fire(target); - } - - unsetFileDecoration(type: DecorationType, target: URI): void { - this._types.get(type).delete(target.toString()); + setFileDecoration(type: DecorationType, target: URI, data?: IFileDecorationData): void { + if (data) { + this._types.get(type).set(target.toString(), { type, ...data }); + } else { + this._types.get(type).delete(target.toString()); + } this._onDidChangeFileDecoration.fire(target); } From 6fc89a918e8c6ce127204e5661f1e7bb14df489d Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Fri, 6 Oct 2017 19:19:04 +0200 Subject: [PATCH 120/158] move render/update logic to file/resource label, rename fileDecorations to decorations etc --- src/vs/workbench/browser/labels.ts | 40 +++++++++++++-- .../workbench/electron-browser/workbench.ts | 6 +-- .../parts/files/browser/views/explorerView.ts | 18 +------ .../files/browser/views/explorerViewer.ts | 19 +++---- .../markers/browser/markersFileDecorations.ts | 8 +-- .../electron-browser/scmFileDecorations.ts | 8 +-- .../browser/decorations.ts} | 22 +++++---- .../browser/decorationsService.ts} | 49 ++++++++++++------- 8 files changed, 102 insertions(+), 68 deletions(-) rename src/vs/workbench/services/{fileDecorations/browser/fileDecorations.ts => decorations/browser/decorations.ts} (60%) rename src/vs/workbench/services/{fileDecorations/browser/fileDecorationsService.ts => decorations/browser/decorationsService.ts} (61%) diff --git a/src/vs/workbench/browser/labels.ts b/src/vs/workbench/browser/labels.ts index 93a7498c27b..2797fec3411 100644 --- a/src/vs/workbench/browser/labels.ts +++ b/src/vs/workbench/browser/labels.ts @@ -20,9 +20,11 @@ import { IDisposable, dispose } from 'vs/base/common/lifecycle'; import { IModelService } from 'vs/editor/common/services/modelService'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { IUntitledEditorService } from 'vs/workbench/services/untitled/common/untitledEditorService'; +import { IResourceDecorationsService, IResourceDecoration, IResourceDecorationChangeEvent } from 'vs/workbench/services/decorations/browser/decorations'; import { Schemas } from 'vs/base/common/network'; import { FileKind } from 'vs/platform/files/common/files'; import { IModel } from 'vs/editor/common/editorCommon'; +import { IThemeService } from 'vs/platform/theme/common/themeService'; export interface IResourceLabel { name: string; @@ -32,6 +34,8 @@ export interface IResourceLabel { export interface IResourceLabelOptions extends IIconLabelOptions { fileKind?: FileKind; + showDecorations?: boolean; + showAllDecorations?: boolean; } export class ResourceLabel extends IconLabel { @@ -49,7 +53,9 @@ export class ResourceLabel extends IconLabel { @IConfigurationService private configurationService: IConfigurationService, @IModeService private modeService: IModeService, @IModelService private modelService: IModelService, - @IEnvironmentService protected environmentService: IEnvironmentService + @IEnvironmentService protected environmentService: IEnvironmentService, + @IResourceDecorationsService protected decorationsService: IResourceDecorationsService, + @IThemeService private themeService: IThemeService ) { super(container, options); @@ -62,6 +68,7 @@ export class ResourceLabel extends IconLabel { this.extensionService.onReady().then(() => this.render(true /* clear cache */)); // update when extensions are loaded with potentially new languages this.toDispose.push(this.configurationService.onDidUpdateConfiguration(() => this.render(true /* clear cache */))); // update when file.associations change this.toDispose.push(this.modelService.onModelModeChanged(e => this.onModelModeChanged(e))); // react to model mode changes + this.toDispose.push(this.decorationsService.onDidChangeDecorations(this.onFileDecorationsChanges, this)); // react to file decoration changes } private onModelModeChanged(e: { model: IModel; oldModeId: string; }): void { @@ -84,6 +91,18 @@ export class ResourceLabel extends IconLabel { } } + private onFileDecorationsChanges(e: IResourceDecorationChangeEvent): void { + if (!this.options || !this.label || !this.label.resource) { + return; + } + if (!this.options.showAllDecorations && !this.options.showDecorations) { + return; + } + if (e.affectsResource(this.label.resource)) { + this.render(false); + } + } + public setLabel(label: IResourceLabel, options?: IResourceLabelOptions): void { const hasResourceChanged = this.hasResourceChanged(label, options); @@ -159,6 +178,19 @@ export class ResourceLabel extends IconLabel { extraClasses.push(...this.options.extraClasses); } + let deco: IResourceDecoration; + if (this.options) { + if (this.options.showDecorations) { + deco = this.decorationsService.getTopDecoration(resource, false); + } else if (this.options.showAllDecorations) { + deco = this.decorationsService.getTopDecoration(resource, true); + } + } + + // set/unset color from decoration + const color = deco && this.themeService.getTheme().getColor(deco.color, true); + this.element.style.color = color ? color.toString() : ''; + const italic = this.options && this.options.italic; const matches = this.options && this.options.matches; @@ -204,9 +236,11 @@ export class FileLabel extends ResourceLabel { @IModeService modeService: IModeService, @IModelService modelService: IModelService, @IEnvironmentService environmentService: IEnvironmentService, - @IUntitledEditorService private untitledEditorService: IUntitledEditorService + @IResourceDecorationsService decorationsService: IResourceDecorationsService, + @IThemeService themeService: IThemeService, + @IUntitledEditorService private untitledEditorService: IUntitledEditorService, ) { - super(container, options, extensionService, contextService, configurationService, modeService, modelService, environmentService); + super(container, options, extensionService, contextService, configurationService, modeService, modelService, environmentService, decorationsService, themeService); } public setFile(resource: uri, options?: IFileLabelOptions): void { diff --git a/src/vs/workbench/electron-browser/workbench.ts b/src/vs/workbench/electron-browser/workbench.ts index 0a894a8df22..f6bdc8d057f 100644 --- a/src/vs/workbench/electron-browser/workbench.ts +++ b/src/vs/workbench/electron-browser/workbench.ts @@ -97,9 +97,9 @@ import { OpenRecentAction, ToggleDevToolsAction, ReloadWindowAction, ShowPreviou import { KeyMod, KeyCode } from 'vs/base/common/keyCodes'; import { IWorkspaceEditingService } from 'vs/workbench/services/workspace/common/workspaceEditing'; import { WorkspaceEditingService } from 'vs/workbench/services/workspace/node/workspaceEditingService'; +import { FileDecorationsService } from 'vs/workbench/services/decorations/browser/decorationsService'; +import { IResourceDecorationsService } from 'vs/workbench/services/decorations/browser/decorations'; import URI from 'vs/base/common/uri'; -import { FileDecorationsService } from 'vs/workbench/services/fileDecorations/browser/fileDecorationsService'; -import { IFileDecorationsService } from 'vs/workbench/services/fileDecorations/browser/fileDecorations'; export const MessagesVisibleContext = new RawContextKey('globalMessageVisible', false); export const EditorsVisibleContext = new RawContextKey('editorIsOpen', false); @@ -586,7 +586,7 @@ export class Workbench implements IPartService { serviceCollection.set(ITextFileService, new SyncDescriptor(TextFileService)); // File Decorations - serviceCollection.set(IFileDecorationsService, new SyncDescriptor(FileDecorationsService)); + serviceCollection.set(IResourceDecorationsService, new SyncDescriptor(FileDecorationsService)); // SCM Service serviceCollection.set(ISCMService, new SyncDescriptor(SCMService)); diff --git a/src/vs/workbench/parts/files/browser/views/explorerView.ts b/src/vs/workbench/parts/files/browser/views/explorerView.ts index 20fc00c0ff2..eb9f3dbdc9b 100644 --- a/src/vs/workbench/parts/files/browser/views/explorerView.ts +++ b/src/vs/workbench/parts/files/browser/views/explorerView.ts @@ -45,7 +45,6 @@ import { IWorkbenchThemeService, IFileIconTheme } from 'vs/workbench/services/th import { isLinux } from 'vs/base/common/platform'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { attachListStyler } from 'vs/platform/theme/common/styler'; -import { IFileDecorationsService } from 'vs/workbench/services/fileDecorations/browser/fileDecorations'; export interface IExplorerViewOptions extends IViewletViewOptions { viewletState: FileViewletState; @@ -99,8 +98,7 @@ export class ExplorerView extends ViewsViewletPanel { @IContextKeyService contextKeyService: IContextKeyService, @IConfigurationService private configurationService: IConfigurationService, @IWorkbenchThemeService private themeService: IWorkbenchThemeService, - @IEnvironmentService private environmentService: IEnvironmentService, - @IFileDecorationsService private fileDecorationsService: IFileDecorationsService + @IEnvironmentService private environmentService: IEnvironmentService ) { super({ ...(options as IViewOptions), ariaHeaderLabel: nls.localize('explorerSection', "Files Explorer Section") }, keybindingService, contextMenuService); @@ -168,7 +166,6 @@ export class ExplorerView extends ViewsViewletPanel { this.disposables.push(this.themeService.onDidFileIconThemeChange(onFileIconThemeChange)); this.disposables.push(this.contextService.onDidChangeWorkspaceFolders(e => this.refreshFromEvent(e.added))); this.disposables.push(this.contextService.onDidChangeWorkbenchState(e => this.refreshFromEvent())); - this.disposables.push(this.fileDecorationsService.onDidChangeFileDecoration(this.onDidChangeFileDecorations, this)); onFileIconThemeChange(this.themeService.getFileIconTheme()); } @@ -684,19 +681,6 @@ export class ExplorerView extends ViewsViewletPanel { })); } - private onDidChangeFileDecorations(uris: URI[]): void { - let seen = new Set(); - let stack = uris.map(uri => this.model.findClosest(uri)); - while (stack.length > 0) { - let stat = stack.shift(); - if (stat && !seen.has(stat)) { - this.explorerViewer.refresh(stat, false); - stack.push(stat.parent); - seen.add(stat); - } - } - } - private refreshFromEvent(newRoots: IWorkspaceFolder[] = []): void { if (this.isVisible()) { this.explorerRefreshDelayer.trigger(() => { diff --git a/src/vs/workbench/parts/files/browser/views/explorerViewer.ts b/src/vs/workbench/parts/files/browser/views/explorerViewer.ts index 25f102e95c1..f9e8fd1a030 100644 --- a/src/vs/workbench/parts/files/browser/views/explorerViewer.ts +++ b/src/vs/workbench/parts/files/browser/views/explorerViewer.ts @@ -58,7 +58,8 @@ import { IEnvironmentService } from 'vs/platform/environment/common/environment' import { getPathLabel } from 'vs/base/common/labels'; import { extractResources } from 'vs/base/browser/dnd'; import { IConfigurationEditingService, ConfigurationTarget } from 'vs/workbench/services/configuration/common/configurationEditing'; -import { IFileDecorationsService } from 'vs/workbench/services/fileDecorations/browser/fileDecorations'; +import { IDecorationsService } from 'vs/workbench/services/decorations/browser/decorations'; + export class FileDataSource implements IDataSource { constructor( @@ -291,8 +292,7 @@ export class FileRenderer implements IRenderer { state: FileViewletState, @IContextViewService private contextViewService: IContextViewService, @IInstantiationService private instantiationService: IInstantiationService, - @IThemeService private themeService: IThemeService, - @IFileDecorationsService private decorationsService: IFileDecorationsService + @IThemeService private themeService: IThemeService ) { this.state = state; } @@ -325,12 +325,13 @@ export class FileRenderer implements IRenderer { if (!stat.exists && stat.isRoot) { extraClasses.push('nonexistent-root'); } - templateData.label.setFile(stat.resource, { hidePath: true, fileKind: stat.isRoot ? FileKind.ROOT_FOLDER : stat.isDirectory ? FileKind.FOLDER : FileKind.FILE, extraClasses }); - - let top = this.decorationsService.getTopDecoration(stat.resource, stat.isDirectory); - templateData.label.element.style.color = top - ? this.themeService.getTheme().getColor(top.color, true).toString() - : ''; + templateData.label.setFile(stat.resource, { + hidePath: true, + fileKind: stat.isRoot ? FileKind.ROOT_FOLDER : stat.isDirectory ? FileKind.FOLDER : FileKind.FILE, + extraClasses, + showAllDecorations: stat.isDirectory, + showDecorations: !stat.isDirectory + }); } // Input Box diff --git a/src/vs/workbench/parts/markers/browser/markersFileDecorations.ts b/src/vs/workbench/parts/markers/browser/markersFileDecorations.ts index 558a0814392..7ee0b096fb4 100644 --- a/src/vs/workbench/parts/markers/browser/markersFileDecorations.ts +++ b/src/vs/workbench/parts/markers/browser/markersFileDecorations.ts @@ -7,7 +7,7 @@ import { IWorkbenchContribution, IWorkbenchContributionsRegistry, Extensions } from 'vs/workbench/common/contributions'; import { IMarkerService, IMarker } from 'vs/platform/markers/common/markers'; -import { IFileDecorationsService, DecorationType, IFileDecorationData } from 'vs/workbench/services/fileDecorations/browser/fileDecorations'; +import { IResourceDecorationsService, DecorationType, IResourceDecorationData } from 'vs/workbench/services/decorations/browser/decorations'; import { IDisposable, dispose } from 'vs/base/common/lifecycle'; import URI from 'vs/base/common/uri'; import { localize } from 'vs/nls'; @@ -25,7 +25,7 @@ class MarkersFileDecorations implements IWorkbenchContribution { constructor( @IMarkerService private _markerService: IMarkerService, - @IFileDecorationsService private _decorationsService: IFileDecorationsService, + @IResourceDecorationsService private _decorationsService: IResourceDecorationsService, @IConfigurationService private _configurationService: IConfigurationService ) { // @@ -62,11 +62,11 @@ class MarkersFileDecorations implements IWorkbenchContribution { .sort((a, b) => Severity.compare(a.severity, b.severity)); const data = !isFalsyOrEmpty(markers) ? this._toFileDecorationData(markers[0]) : undefined; - this._decorationsService.setFileDecoration(this._type, resource, data); + this._decorationsService.setDecoration(this._type, resource, data); } } - private _toFileDecorationData(marker: IMarker): IFileDecorationData { + private _toFileDecorationData(marker: IMarker): IResourceDecorationData { const { severity } = marker; const color = severity === Severity.Error ? editorErrorForeground : editorWarningForeground; return { severity, color }; diff --git a/src/vs/workbench/parts/scm/electron-browser/scmFileDecorations.ts b/src/vs/workbench/parts/scm/electron-browser/scmFileDecorations.ts index 0e228dc6208..c783b9b4c4d 100644 --- a/src/vs/workbench/parts/scm/electron-browser/scmFileDecorations.ts +++ b/src/vs/workbench/parts/scm/electron-browser/scmFileDecorations.ts @@ -6,7 +6,7 @@ 'use strict'; import { IWorkbenchContribution } from 'vs/workbench/common/contributions'; -import { IFileDecorationsService } from 'vs/workbench/services/fileDecorations/browser/fileDecorations'; +import { IResourceDecorationsService } from 'vs/workbench/services/decorations/browser/decorations'; import { IDisposable, dispose } from 'vs/base/common/lifecycle'; import { ISCMService, ISCMRepository } from 'vs/workbench/services/scm/common/scm'; import URI from 'vs/base/common/uri'; @@ -18,7 +18,7 @@ export class FileDecorations implements IWorkbenchContribution { private readonly _repositoryListeners = new Map(); constructor( - @IFileDecorationsService private _decorationsService: IFileDecorationsService, + @IResourceDecorationsService private _decorationsService: IResourceDecorationsService, @ISCMService private _scmService: ISCMService, ) { this._scmService.repositories.forEach(this._onDidAddRepository, this); @@ -47,7 +47,7 @@ export class FileDecorations implements IWorkbenchContribution { continue; } - this._decorationsService.setFileDecoration(type, resource.sourceUri, { + this._decorationsService.setDecoration(type, resource.sourceUri, { severity: Severity.Info, color: resource.decorations.color, icon: { light: resource.decorations.icon, dark: resource.decorations.iconDark } @@ -58,7 +58,7 @@ export class FileDecorations implements IWorkbenchContribution { oldDecorations.forEach((value, key) => { if (!newDecorations.has(key)) { - this._decorationsService.setFileDecoration(type, value); + this._decorationsService.setDecoration(type, value); } }); diff --git a/src/vs/workbench/services/fileDecorations/browser/fileDecorations.ts b/src/vs/workbench/services/decorations/browser/decorations.ts similarity index 60% rename from src/vs/workbench/services/fileDecorations/browser/fileDecorations.ts rename to src/vs/workbench/services/decorations/browser/decorations.ts index 0f89b41c00f..af56f65ac86 100644 --- a/src/vs/workbench/services/fileDecorations/browser/fileDecorations.ts +++ b/src/vs/workbench/services/decorations/browser/decorations.ts @@ -10,7 +10,7 @@ import Event from 'vs/base/common/event'; import Severity from 'vs/base/common/severity'; import { ColorIdentifier } from 'vs/platform/theme/common/colorRegistry'; -export const IFileDecorationsService = createDecorator('IFileDecorationsService'); +export const IResourceDecorationsService = createDecorator('IFileDecorationsService'); export abstract class DecorationType { readonly label: string; @@ -22,27 +22,31 @@ export abstract class DecorationType { } } - -export interface IFileDecoration extends IFileDecorationData { +export interface IResourceDecoration extends IResourceDecorationData { readonly type: DecorationType; } -export interface IFileDecorationData { + +export interface IResourceDecorationData { readonly severity: Severity; readonly color?: ColorIdentifier; readonly icon?: URI | { dark: URI, light: URI }; } -export interface IFileDecorationsService { +export interface IResourceDecorationChangeEvent { + affectsResource(uri: URI): boolean; +} + +export interface IResourceDecorationsService { readonly _serviceBrand: any; - readonly onDidChangeFileDecoration: Event; + readonly onDidChangeDecorations: Event; registerDecorationType(label: string): DecorationType; - setFileDecoration(type: DecorationType, target: URI, data?: IFileDecorationData): void; + setDecoration(type: DecorationType, target: URI, data?: IResourceDecorationData): void; - getDecorations(uri: URI, includeChildren: boolean): IFileDecoration[]; + getDecorations(uri: URI, includeChildren: boolean): IResourceDecoration[]; - getTopDecoration(uri: URI, includeChildren: boolean): IFileDecoration; + getTopDecoration(uri: URI, includeChildren: boolean): IResourceDecoration; } diff --git a/src/vs/workbench/services/fileDecorations/browser/fileDecorationsService.ts b/src/vs/workbench/services/decorations/browser/decorationsService.ts similarity index 61% rename from src/vs/workbench/services/fileDecorations/browser/fileDecorationsService.ts rename to src/vs/workbench/services/decorations/browser/decorationsService.ts index 39bb9c6de2a..1d266431590 100644 --- a/src/vs/workbench/services/fileDecorations/browser/fileDecorationsService.ts +++ b/src/vs/workbench/services/decorations/browser/decorationsService.ts @@ -7,25 +7,36 @@ import URI from 'vs/base/common/uri'; import Severity from 'vs/base/common/severity'; import Event, { Emitter, debounceEvent } from 'vs/base/common/event'; -import { IFileDecorationsService, IFileDecoration, DecorationType, IFileDecorationData } from 'vs/workbench/services/fileDecorations/browser/fileDecorations'; +import { IResourceDecorationsService, IResourceDecoration, DecorationType, IResourceDecorationData, IResourceDecorationChangeEvent } from 'vs/workbench/services/fileDecorations/browser/fileDecorations'; import { TernarySearchTree } from 'vs/base/common/map'; -export class FileDecorationsService implements IFileDecorationsService { +class FileDecorationChangeEvent implements IResourceDecorationChangeEvent { + + private readonly _data = TernarySearchTree.forPaths(); + + affectsResource(uri: URI): boolean { + return this._data.get(uri.toString()) || this._data.findSuperstr(uri.toString()) !== undefined; + } + + static debouncer(last: FileDecorationChangeEvent, current: URI) { + if (!last) { + last = new FileDecorationChangeEvent(); + } + last._data.set(current.toString(), true); + return last; + } +} + +export class FileDecorationsService implements IResourceDecorationsService { readonly _serviceBrand; private readonly _onDidChangeFileDecoration = new Emitter(); - private readonly _types = new Map>(); + private readonly _types = new Map>(); - readonly onDidChangeFileDecoration: Event = debounceEvent( + readonly onDidChangeDecorations: Event = debounceEvent( this._onDidChangeFileDecoration.event, - (last, current) => { - if (!last) { - last = []; - } - last.push(current); - return last; - } + FileDecorationChangeEvent.debouncer ); registerDecorationType(label: string): DecorationType { @@ -42,11 +53,11 @@ export class FileDecorationsService implements IFileDecorationsService { } } }; - this._types.set(type, TernarySearchTree.forPaths()); + this._types.set(type, TernarySearchTree.forPaths()); return type; } - setFileDecoration(type: DecorationType, target: URI, data?: IFileDecorationData): void { + setDecoration(type: DecorationType, target: URI, data?: IResourceDecorationData): void { if (data) { this._types.get(type).set(target.toString(), { type, ...data }); } else { @@ -55,8 +66,8 @@ export class FileDecorationsService implements IFileDecorationsService { this._onDidChangeFileDecoration.fire(target); } - getDecorations(uri: URI, includeChildren: boolean): IFileDecoration[] { - let ret: IFileDecoration[] = []; + getDecorations(uri: URI, includeChildren: boolean): IResourceDecoration[] { + let ret: IResourceDecoration[] = []; this._someFileDecoration(uri, includeChildren, decoration => { ret.push(decoration); return false; @@ -64,8 +75,8 @@ export class FileDecorationsService implements IFileDecorationsService { return ret; } - getTopDecoration(uri: URI, includeChildren: boolean): IFileDecoration { - let top: IFileDecoration; + getTopDecoration(uri: URI, includeChildren: boolean): IResourceDecoration { + let top: IResourceDecoration; this._someFileDecoration(uri, includeChildren, decoration => { // top is the most severe one, // stop as soon as an error is found @@ -77,7 +88,7 @@ export class FileDecorationsService implements IFileDecorationsService { return top; } - private _someFileDecoration(uri: URI, includeChildren: boolean, callback: (a: IFileDecoration) => boolean): void { + private _someFileDecoration(uri: URI, includeChildren: boolean, callback: (a: IResourceDecoration) => boolean): void { let key = uri.toString(); let done = false; this._types.forEach(tree => { @@ -96,7 +107,7 @@ export class FileDecorationsService implements IFileDecorationsService { }); } - private static _compareFileDecorationsBySeverity(a: IFileDecoration, b: IFileDecoration): number { + private static _compareFileDecorationsBySeverity(a: IResourceDecoration, b: IResourceDecoration): number { return Severity.compare(a.severity, b.severity); } } From 9a8bdad947e10540e783969d8a3270b6b100e490 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Fri, 6 Oct 2017 19:36:51 +0200 Subject: [PATCH 121/158] missing labels change --- src/vs/workbench/browser/labels.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/vs/workbench/browser/labels.ts b/src/vs/workbench/browser/labels.ts index 2797fec3411..b2b17617109 100644 --- a/src/vs/workbench/browser/labels.ts +++ b/src/vs/workbench/browser/labels.ts @@ -69,6 +69,7 @@ export class ResourceLabel extends IconLabel { this.toDispose.push(this.configurationService.onDidUpdateConfiguration(() => this.render(true /* clear cache */))); // update when file.associations change this.toDispose.push(this.modelService.onModelModeChanged(e => this.onModelModeChanged(e))); // react to model mode changes this.toDispose.push(this.decorationsService.onDidChangeDecorations(this.onFileDecorationsChanges, this)); // react to file decoration changes + this.toDispose.push(this.themeService.onThemeChange(() => this.render(false))); } private onModelModeChanged(e: { model: IModel; oldModeId: string; }): void { From 46e48b345055c491b09aa77a94eaedeb62650b90 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Fri, 6 Oct 2017 19:45:39 +0200 Subject: [PATCH 122/158] yet another missing change... --- .../services/decorations/browser/decorationsService.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/services/decorations/browser/decorationsService.ts b/src/vs/workbench/services/decorations/browser/decorationsService.ts index 1d266431590..456c8f5cf40 100644 --- a/src/vs/workbench/services/decorations/browser/decorationsService.ts +++ b/src/vs/workbench/services/decorations/browser/decorationsService.ts @@ -7,7 +7,7 @@ import URI from 'vs/base/common/uri'; import Severity from 'vs/base/common/severity'; import Event, { Emitter, debounceEvent } from 'vs/base/common/event'; -import { IResourceDecorationsService, IResourceDecoration, DecorationType, IResourceDecorationData, IResourceDecorationChangeEvent } from 'vs/workbench/services/fileDecorations/browser/fileDecorations'; +import { IResourceDecorationsService, IResourceDecoration, DecorationType, IResourceDecorationData, IResourceDecorationChangeEvent } from './decorations'; import { TernarySearchTree } from 'vs/base/common/map'; class FileDecorationChangeEvent implements IResourceDecorationChangeEvent { From 3cd39eeb2a0e762c02b3b9b4a8414e7f6f1112f2 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Mon, 9 Oct 2017 10:54:50 +0200 Subject: [PATCH 123/158] use a provider-style api for resource/file decorations --- src/vs/base/common/async.ts | 2 +- .../markers/browser/markersFileDecorations.ts | 61 +++--- .../electron-browser/scmFileDecorations.ts | 116 +++++++----- .../decorations/browser/decorations.ts | 29 +-- .../decorations/browser/decorationsService.ts | 177 +++++++++++------- 5 files changed, 221 insertions(+), 164 deletions(-) diff --git a/src/vs/base/common/async.ts b/src/vs/base/common/async.ts index 983ca30b520..e2120526002 100644 --- a/src/vs/base/common/async.ts +++ b/src/vs/base/common/async.ts @@ -13,7 +13,7 @@ import { Disposable, IDisposable } from 'vs/base/common/lifecycle'; import Event, { Emitter } from 'vs/base/common/event'; import URI from 'vs/base/common/uri'; -function isThenable(obj: any): obj is Thenable { +export function isThenable(obj: any): obj is Thenable { return obj && typeof (>obj).then === 'function'; } diff --git a/src/vs/workbench/parts/markers/browser/markersFileDecorations.ts b/src/vs/workbench/parts/markers/browser/markersFileDecorations.ts index 7ee0b096fb4..2a9a05a17a2 100644 --- a/src/vs/workbench/parts/markers/browser/markersFileDecorations.ts +++ b/src/vs/workbench/parts/markers/browser/markersFileDecorations.ts @@ -7,9 +7,10 @@ import { IWorkbenchContribution, IWorkbenchContributionsRegistry, Extensions } from 'vs/workbench/common/contributions'; import { IMarkerService, IMarker } from 'vs/platform/markers/common/markers'; -import { IResourceDecorationsService, DecorationType, IResourceDecorationData } from 'vs/workbench/services/decorations/browser/decorations'; +import { IResourceDecorationsService, IDecorationsProvider, IResourceDecoration } from 'vs/workbench/services/decorations/browser/decorations'; import { IDisposable, dispose } from 'vs/base/common/lifecycle'; import URI from 'vs/base/common/uri'; +import Event from 'vs/base/common/event'; import { localize } from 'vs/nls'; import { isFalsyOrEmpty } from 'vs/base/common/arrays'; import { Registry } from 'vs/platform/registry/common/platform'; @@ -17,11 +18,38 @@ import Severity from 'vs/base/common/severity'; import { editorErrorForeground, editorWarningForeground } from 'vs/editor/common/view/editorColorRegistry'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; +class MarkersDecorationsProvider implements IDecorationsProvider { + + readonly label: string = localize('label', "Problems"); + readonly onDidChange: Event; + + constructor( + private readonly _markerService: IMarkerService + ) { + this.onDidChange = _markerService.onMarkerChanged; + } + + provideDecorations(resource: URI): IResourceDecoration { + + const markers = this._markerService.read({ resource }) + .sort((a, b) => Severity.compare(a.severity, b.severity)); + + return !isFalsyOrEmpty(markers) + ? MarkersDecorationsProvider._toFileDecorationData(markers[0]) + : undefined; + } + + private static _toFileDecorationData(marker: IMarker): IResourceDecoration { + const { severity } = marker; + const color = severity === Severity.Error ? editorErrorForeground : editorWarningForeground; + return { severity, color }; + } +} + class MarkersFileDecorations implements IWorkbenchContribution { private readonly _disposables: IDisposable[]; - private readonly _type: DecorationType; - private _markerListener: IDisposable; + private _provider: IDisposable; constructor( @IMarkerService private _markerService: IMarkerService, @@ -31,14 +59,13 @@ class MarkersFileDecorations implements IWorkbenchContribution { // this._disposables = [ this._configurationService.onDidUpdateConfiguration(this._updateEnablement, this), - this._type = this._decorationsService.registerDecorationType(localize('errorAndWarnings', "Errors & Warnings")) ]; this._updateEnablement(); } dispose(): void { - dispose(this._markerListener); + dispose(this._provider); dispose(this._disposables); } @@ -49,28 +76,12 @@ class MarkersFileDecorations implements IWorkbenchContribution { private _updateEnablement(): void { let value = this._configurationService.getConfiguration<{ showOnFiles: boolean }>('problems'); if (value) { - this._markerListener = this._markerService.onMarkerChanged(this._onDidChangeMarker, this); - this._onDidChangeMarker(this._markerService.read().map(marker => marker.resource)); - } else if (this._markerListener) { - this._markerListener.dispose(); + const provider = new MarkersDecorationsProvider(this._markerService); + this._provider = this._decorationsService.registerDecortionsProvider(provider); + } else if (this._provider) { + this._provider.dispose(); } } - - private _onDidChangeMarker(resources: URI[]): void { - for (const resource of resources) { - const markers = this._markerService.read({ resource }) - .sort((a, b) => Severity.compare(a.severity, b.severity)); - - const data = !isFalsyOrEmpty(markers) ? this._toFileDecorationData(markers[0]) : undefined; - this._decorationsService.setDecoration(this._type, resource, data); - } - } - - private _toFileDecorationData(marker: IMarker): IResourceDecorationData { - const { severity } = marker; - const color = severity === Severity.Error ? editorErrorForeground : editorWarningForeground; - return { severity, color }; - } } Registry.as(Extensions.Workbench).registerWorkbenchContribution(MarkersFileDecorations); diff --git a/src/vs/workbench/parts/scm/electron-browser/scmFileDecorations.ts b/src/vs/workbench/parts/scm/electron-browser/scmFileDecorations.ts index c783b9b4c4d..03aacefc190 100644 --- a/src/vs/workbench/parts/scm/electron-browser/scmFileDecorations.ts +++ b/src/vs/workbench/parts/scm/electron-browser/scmFileDecorations.ts @@ -6,16 +6,69 @@ 'use strict'; import { IWorkbenchContribution } from 'vs/workbench/common/contributions'; -import { IResourceDecorationsService } from 'vs/workbench/services/decorations/browser/decorations'; -import { IDisposable, dispose } from 'vs/base/common/lifecycle'; -import { ISCMService, ISCMRepository } from 'vs/workbench/services/scm/common/scm'; +import { IResourceDecorationsService, IDecorationsProvider, IResourceDecoration } from 'vs/workbench/services/decorations/browser/decorations'; +import { IDisposable, dispose, combinedDisposable } from 'vs/base/common/lifecycle'; +import { ISCMService, ISCMRepository, ISCMProvider, ISCMResource } from 'vs/workbench/services/scm/common/scm'; import URI from 'vs/base/common/uri'; import Severity from 'vs/base/common/severity'; +import Event, { Emitter } from 'vs/base/common/event'; + +class SCMDecorationsProvider implements IDecorationsProvider { + + private readonly _disposable: IDisposable; + private readonly _onDidChange = new Emitter(); + private _data = new Map(); + + readonly label: string; + readonly onDidChange: Event = this._onDidChange.event; + + constructor( + private readonly _provider: ISCMProvider + ) { + this.label = this._provider.label; + this._disposable = this._provider.onDidChangeResources(this._updateGroups, this); + this._updateGroups(); + } + + dispose(): void { + this._disposable.dispose(); + } + + private _updateGroups(): void { + const uris: URI[] = []; + const newData = new Map(); + for (const group of this._provider.resources) { + for (const resource of group.resourceCollection.resources) { + const { sourceUri } = resource; + if (this._data.get(sourceUri.toString()) !== resource) { + newData.set(sourceUri.toString(), resource); + uris.push(sourceUri); + this._data.delete(sourceUri.toString()); + } + } + } + this._data.forEach(value => uris.push(value.sourceUri)); + this._data = newData; + this._onDidChange.fire(uris); + } + + provideDecorations(uri: URI): IResourceDecoration { + const resource = this._data.get(uri.toString()); + if (!resource) { + return undefined; + } + return { + severity: Severity.Info, + color: resource.decorations.color, + icon: { light: resource.decorations.icon, dark: resource.decorations.iconDark } + }; + } +} export class FileDecorations implements IWorkbenchContribution { private readonly _disposables: IDisposable[]; - private readonly _repositoryListeners = new Map(); + private readonly _providers = new Map(); constructor( @IResourceDecorationsService private _decorationsService: IResourceDecorationsService, @@ -28,62 +81,25 @@ export class FileDecorations implements IWorkbenchContribution { ]; } + getId(): string { + throw new Error('smc.SCMFileDecorations'); + } + dispose(): void { dispose(this._disposables); } private _onDidAddRepository(repo: ISCMRepository): void { - const type = this._decorationsService.registerDecorationType(repo.provider.label); - const { provider } = repo; - - let oldDecorations = new Map(); - const listener = provider.onDidChangeResources(() => { - - let newDecorations = new Map(); - for (const group of provider.resources) { - - for (const resource of group.resourceCollection.resources) { - if (!resource.decorations.color) { - continue; - } - - this._decorationsService.setDecoration(type, resource.sourceUri, { - severity: Severity.Info, - color: resource.decorations.color, - icon: { light: resource.decorations.icon, dark: resource.decorations.iconDark } - }); - newDecorations.set(resource.sourceUri.toString(), resource.sourceUri); - } - } - - oldDecorations.forEach((value, key) => { - if (!newDecorations.has(key)) { - this._decorationsService.setDecoration(type, value); - } - }); - - oldDecorations = newDecorations; - }); - - this._repositoryListeners.set(repo, { - dispose() { - listener.dispose(); - type.dispose(); - } - }); + const provider = new SCMDecorationsProvider(repo.provider); + const registration = this._decorationsService.registerDecortionsProvider(provider); + this._providers.set(repo, combinedDisposable([registration, provider])); } private _onDidRemoveRepository(repo: ISCMRepository): void { - let listener = this._repositoryListeners.get(repo); + let listener = this._providers.get(repo); if (listener) { - this._repositoryListeners.delete(repo); + this._providers.delete(repo); listener.dispose(); } } - - - getId(): string { - throw new Error('smc.SCMFileDecorations'); - } - } diff --git a/src/vs/workbench/services/decorations/browser/decorations.ts b/src/vs/workbench/services/decorations/browser/decorations.ts index af56f65ac86..ab3e9718f03 100644 --- a/src/vs/workbench/services/decorations/browser/decorations.ts +++ b/src/vs/workbench/services/decorations/browser/decorations.ts @@ -9,29 +9,22 @@ import URI from 'vs/base/common/uri'; import Event from 'vs/base/common/event'; import Severity from 'vs/base/common/severity'; import { ColorIdentifier } from 'vs/platform/theme/common/colorRegistry'; +import { IDisposable } from 'vs/base/common/lifecycle'; export const IResourceDecorationsService = createDecorator('IFileDecorationsService'); -export abstract class DecorationType { - readonly label: string; - protected constructor(label: string) { - this.label = label; - } - dispose(): void { - // - } -} - -export interface IResourceDecoration extends IResourceDecorationData { - readonly type: DecorationType; -} - -export interface IResourceDecorationData { +export interface IResourceDecoration { readonly severity: Severity; readonly color?: ColorIdentifier; readonly icon?: URI | { dark: URI, light: URI }; } +export interface IDecorationsProvider { + readonly label: string; + readonly onDidChange: Event; + provideDecorations(uri: URI): IResourceDecoration | Thenable; +} + export interface IResourceDecorationChangeEvent { affectsResource(uri: URI): boolean; } @@ -42,11 +35,7 @@ export interface IResourceDecorationsService { readonly onDidChangeDecorations: Event; - registerDecorationType(label: string): DecorationType; - - setDecoration(type: DecorationType, target: URI, data?: IResourceDecorationData): void; - - getDecorations(uri: URI, includeChildren: boolean): IResourceDecoration[]; + registerDecortionsProvider(provider: IDecorationsProvider): IDisposable; getTopDecoration(uri: URI, includeChildren: boolean): IResourceDecoration; } diff --git a/src/vs/workbench/services/decorations/browser/decorationsService.ts b/src/vs/workbench/services/decorations/browser/decorationsService.ts index 456c8f5cf40..6fdc51d1749 100644 --- a/src/vs/workbench/services/decorations/browser/decorationsService.ts +++ b/src/vs/workbench/services/decorations/browser/decorationsService.ts @@ -7,8 +7,11 @@ import URI from 'vs/base/common/uri'; import Severity from 'vs/base/common/severity'; import Event, { Emitter, debounceEvent } from 'vs/base/common/event'; -import { IResourceDecorationsService, IResourceDecoration, DecorationType, IResourceDecorationData, IResourceDecorationChangeEvent } from './decorations'; +import { IResourceDecorationsService, IResourceDecoration, IResourceDecorationChangeEvent, IDecorationsProvider } from './decorations'; import { TernarySearchTree } from 'vs/base/common/map'; +import { IDisposable } from 'vs/base/common/lifecycle'; +import { isThenable } from 'vs/base/common/async'; +import { LinkedList } from 'vs/base/common/linkedList'; class FileDecorationChangeEvent implements IResourceDecorationChangeEvent { @@ -18,96 +21,134 @@ class FileDecorationChangeEvent implements IResourceDecorationChangeEvent { return this._data.get(uri.toString()) || this._data.findSuperstr(uri.toString()) !== undefined; } - static debouncer(last: FileDecorationChangeEvent, current: URI) { + static debouncer(last: FileDecorationChangeEvent, current: URI | URI[]) { if (!last) { last = new FileDecorationChangeEvent(); } - last._data.set(current.toString(), true); + if (Array.isArray(current)) { + // many + for (const uri of current) { + last._data.set(uri.toString(), true); + } + } else { + // one + last._data.set(current.toString(), true); + } + return last; } } +class DecorationProviderWrapper { + + private readonly _data = TernarySearchTree.forPaths | IResourceDecoration>(); + private readonly _dispoable: IDisposable; + + constructor( + private readonly _provider: IDecorationsProvider, + private readonly _emitter: Emitter + ) { + this._dispoable = this._provider.onDidChange(uris => { + for (const uri of uris) { + this._data.delete(uri.toString()); + this._fetchData(uri); + } + }); + } + + dispose(): void { + this._dispoable.dispose(); + this._data.clear(); + } + + getOrRetrieve(uri: URI, includeChildren: boolean, callback: (data: IResourceDecoration) => void): void { + const key = uri.toString(); + const item = this._data.get(key); + + if (isThenable(item)) { + // pending -> still waiting + return; + } + + if (item === undefined && !includeChildren) { + // unknown, a leaf node -> trigger request + this._fetchData(uri); + return; + } + + if (item) { + // leaf node + callback(item); + } + if (includeChildren) { + // (resolved) children + const childTree = this._data.findSuperstr(key); + if (childTree) { + childTree.forEach(([, value]) => { + if (value && !isThenable(value)) { + callback(value); + } + }); + } + } + } + + private _fetchData(uri: URI) { + const request = Promise.resolve(this._provider.provideDecorations(uri)) + .then(data => { + this._data.set(uri.toString(), data || null); + this._emitter.fire(uri); + }) + .catch(_ => this._data.delete(uri.toString())); + + this._data.set(uri.toString(), request); + } +} + export class FileDecorationsService implements IResourceDecorationsService { - readonly _serviceBrand; + _serviceBrand: any; - private readonly _onDidChangeFileDecoration = new Emitter(); - private readonly _types = new Map>(); + private readonly _data = new LinkedList(); + private readonly _onDidChangeFileDecoration = new Emitter(); - readonly onDidChangeDecorations: Event = debounceEvent( + readonly onDidChangeDecorations: Event = debounceEvent( this._onDidChangeFileDecoration.event, FileDecorationChangeEvent.debouncer ); - registerDecorationType(label: string): DecorationType { - const outer = this; - const type = new class extends DecorationType { - constructor() { - super(label); - } - dispose() { - let tree = outer._types.get(type); - if (tree) { - tree.forEach(([key]) => outer._onDidChangeFileDecoration.fire(URI.parse(key))); - outer._types.delete(type); - } + registerDecortionsProvider(provider: IDecorationsProvider): IDisposable { + + const wrapper = new DecorationProviderWrapper(provider, this._onDidChangeFileDecoration); + const remove = this._data.push(wrapper); + // fire for all + return { + dispose: () => { + wrapper.dispose(); + remove(); } }; - this._types.set(type, TernarySearchTree.forPaths()); - return type; - } - - setDecoration(type: DecorationType, target: URI, data?: IResourceDecorationData): void { - if (data) { - this._types.get(type).set(target.toString(), { type, ...data }); - } else { - this._types.get(type).delete(target.toString()); - } - this._onDidChangeFileDecoration.fire(target); - } - - getDecorations(uri: URI, includeChildren: boolean): IResourceDecoration[] { - let ret: IResourceDecoration[] = []; - this._someFileDecoration(uri, includeChildren, decoration => { - ret.push(decoration); - return false; - }); - return ret; } getTopDecoration(uri: URI, includeChildren: boolean): IResourceDecoration { let top: IResourceDecoration; - this._someFileDecoration(uri, includeChildren, decoration => { - // top is the most severe one, - // stop as soon as an error is found - if (!top || FileDecorationsService._compareFileDecorationsBySeverity(top, decoration) > 0) { - top = decoration; - } - return top !== undefined && top.severity === Severity.Error; - }); + for (let iter = this._data.iterator(), next = iter.next(); !next.done; next = iter.next()) { + next.value.getOrRetrieve(uri, includeChildren, candidate => { + top = FileDecorationsService._pickBest(top, candidate); + }); + } return top; } - private _someFileDecoration(uri: URI, includeChildren: boolean, callback: (a: IResourceDecoration) => boolean): void { - let key = uri.toString(); - let done = false; - this._types.forEach(tree => { - if (done) { - return; - } - if (includeChildren) { - let newTree = tree.findSuperstr(key); - if (newTree) { - newTree.forEach(([, deco]) => done = done || callback(deco)); - } - } else { - let deco = tree.get(key); - done = done || deco && callback(deco); - } - }); - } - - private static _compareFileDecorationsBySeverity(a: IResourceDecoration, b: IResourceDecoration): number { - return Severity.compare(a.severity, b.severity); + private static _pickBest(a: IResourceDecoration, b: IResourceDecoration): IResourceDecoration { + if (!a) { + return b; + } else if (!b) { + return a; + } else if (Severity.compare(a.severity, b.severity) < 0) { + return a; + } else { + return b; + } } } From 7921c1fe491af7bdddf849a6f92395b4769a0a8a Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Mon, 9 Oct 2017 13:55:27 +0200 Subject: [PATCH 124/158] add setting for scm, handle de-registration --- .../markers/browser/markersFileDecorations.ts | 4 +-- .../browser/markersWorkbenchContributions.ts | 4 +-- .../scm/electron-browser/scm.contribution.ts | 15 +++++++++ .../electron-browser/scmFileDecorations.ts | 33 ++++++++++++++----- .../decorations/browser/decorationsService.ts | 26 ++++++++++----- 5 files changed, 62 insertions(+), 20 deletions(-) diff --git a/src/vs/workbench/parts/markers/browser/markersFileDecorations.ts b/src/vs/workbench/parts/markers/browser/markersFileDecorations.ts index 2a9a05a17a2..c12f87e110f 100644 --- a/src/vs/workbench/parts/markers/browser/markersFileDecorations.ts +++ b/src/vs/workbench/parts/markers/browser/markersFileDecorations.ts @@ -74,8 +74,8 @@ class MarkersFileDecorations implements IWorkbenchContribution { } private _updateEnablement(): void { - let value = this._configurationService.getConfiguration<{ showOnFiles: boolean }>('problems'); - if (value) { + let value = this._configurationService.getConfiguration<{ fileDecorations: { enabled: boolean } }>('problems'); + if (value.fileDecorations.enabled) { const provider = new MarkersDecorationsProvider(this._markerService); this._provider = this._decorationsService.registerDecortionsProvider(provider); } else if (this._provider) { diff --git a/src/vs/workbench/parts/markers/browser/markersWorkbenchContributions.ts b/src/vs/workbench/parts/markers/browser/markersWorkbenchContributions.ts index 45e7ca37718..b3dbb714669 100644 --- a/src/vs/workbench/parts/markers/browser/markersWorkbenchContributions.ts +++ b/src/vs/workbench/parts/markers/browser/markersWorkbenchContributions.ts @@ -56,8 +56,8 @@ export function registerContributions(): void { 'order': 101, 'type': 'object', 'properties': { - 'problems.showOnFiles': { - 'description': localize('markers.showOnFile', "Show Errors & Warnings in the file explorer."), + 'problems.fileDecorations.enabled': { + 'description': localize('markers.showOnFile', "Show Errors & Warnings on files and folder."), 'type': 'boolean', 'default': true } diff --git a/src/vs/workbench/parts/scm/electron-browser/scm.contribution.ts b/src/vs/workbench/parts/scm/electron-browser/scm.contribution.ts index 93da15cee69..9510db9af9e 100644 --- a/src/vs/workbench/parts/scm/electron-browser/scm.contribution.ts +++ b/src/vs/workbench/parts/scm/electron-browser/scm.contribution.ts @@ -19,6 +19,7 @@ import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/edi import { StatusUpdater, StatusBarController } from './scmActivity'; import { FileDecorations } from './scmFileDecorations'; import { SCMViewlet } from 'vs/workbench/parts/scm/electron-browser/scmViewlet'; +import { IConfigurationRegistry, Extensions } from 'vs/platform/configuration/common/configurationRegistry'; class OpenSCMViewletAction extends ToggleViewletAction { @@ -64,3 +65,17 @@ Registry.as(WorkbenchActionExtensions.WorkbenchActions 'View: Show SCM', localize('view', "View") ); + + +Registry.as(Extensions.Configuration).registerConfiguration({ + 'id': 'scm', + 'order': 101, + 'type': 'object', + 'properties': { + 'scm.fileDecorations.enabled': { + 'description': localize('scm.fileDecorations.enabled', "Show source control status on files and folders"), + 'type': 'boolean', + 'default': true + } + } +}); diff --git a/src/vs/workbench/parts/scm/electron-browser/scmFileDecorations.ts b/src/vs/workbench/parts/scm/electron-browser/scmFileDecorations.ts index 03aacefc190..332577c07a0 100644 --- a/src/vs/workbench/parts/scm/electron-browser/scmFileDecorations.ts +++ b/src/vs/workbench/parts/scm/electron-browser/scmFileDecorations.ts @@ -12,6 +12,7 @@ import { ISCMService, ISCMRepository, ISCMProvider, ISCMResource } from 'vs/work import URI from 'vs/base/common/uri'; import Severity from 'vs/base/common/severity'; import Event, { Emitter } from 'vs/base/common/event'; +import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; class SCMDecorationsProvider implements IDecorationsProvider { @@ -32,6 +33,7 @@ class SCMDecorationsProvider implements IDecorationsProvider { dispose(): void { this._disposable.dispose(); + this._data.clear(); } private _updateGroups(): void { @@ -67,18 +69,17 @@ class SCMDecorationsProvider implements IDecorationsProvider { export class FileDecorations implements IWorkbenchContribution { - private readonly _disposables: IDisposable[]; - private readonly _providers = new Map(); + private _providers = new Map(); + private _configListener: IDisposable; + private _repoListeners: IDisposable[]; constructor( @IResourceDecorationsService private _decorationsService: IResourceDecorationsService, + @IConfigurationService private _configurationService: IConfigurationService, @ISCMService private _scmService: ISCMService, ) { - this._scmService.repositories.forEach(this._onDidAddRepository, this); - this._disposables = [ - this._scmService.onDidAddRepository(this._onDidAddRepository, this), - this._scmService.onDidRemoveRepository(this._onDidRemoveRepository, this), - ]; + this._configListener = this._configurationService.onDidUpdateConfiguration(this._update, this); + this._update(); } getId(): string { @@ -86,7 +87,23 @@ export class FileDecorations implements IWorkbenchContribution { } dispose(): void { - dispose(this._disposables); + this._providers.forEach(value => dispose(value)); + dispose(this._repoListeners); + dispose(this._configListener, this._configListener); + } + + private _update(): void { + const value = this._configurationService.getConfiguration<{ fileDecorations: { enabled: boolean } }>('scm'); + if (value.fileDecorations.enabled) { + this._scmService.repositories.forEach(this._onDidAddRepository, this); + this._repoListeners = [ + this._scmService.onDidAddRepository(this._onDidAddRepository, this), + this._scmService.onDidRemoveRepository(this._onDidRemoveRepository, this) + ]; + } else { + this._providers.forEach(value => dispose(value)); + this._repoListeners = dispose(this._repoListeners); + } } private _onDidAddRepository(repo: ISCMRepository): void { diff --git a/src/vs/workbench/services/decorations/browser/decorationsService.ts b/src/vs/workbench/services/decorations/browser/decorationsService.ts index 6fdc51d1749..99437905107 100644 --- a/src/vs/workbench/services/decorations/browser/decorationsService.ts +++ b/src/vs/workbench/services/decorations/browser/decorationsService.ts @@ -6,7 +6,7 @@ import URI from 'vs/base/common/uri'; import Severity from 'vs/base/common/severity'; -import Event, { Emitter, debounceEvent } from 'vs/base/common/event'; +import Event, { Emitter, debounceEvent, any } from 'vs/base/common/event'; import { IResourceDecorationsService, IResourceDecoration, IResourceDecorationChangeEvent, IDecorationsProvider } from './decorations'; import { TernarySearchTree } from 'vs/base/common/map'; import { IDisposable } from 'vs/base/common/lifecycle'; @@ -61,6 +61,10 @@ class DecorationProviderWrapper { this._data.clear(); } + knowsAbout(uri: URI): boolean { + return Boolean(this._data.get(uri.toString())) || Boolean(this._data.findSuperstr(uri.toString())); + } + getOrRetrieve(uri: URI, includeChildren: boolean, callback: (data: IResourceDecoration) => void): void { const key = uri.toString(); const item = this._data.get(key); @@ -110,22 +114,28 @@ export class FileDecorationsService implements IResourceDecorationsService { _serviceBrand: any; private readonly _data = new LinkedList(); - private readonly _onDidChangeFileDecoration = new Emitter(); + private readonly _onDidChangeDecorationsDelayed = new Emitter(); + private readonly _onDidChangeDecorations = new Emitter(); - readonly onDidChangeDecorations: Event = debounceEvent( - this._onDidChangeFileDecoration.event, - FileDecorationChangeEvent.debouncer + readonly onDidChangeDecorations: Event = any( + this._onDidChangeDecorations.event, + debounceEvent( + this._onDidChangeDecorationsDelayed.event, + FileDecorationChangeEvent.debouncer + ) ); registerDecortionsProvider(provider: IDecorationsProvider): IDisposable { - const wrapper = new DecorationProviderWrapper(provider, this._onDidChangeFileDecoration); + const wrapper = new DecorationProviderWrapper(provider, this._onDidChangeDecorationsDelayed); const remove = this._data.push(wrapper); - // fire for all return { dispose: () => { - wrapper.dispose(); + // fire event that says 'yes' for any resource + // known to this provider. then dispose and remove it. remove(); + this._onDidChangeDecorations.fire({ affectsResource: uri => wrapper.knowsAbout(uri) }); + wrapper.dispose(); } }; } From 9e5bd5fbefa759f4c49a6400b60fffccfc297d12 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Mon, 9 Oct 2017 14:08:52 +0200 Subject: [PATCH 125/158] add tooltip, prefix, and suffix text --- .../markers/browser/markersFileDecorations.ts | 19 ++++++++++--------- .../electron-browser/scmFileDecorations.ts | 1 + .../decorations/browser/decorations.ts | 3 +++ 3 files changed, 14 insertions(+), 9 deletions(-) diff --git a/src/vs/workbench/parts/markers/browser/markersFileDecorations.ts b/src/vs/workbench/parts/markers/browser/markersFileDecorations.ts index c12f87e110f..e5bf939370a 100644 --- a/src/vs/workbench/parts/markers/browser/markersFileDecorations.ts +++ b/src/vs/workbench/parts/markers/browser/markersFileDecorations.ts @@ -6,7 +6,7 @@ 'use strict'; import { IWorkbenchContribution, IWorkbenchContributionsRegistry, Extensions } from 'vs/workbench/common/contributions'; -import { IMarkerService, IMarker } from 'vs/platform/markers/common/markers'; +import { IMarkerService } from 'vs/platform/markers/common/markers'; import { IResourceDecorationsService, IDecorationsProvider, IResourceDecoration } from 'vs/workbench/services/decorations/browser/decorations'; import { IDisposable, dispose } from 'vs/base/common/lifecycle'; import URI from 'vs/base/common/uri'; @@ -34,15 +34,16 @@ class MarkersDecorationsProvider implements IDecorationsProvider { const markers = this._markerService.read({ resource }) .sort((a, b) => Severity.compare(a.severity, b.severity)); - return !isFalsyOrEmpty(markers) - ? MarkersDecorationsProvider._toFileDecorationData(markers[0]) - : undefined; - } + if (isFalsyOrEmpty(markers)) { + return undefined; + } - private static _toFileDecorationData(marker: IMarker): IResourceDecoration { - const { severity } = marker; - const color = severity === Severity.Error ? editorErrorForeground : editorWarningForeground; - return { severity, color }; + const [first] = markers; + return { + severity: first.severity, + tooltip: markers.length > 1 ? localize('tooltip', "{0} and {1} more problems", first.message, markers.length) : first.message, + color: first.severity === Severity.Error ? editorErrorForeground : editorWarningForeground + }; } } diff --git a/src/vs/workbench/parts/scm/electron-browser/scmFileDecorations.ts b/src/vs/workbench/parts/scm/electron-browser/scmFileDecorations.ts index 332577c07a0..c03b44feef8 100644 --- a/src/vs/workbench/parts/scm/electron-browser/scmFileDecorations.ts +++ b/src/vs/workbench/parts/scm/electron-browser/scmFileDecorations.ts @@ -62,6 +62,7 @@ class SCMDecorationsProvider implements IDecorationsProvider { return { severity: Severity.Info, color: resource.decorations.color, + tooltip: resource.decorations.tooltip, icon: { light: resource.decorations.icon, dark: resource.decorations.iconDark } }; } diff --git a/src/vs/workbench/services/decorations/browser/decorations.ts b/src/vs/workbench/services/decorations/browser/decorations.ts index ab3e9718f03..26a494a4ec6 100644 --- a/src/vs/workbench/services/decorations/browser/decorations.ts +++ b/src/vs/workbench/services/decorations/browser/decorations.ts @@ -15,6 +15,9 @@ export const IResourceDecorationsService = createDecorator Date: Mon, 9 Oct 2017 14:35:21 +0200 Subject: [PATCH 126/158] tweak label --- src/vs/base/browser/ui/iconLabel/iconLabel.ts | 6 ++++- src/vs/workbench/browser/labels.ts | 26 ++++++++++++------- 2 files changed, 22 insertions(+), 10 deletions(-) diff --git a/src/vs/base/browser/ui/iconLabel/iconLabel.ts b/src/vs/base/browser/ui/iconLabel/iconLabel.ts index fb83ca1d3b1..f41e16128e8 100644 --- a/src/vs/base/browser/ui/iconLabel/iconLabel.ts +++ b/src/vs/base/browser/ui/iconLabel/iconLabel.ts @@ -13,6 +13,7 @@ import uri from 'vs/base/common/uri'; import paths = require('vs/base/common/paths'); import { IWorkspaceFolderProvider, getPathLabel, IUserHomeProvider } from 'vs/base/common/labels'; import { IDisposable, combinedDisposable } from 'vs/base/common/lifecycle'; +import { Color } from 'vs/base/common/color'; export interface IIconLabelCreationOptions { supportHighlights?: boolean; @@ -22,6 +23,7 @@ export interface IIconLabelOptions { title?: string; extraClasses?: string[]; italic?: boolean; + color?: Color; matches?: IMatch[]; } @@ -127,6 +129,8 @@ export class IconLabel { if (options.italic) { classes.push('italic'); } + + this.element.style.color = options.color ? options.color.toString() : ''; } this.domNode.className = classes.join(' '); @@ -163,4 +167,4 @@ export class FileLabel extends IconLabel { this.setValue(paths.basename(file.fsPath), parent && parent !== '.' ? getPathLabel(parent, provider, userHome) : '', { title: file.fsPath }); } -} \ No newline at end of file +} diff --git a/src/vs/workbench/browser/labels.ts b/src/vs/workbench/browser/labels.ts index b2b17617109..3175fa3ad8f 100644 --- a/src/vs/workbench/browser/labels.ts +++ b/src/vs/workbench/browser/labels.ts @@ -25,6 +25,7 @@ import { Schemas } from 'vs/base/common/network'; import { FileKind } from 'vs/platform/files/common/files'; import { IModel } from 'vs/editor/common/editorCommon'; import { IThemeService } from 'vs/platform/theme/common/themeService'; +import { Color } from 'vs/base/common/color'; export interface IResourceLabel { name: string; @@ -179,23 +180,30 @@ export class ResourceLabel extends IconLabel { extraClasses.push(...this.options.extraClasses); } - let deco: IResourceDecoration; + const italic = this.options && this.options.italic; + const matches = this.options && this.options.matches; + + let color: Color; if (this.options) { + let deco: IResourceDecoration; if (this.options.showDecorations) { deco = this.decorationsService.getTopDecoration(resource, false); } else if (this.options.showAllDecorations) { deco = this.decorationsService.getTopDecoration(resource, true); } + + if (deco) { + color = this.themeService.getTheme().getColor(deco.color); + } } - // set/unset color from decoration - const color = deco && this.themeService.getTheme().getColor(deco.color, true); - this.element.style.color = color ? color.toString() : ''; - - const italic = this.options && this.options.italic; - const matches = this.options && this.options.matches; - - this.setValue(this.label.name, this.label.description, { title, extraClasses, italic, matches }); + this.setValue(this.label.name, this.label.description, { + title, + extraClasses, + italic, + matches, + color + }); } public dispose(): void { From 73164106d581048e293701bdf6585f49f28fb5dd Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Mon, 9 Oct 2017 14:59:39 +0200 Subject: [PATCH 127/158] simplify git decorations... --- extensions/git/package.json | 22 ++---------- extensions/git/src/repository.ts | 5 +-- .../electron-browser/scmFileDecorations.ts | 36 ++++++++----------- 3 files changed, 18 insertions(+), 45 deletions(-) diff --git a/extensions/git/package.json b/extensions/git/package.json index c8408252664..8eeaeb7cace 100644 --- a/extensions/git/package.json +++ b/extensions/git/package.json @@ -806,31 +806,13 @@ }, "colors": [ { - "id": "git.color.untracked", - "description": "Color for untracked resources", + "id": "git.color.modified", + "description": "Color for modified resources", "defaults": { "light": "#b47d16", "dark": "#cf9425", "highContrast": "#cf9425" } - }, - { - "id": "git.color.modified", - "description": "Color for modified resources", - "defaults": { - "light": "#007acc", - "dark": "#007acc", - "highContrast": "#007acc" - } - }, - { - "id": "git.color.ignored", - "description": "Color for ignored resources", - "defaults": { - "light": "#00000033", - "dark": "#ffffff33", - "highContrast": "#ffffff33" - } } ] }, diff --git a/extensions/git/src/repository.ts b/extensions/git/src/repository.ts index 465c9211f70..efc10d9a6fc 100644 --- a/extensions/git/src/repository.ts +++ b/extensions/git/src/repository.ts @@ -174,11 +174,8 @@ export class Resource implements SourceControlResourceState { switch (this.type) { case Status.INDEX_MODIFIED: case Status.MODIFIED: - return new ThemeColor('git.color.modified'); case Status.UNTRACKED: - return new ThemeColor('git.color.untracked'); - case Status.IGNORED: - return new ThemeColor('git.color.ignored'); + return new ThemeColor('git.color.modified'); default: return undefined; } diff --git a/src/vs/workbench/parts/scm/electron-browser/scmFileDecorations.ts b/src/vs/workbench/parts/scm/electron-browser/scmFileDecorations.ts index c03b44feef8..fae8074a41f 100644 --- a/src/vs/workbench/parts/scm/electron-browser/scmFileDecorations.ts +++ b/src/vs/workbench/parts/scm/electron-browser/scmFileDecorations.ts @@ -8,17 +8,17 @@ import { IWorkbenchContribution } from 'vs/workbench/common/contributions'; import { IResourceDecorationsService, IDecorationsProvider, IResourceDecoration } from 'vs/workbench/services/decorations/browser/decorations'; import { IDisposable, dispose, combinedDisposable } from 'vs/base/common/lifecycle'; -import { ISCMService, ISCMRepository, ISCMProvider, ISCMResource } from 'vs/workbench/services/scm/common/scm'; +import { ISCMService, ISCMRepository, ISCMProvider } from 'vs/workbench/services/scm/common/scm'; import URI from 'vs/base/common/uri'; import Severity from 'vs/base/common/severity'; import Event, { Emitter } from 'vs/base/common/event'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; +import { localize } from 'vs/nls'; class SCMDecorationsProvider implements IDecorationsProvider { private readonly _disposable: IDisposable; private readonly _onDidChange = new Emitter(); - private _data = new Map(); readonly label: string; readonly onDidChange: Event = this._onDidChange.event; @@ -33,38 +33,32 @@ class SCMDecorationsProvider implements IDecorationsProvider { dispose(): void { this._disposable.dispose(); - this._data.clear(); } private _updateGroups(): void { const uris: URI[] = []; - const newData = new Map(); for (const group of this._provider.resources) { for (const resource of group.resourceCollection.resources) { - const { sourceUri } = resource; - if (this._data.get(sourceUri.toString()) !== resource) { - newData.set(sourceUri.toString(), resource); - uris.push(sourceUri); - this._data.delete(sourceUri.toString()); - } + uris.push(resource.sourceUri); } } - this._data.forEach(value => uris.push(value.sourceUri)); - this._data = newData; this._onDidChange.fire(uris); } provideDecorations(uri: URI): IResourceDecoration { - const resource = this._data.get(uri.toString()); - if (!resource) { - return undefined; + for (const group of this._provider.resources) { + for (const resource of group.resourceCollection.resources) { + if (resource.sourceUri.toString() === uri.toString()) { + return { + severity: Severity.Info, + color: resource.decorations.color, + tooltip: localize('tooltip', "{0}, {1}", resource.decorations.tooltip, this._provider.label), + icon: { light: resource.decorations.icon, dark: resource.decorations.iconDark } + }; + } + } } - return { - severity: Severity.Info, - color: resource.decorations.color, - tooltip: resource.decorations.tooltip, - icon: { light: resource.decorations.icon, dark: resource.decorations.iconDark } - }; + return undefined; } } From b63319d902135c712c60ddf1e62f829b2d26bb32 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Mon, 9 Oct 2017 15:11:16 +0200 Subject: [PATCH 128/158] support suffix/prefix label --- src/vs/workbench/browser/labels.ts | 22 ++++++++++++++++++- .../electron-browser/scmFileDecorations.ts | 3 ++- 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/browser/labels.ts b/src/vs/workbench/browser/labels.ts index 3175fa3ad8f..85900b17227 100644 --- a/src/vs/workbench/browser/labels.ts +++ b/src/vs/workbench/browser/labels.ts @@ -26,6 +26,7 @@ import { FileKind } from 'vs/platform/files/common/files'; import { IModel } from 'vs/editor/common/editorCommon'; import { IThemeService } from 'vs/platform/theme/common/themeService'; import { Color } from 'vs/base/common/color'; +import { localize } from 'vs/nls'; export interface IResourceLabel { name: string; @@ -163,6 +164,7 @@ export class ResourceLabel extends IconLabel { } const resource = this.label.resource; + let label = this.label.name; let title = ''; if (this.options && typeof this.options.title === 'string') { @@ -194,10 +196,28 @@ export class ResourceLabel extends IconLabel { if (deco) { color = this.themeService.getTheme().getColor(deco.color); + + if (deco.tooltip) { + title = localize('deco.tooltip', "{0}, {1}", title, deco.tooltip); + } + + if (deco.prefix) { + label += deco.prefix; + if (matches) { + matches.forEach(match => { + match.start += deco.prefix.length; + match.end += deco.prefix.length; + }); + } + } + + if (deco.suffix) { + label += deco.suffix; + } } } - this.setValue(this.label.name, this.label.description, { + this.setValue(label, this.label.description, { title, extraClasses, italic, diff --git a/src/vs/workbench/parts/scm/electron-browser/scmFileDecorations.ts b/src/vs/workbench/parts/scm/electron-browser/scmFileDecorations.ts index fae8074a41f..a4f840ef2e6 100644 --- a/src/vs/workbench/parts/scm/electron-browser/scmFileDecorations.ts +++ b/src/vs/workbench/parts/scm/electron-browser/scmFileDecorations.ts @@ -52,7 +52,8 @@ class SCMDecorationsProvider implements IDecorationsProvider { return { severity: Severity.Info, color: resource.decorations.color, - tooltip: localize('tooltip', "{0}, {1}", resource.decorations.tooltip, this._provider.label), + suffix: '*', + tooltip: localize('tooltip', "{0} - {1}", resource.decorations.tooltip, this._provider.label), icon: { light: resource.decorations.icon, dark: resource.decorations.iconDark } }; } From 49ed34f8672422bbc5663dce01503950f7ef4635 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Mon, 9 Oct 2017 15:14:38 +0200 Subject: [PATCH 129/158] support leafOnly option --- src/vs/workbench/services/decorations/browser/decorations.ts | 1 + .../services/decorations/browser/decorationsService.ts | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/services/decorations/browser/decorations.ts b/src/vs/workbench/services/decorations/browser/decorations.ts index 26a494a4ec6..f2e0aa4753c 100644 --- a/src/vs/workbench/services/decorations/browser/decorations.ts +++ b/src/vs/workbench/services/decorations/browser/decorations.ts @@ -20,6 +20,7 @@ export interface IResourceDecoration { readonly suffix?: string; readonly color?: ColorIdentifier; readonly icon?: URI | { dark: URI, light: URI }; + readonly leafOnly?: boolean; } export interface IDecorationsProvider { diff --git a/src/vs/workbench/services/decorations/browser/decorationsService.ts b/src/vs/workbench/services/decorations/browser/decorationsService.ts index 99437905107..771b353f193 100644 --- a/src/vs/workbench/services/decorations/browser/decorationsService.ts +++ b/src/vs/workbench/services/decorations/browser/decorationsService.ts @@ -89,7 +89,7 @@ class DecorationProviderWrapper { const childTree = this._data.findSuperstr(key); if (childTree) { childTree.forEach(([, value]) => { - if (value && !isThenable(value)) { + if (value && !isThenable(value) && !value.leafOnly) { callback(value); } }); From 88927c9bc5c6fc1888e50cc032ba1530952edef0 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Mon, 9 Oct 2017 15:41:44 +0200 Subject: [PATCH 130/158] have just 1 option --- src/vs/workbench/browser/labels.ts | 22 +++++++------------ .../files/browser/views/explorerViewer.ts | 3 +-- 2 files changed, 9 insertions(+), 16 deletions(-) diff --git a/src/vs/workbench/browser/labels.ts b/src/vs/workbench/browser/labels.ts index 85900b17227..023e27283d1 100644 --- a/src/vs/workbench/browser/labels.ts +++ b/src/vs/workbench/browser/labels.ts @@ -20,7 +20,7 @@ import { IDisposable, dispose } from 'vs/base/common/lifecycle'; import { IModelService } from 'vs/editor/common/services/modelService'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { IUntitledEditorService } from 'vs/workbench/services/untitled/common/untitledEditorService'; -import { IResourceDecorationsService, IResourceDecoration, IResourceDecorationChangeEvent } from 'vs/workbench/services/decorations/browser/decorations'; +import { IResourceDecorationsService, IResourceDecorationChangeEvent } from 'vs/workbench/services/decorations/browser/decorations'; import { Schemas } from 'vs/base/common/network'; import { FileKind } from 'vs/platform/files/common/files'; import { IModel } from 'vs/editor/common/editorCommon'; @@ -36,8 +36,7 @@ export interface IResourceLabel { export interface IResourceLabelOptions extends IIconLabelOptions { fileKind?: FileKind; - showDecorations?: boolean; - showAllDecorations?: boolean; + fileDecorations?: 'mine' | 'all'; } export class ResourceLabel extends IconLabel { @@ -98,10 +97,7 @@ export class ResourceLabel extends IconLabel { if (!this.options || !this.label || !this.label.resource) { return; } - if (!this.options.showAllDecorations && !this.options.showDecorations) { - return; - } - if (e.affectsResource(this.label.resource)) { + if (this.options.fileDecorations && e.affectsResource(this.label.resource)) { this.render(false); } } @@ -186,13 +182,11 @@ export class ResourceLabel extends IconLabel { const matches = this.options && this.options.matches; let color: Color; - if (this.options) { - let deco: IResourceDecoration; - if (this.options.showDecorations) { - deco = this.decorationsService.getTopDecoration(resource, false); - } else if (this.options.showAllDecorations) { - deco = this.decorationsService.getTopDecoration(resource, true); - } + if (this.options && this.options.fileDecorations) { + let deco = this.decorationsService.getTopDecoration( + resource, + this.options.fileDecorations === 'all' + ); if (deco) { color = this.themeService.getTheme().getColor(deco.color); diff --git a/src/vs/workbench/parts/files/browser/views/explorerViewer.ts b/src/vs/workbench/parts/files/browser/views/explorerViewer.ts index f9e8fd1a030..7fd15a4cd5e 100644 --- a/src/vs/workbench/parts/files/browser/views/explorerViewer.ts +++ b/src/vs/workbench/parts/files/browser/views/explorerViewer.ts @@ -329,8 +329,7 @@ export class FileRenderer implements IRenderer { hidePath: true, fileKind: stat.isRoot ? FileKind.ROOT_FOLDER : stat.isDirectory ? FileKind.FOLDER : FileKind.FILE, extraClasses, - showAllDecorations: stat.isDirectory, - showDecorations: !stat.isDirectory + fileDecorations: stat.isDirectory ? 'all' : 'mine' }); } From 9fa1a88b2f4c78061eccfe286bea41c2b4a358d9 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Mon, 9 Oct 2017 16:19:01 +0200 Subject: [PATCH 131/158] add explorer setting for file decorations --- src/vs/workbench/parts/files/browser/files.contribution.ts | 7 ++++++- .../workbench/parts/files/browser/views/explorerViewer.ts | 7 +++++-- src/vs/workbench/parts/files/common/files.ts | 3 ++- 3 files changed, 13 insertions(+), 4 deletions(-) diff --git a/src/vs/workbench/parts/files/browser/files.contribution.ts b/src/vs/workbench/parts/files/browser/files.contribution.ts index 173b92b32bd..ecc17a60bdd 100644 --- a/src/vs/workbench/parts/files/browser/files.contribution.ts +++ b/src/vs/workbench/parts/files/browser/files.contribution.ts @@ -350,6 +350,11 @@ configurationRegistry.registerConfiguration({ nls.localize('sortOrder.modified', 'Files and folders are sorted by last modified date, in descending order. Folders are displayed before files.') ], 'description': nls.localize({ key: 'sortOrder', comment: ['This is the description for a setting. Values surrounded by single quotes are not to be translated.'] }, "Controls sorting order of files and folders in the explorer. In addition to the default sorting, you can set the order to 'mixed' (files and folders sorted combined), 'type' (by file type), 'modified' (by last modified date) or 'filesFirst' (sort files before folders).") + }, + 'explorer.enableFileDecorations': { + type: 'boolean', + description: nls.localize('enableFileDecorations', "Controls if the explorer should show file decorations, like SCM status or problems."), + default: true } } -}); \ No newline at end of file +}); diff --git a/src/vs/workbench/parts/files/browser/views/explorerViewer.ts b/src/vs/workbench/parts/files/browser/views/explorerViewer.ts index 7fd15a4cd5e..5073098d46c 100644 --- a/src/vs/workbench/parts/files/browser/views/explorerViewer.ts +++ b/src/vs/workbench/parts/files/browser/views/explorerViewer.ts @@ -292,7 +292,8 @@ export class FileRenderer implements IRenderer { state: FileViewletState, @IContextViewService private contextViewService: IContextViewService, @IInstantiationService private instantiationService: IInstantiationService, - @IThemeService private themeService: IThemeService + @IThemeService private themeService: IThemeService, + @IConfigurationService private configurationService: IConfigurationService ) { this.state = state; } @@ -329,7 +330,9 @@ export class FileRenderer implements IRenderer { hidePath: true, fileKind: stat.isRoot ? FileKind.ROOT_FOLDER : stat.isDirectory ? FileKind.FOLDER : FileKind.FILE, extraClasses, - fileDecorations: stat.isDirectory ? 'all' : 'mine' + fileDecorations: this.configurationService.getConfiguration().explorer.enableFileDecorations + ? stat.isDirectory ? 'all' : 'mine' + : undefined }); } diff --git a/src/vs/workbench/parts/files/common/files.ts b/src/vs/workbench/parts/files/common/files.ts index f2a423c3ce9..150d33372a5 100644 --- a/src/vs/workbench/parts/files/common/files.ts +++ b/src/vs/workbench/parts/files/common/files.ts @@ -71,6 +71,7 @@ export interface IFilesConfiguration extends IFilesConfiguration, IWorkbenchEdit enableDragAndDrop: boolean; confirmDelete: boolean; sortOrder: SortOrder; + enableFileDecorations: boolean; }; editor: IEditorOptions; } @@ -178,4 +179,4 @@ export class FileOnDiskContentProvider implements ITextModelContentProvider { public dispose(): void { this.fileWatcher = dispose(this.fileWatcher); } -} \ No newline at end of file +} From 380616a42c42873a837401fd42387a56a5ea5a8e Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Mon, 9 Oct 2017 16:27:38 +0200 Subject: [PATCH 132/158] keep scm data around --- .../electron-browser/scmFileDecorations.ts | 41 ++++++++++++------- 1 file changed, 26 insertions(+), 15 deletions(-) diff --git a/src/vs/workbench/parts/scm/electron-browser/scmFileDecorations.ts b/src/vs/workbench/parts/scm/electron-browser/scmFileDecorations.ts index a4f840ef2e6..5996767aa42 100644 --- a/src/vs/workbench/parts/scm/electron-browser/scmFileDecorations.ts +++ b/src/vs/workbench/parts/scm/electron-browser/scmFileDecorations.ts @@ -8,7 +8,7 @@ import { IWorkbenchContribution } from 'vs/workbench/common/contributions'; import { IResourceDecorationsService, IDecorationsProvider, IResourceDecoration } from 'vs/workbench/services/decorations/browser/decorations'; import { IDisposable, dispose, combinedDisposable } from 'vs/base/common/lifecycle'; -import { ISCMService, ISCMRepository, ISCMProvider } from 'vs/workbench/services/scm/common/scm'; +import { ISCMService, ISCMRepository, ISCMProvider, ISCMResource } from 'vs/workbench/services/scm/common/scm'; import URI from 'vs/base/common/uri'; import Severity from 'vs/base/common/severity'; import Event, { Emitter } from 'vs/base/common/event'; @@ -19,6 +19,7 @@ class SCMDecorationsProvider implements IDecorationsProvider { private readonly _disposable: IDisposable; private readonly _onDidChange = new Emitter(); + private _data = new Map(); readonly label: string; readonly onDidChange: Event = this._onDidChange.event; @@ -37,29 +38,39 @@ class SCMDecorationsProvider implements IDecorationsProvider { private _updateGroups(): void { const uris: URI[] = []; + const newData = new Map(); for (const group of this._provider.resources) { for (const resource of group.resourceCollection.resources) { - uris.push(resource.sourceUri); + newData.set(resource.sourceUri.toString(), resource); + + if (!this._data.has(resource.sourceUri.toString())) { + uris.push(resource.sourceUri); // added + } } } + + this._data.forEach((value, key) => { + if (!newData.has(key)) { + uris.push(value.sourceUri); // removed + } + }); + + this._data = newData; this._onDidChange.fire(uris); } provideDecorations(uri: URI): IResourceDecoration { - for (const group of this._provider.resources) { - for (const resource of group.resourceCollection.resources) { - if (resource.sourceUri.toString() === uri.toString()) { - return { - severity: Severity.Info, - color: resource.decorations.color, - suffix: '*', - tooltip: localize('tooltip', "{0} - {1}", resource.decorations.tooltip, this._provider.label), - icon: { light: resource.decorations.icon, dark: resource.decorations.iconDark } - }; - } - } + const resource = this._data.get(uri.toString()); + if (!resource) { + return undefined; } - return undefined; + return { + severity: Severity.Info, + color: resource.decorations.color, + suffix: '*', + tooltip: localize('tooltip', "{0} - {1}", resource.decorations.tooltip, this._provider.label), + icon: { light: resource.decorations.icon, dark: resource.decorations.iconDark } + }; } } From 3c68560ed851fd04c336b552810b8fb10a6c4028 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Mon, 9 Oct 2017 16:38:07 +0200 Subject: [PATCH 133/158] remove icons, use tick as suffix decoration --- .../parts/scm/electron-browser/scmFileDecorations.ts | 5 ++--- src/vs/workbench/services/decorations/browser/decorations.ts | 1 - 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/vs/workbench/parts/scm/electron-browser/scmFileDecorations.ts b/src/vs/workbench/parts/scm/electron-browser/scmFileDecorations.ts index 5996767aa42..0aa8a1d962d 100644 --- a/src/vs/workbench/parts/scm/electron-browser/scmFileDecorations.ts +++ b/src/vs/workbench/parts/scm/electron-browser/scmFileDecorations.ts @@ -67,9 +67,8 @@ class SCMDecorationsProvider implements IDecorationsProvider { return { severity: Severity.Info, color: resource.decorations.color, - suffix: '*', - tooltip: localize('tooltip', "{0} - {1}", resource.decorations.tooltip, this._provider.label), - icon: { light: resource.decorations.icon, dark: resource.decorations.iconDark } + suffix: '\'', + tooltip: localize('tooltip', "{0} - {1}", resource.decorations.tooltip, this._provider.label) }; } } diff --git a/src/vs/workbench/services/decorations/browser/decorations.ts b/src/vs/workbench/services/decorations/browser/decorations.ts index f2e0aa4753c..df65b8429f7 100644 --- a/src/vs/workbench/services/decorations/browser/decorations.ts +++ b/src/vs/workbench/services/decorations/browser/decorations.ts @@ -19,7 +19,6 @@ export interface IResourceDecoration { readonly prefix?: string; readonly suffix?: string; readonly color?: ColorIdentifier; - readonly icon?: URI | { dark: URI, light: URI }; readonly leafOnly?: boolean; } From e73da33e4fa009a648c241cd3ac1b9b452d30ca5 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Mon, 9 Oct 2017 18:42:13 +0200 Subject: [PATCH 134/158] add back untracked color, remove suffix for now --- extensions/git/package.json | 9 +++++++++ extensions/git/src/repository.ts | 3 ++- .../parts/scm/electron-browser/scmFileDecorations.ts | 1 - 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/extensions/git/package.json b/extensions/git/package.json index 8eeaeb7cace..b10cfa73f31 100644 --- a/extensions/git/package.json +++ b/extensions/git/package.json @@ -813,6 +813,15 @@ "dark": "#cf9425", "highContrast": "#cf9425" } + }, + { + "id": "git.color.untracked", + "description": "Color for modified resources", + "defaults": { + "light": "#49805b", + "dark": "#73c990", + "highContrast": "#73c990" + } } ] }, diff --git a/extensions/git/src/repository.ts b/extensions/git/src/repository.ts index efc10d9a6fc..f4dab0e46e5 100644 --- a/extensions/git/src/repository.ts +++ b/extensions/git/src/repository.ts @@ -174,8 +174,9 @@ export class Resource implements SourceControlResourceState { switch (this.type) { case Status.INDEX_MODIFIED: case Status.MODIFIED: - case Status.UNTRACKED: return new ThemeColor('git.color.modified'); + case Status.UNTRACKED: + return new ThemeColor('git.color.untracked'); default: return undefined; } diff --git a/src/vs/workbench/parts/scm/electron-browser/scmFileDecorations.ts b/src/vs/workbench/parts/scm/electron-browser/scmFileDecorations.ts index 0aa8a1d962d..d963f462e7e 100644 --- a/src/vs/workbench/parts/scm/electron-browser/scmFileDecorations.ts +++ b/src/vs/workbench/parts/scm/electron-browser/scmFileDecorations.ts @@ -67,7 +67,6 @@ class SCMDecorationsProvider implements IDecorationsProvider { return { severity: Severity.Info, color: resource.decorations.color, - suffix: '\'', tooltip: localize('tooltip', "{0} - {1}", resource.decorations.tooltip, this._provider.label) }; } From 02794bd86a2c464e6359c3e589b93556a0521ae0 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Tue, 10 Oct 2017 09:55:49 +0200 Subject: [PATCH 135/158] re-use scm icons --- src/vs/workbench/browser/labels.ts | 11 +++++++++++ .../parts/scm/electron-browser/scmFileDecorations.ts | 3 ++- .../services/decorations/browser/decorations.ts | 1 + 3 files changed, 14 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/browser/labels.ts b/src/vs/workbench/browser/labels.ts index 023e27283d1..667b934b9c1 100644 --- a/src/vs/workbench/browser/labels.ts +++ b/src/vs/workbench/browser/labels.ts @@ -208,6 +208,17 @@ export class ResourceLabel extends IconLabel { if (deco.suffix) { label += deco.suffix; } + + if (deco.icon) { + const { type } = this.themeService.getTheme(); + const icon = type === 'light' ? deco.icon.light : deco.icon.dark; + + this.element.style.backgroundImage = `url(${icon.toString(true)})`; + this.element.style.backgroundRepeat = 'no-repeat'; + this.element.style.backgroundPosition = 'right center'; + this.element.style.paddingRight = '20px'; + this.element.style.marginRight = '14px'; + } } } diff --git a/src/vs/workbench/parts/scm/electron-browser/scmFileDecorations.ts b/src/vs/workbench/parts/scm/electron-browser/scmFileDecorations.ts index d963f462e7e..0f05f5dbc35 100644 --- a/src/vs/workbench/parts/scm/electron-browser/scmFileDecorations.ts +++ b/src/vs/workbench/parts/scm/electron-browser/scmFileDecorations.ts @@ -67,7 +67,8 @@ class SCMDecorationsProvider implements IDecorationsProvider { return { severity: Severity.Info, color: resource.decorations.color, - tooltip: localize('tooltip', "{0} - {1}", resource.decorations.tooltip, this._provider.label) + tooltip: localize('tooltip', "{0} - {1}", resource.decorations.tooltip, this._provider.label), + icon: { light: resource.decorations.icon, dark: resource.decorations.iconDark } }; } } diff --git a/src/vs/workbench/services/decorations/browser/decorations.ts b/src/vs/workbench/services/decorations/browser/decorations.ts index df65b8429f7..6c9cb6743a5 100644 --- a/src/vs/workbench/services/decorations/browser/decorations.ts +++ b/src/vs/workbench/services/decorations/browser/decorations.ts @@ -19,6 +19,7 @@ export interface IResourceDecoration { readonly prefix?: string; readonly suffix?: string; readonly color?: ColorIdentifier; + readonly icon?: { light: URI, dark: URI }; readonly leafOnly?: boolean; } From d8f20b58eb116d083d6c1d3f96b57a1f09005767 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Tue, 10 Oct 2017 11:16:41 +0200 Subject: [PATCH 136/158] error/warning icons --- .../parts/markers/browser/markersFileDecorations.ts | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/parts/markers/browser/markersFileDecorations.ts b/src/vs/workbench/parts/markers/browser/markersFileDecorations.ts index e5bf939370a..ab126fb6764 100644 --- a/src/vs/workbench/parts/markers/browser/markersFileDecorations.ts +++ b/src/vs/workbench/parts/markers/browser/markersFileDecorations.ts @@ -23,6 +23,9 @@ class MarkersDecorationsProvider implements IDecorationsProvider { readonly label: string = localize('label', "Problems"); readonly onDidChange: Event; + // private static _warningIcon = { light: URI.parse(require.toUrl('./media/status-warning.svg')), dark: URI.parse(require.toUrl('./media/status-warning-inverse.svg')) }; + // private static _errorIcon = { light: URI.parse(require.toUrl('./media/status-error.svg')), dark: URI.parse(require.toUrl('./media/status-error-inverse.svg')) }; + constructor( private readonly _markerService: IMarkerService ) { @@ -41,8 +44,9 @@ class MarkersDecorationsProvider implements IDecorationsProvider { const [first] = markers; return { severity: first.severity, - tooltip: markers.length > 1 ? localize('tooltip', "{0} and {1} more problems", first.message, markers.length) : first.message, - color: first.severity === Severity.Error ? editorErrorForeground : editorWarningForeground + tooltip: localize('tooltip', "{0} problems in this file", markers.length), + color: first.severity === Severity.Error ? editorErrorForeground : editorWarningForeground, + // icon: first.severity === Severity.Error ? MarkersDecorationsProvider._errorIcon : MarkersDecorationsProvider._warningIcon }; } } From 7e2d9ee7b32b66e2192bddbc56f79ecad460bc3f Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Tue, 10 Oct 2017 13:05:04 +0200 Subject: [PATCH 137/158] have markerFileDecorations in one place --- .../markers/browser/markersFileDecorations.ts | 18 ++++++++++++++++-- .../browser/markersWorkbenchContributions.ts | 17 ----------------- .../parts/markers/markers.contribution.ts | 4 +++- 3 files changed, 19 insertions(+), 20 deletions(-) diff --git a/src/vs/workbench/parts/markers/browser/markersFileDecorations.ts b/src/vs/workbench/parts/markers/browser/markersFileDecorations.ts index ab126fb6764..4f36dfed113 100644 --- a/src/vs/workbench/parts/markers/browser/markersFileDecorations.ts +++ b/src/vs/workbench/parts/markers/browser/markersFileDecorations.ts @@ -5,7 +5,7 @@ 'use strict'; -import { IWorkbenchContribution, IWorkbenchContributionsRegistry, Extensions } from 'vs/workbench/common/contributions'; +import { IWorkbenchContribution, IWorkbenchContributionsRegistry, Extensions as WorkbenchExtensions } from 'vs/workbench/common/contributions'; import { IMarkerService } from 'vs/platform/markers/common/markers'; import { IResourceDecorationsService, IDecorationsProvider, IResourceDecoration } from 'vs/workbench/services/decorations/browser/decorations'; import { IDisposable, dispose } from 'vs/base/common/lifecycle'; @@ -17,6 +17,7 @@ import { Registry } from 'vs/platform/registry/common/platform'; import Severity from 'vs/base/common/severity'; import { editorErrorForeground, editorWarningForeground } from 'vs/editor/common/view/editorColorRegistry'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; +import { IConfigurationRegistry, Extensions as ConfigurationExtensions } from 'vs/platform/configuration/common/configurationRegistry'; class MarkersDecorationsProvider implements IDecorationsProvider { @@ -89,4 +90,17 @@ class MarkersFileDecorations implements IWorkbenchContribution { } } -Registry.as(Extensions.Workbench).registerWorkbenchContribution(MarkersFileDecorations); +Registry.as(WorkbenchExtensions.Workbench).registerWorkbenchContribution(MarkersFileDecorations); + +Registry.as(ConfigurationExtensions.Configuration).registerConfiguration({ + 'id': 'problems', + 'order': 101, + 'type': 'object', + 'properties': { + 'problems.fileDecorations.enabled': { + 'description': localize('markers.showOnFile', "Show Errors & Warnings on files and folder."), + 'type': 'boolean', + 'default': true + } + } +}); diff --git a/src/vs/workbench/parts/markers/browser/markersWorkbenchContributions.ts b/src/vs/workbench/parts/markers/browser/markersWorkbenchContributions.ts index b3dbb714669..39970c806b9 100644 --- a/src/vs/workbench/parts/markers/browser/markersWorkbenchContributions.ts +++ b/src/vs/workbench/parts/markers/browser/markersWorkbenchContributions.ts @@ -17,9 +17,6 @@ import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; import { IPanelService } from 'vs/workbench/services/panel/common/panelService'; import { MarkersPanel } from 'vs/workbench/parts/markers/browser/markersPanel'; -import './markersFileDecorations'; -import { localize } from 'vs/nls'; - export function registerContributions(): void { KeybindingsRegistry.registerCommandAndKeybindingRule({ @@ -51,20 +48,6 @@ export function registerContributions(): void { } }); - Registry.as(Extensions.Configuration).registerConfiguration({ - 'id': 'problems', - 'order': 101, - 'type': 'object', - 'properties': { - 'problems.fileDecorations.enabled': { - 'description': localize('markers.showOnFile', "Show Errors & Warnings on files and folder."), - 'type': 'boolean', - 'default': true - } - } - }); - - // markers panel Registry.as(PanelExtensions.Panels).registerPanel(new PanelDescriptor( diff --git a/src/vs/workbench/parts/markers/markers.contribution.ts b/src/vs/workbench/parts/markers/markers.contribution.ts index 8e93a5abe41..b7b91dbc852 100644 --- a/src/vs/workbench/parts/markers/markers.contribution.ts +++ b/src/vs/workbench/parts/markers/markers.contribution.ts @@ -5,5 +5,7 @@ import { registerContributions } from 'vs/workbench/parts/markers/browser/markersWorkbenchContributions'; import { registerContributions as registerElectronContributions } from 'vs/workbench/parts/markers/electron-browser/markersElectronContributions'; +import './browser/markersFileDecorations'; + registerContributions(); -registerElectronContributions(); \ No newline at end of file +registerElectronContributions(); From 5c61e7cb860788d8ff377b4a7bbd680efc826959 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Tue, 10 Oct 2017 14:52:05 +0200 Subject: [PATCH 138/158] disable markersFileDecorations for now --- src/vs/workbench/parts/markers/markers.contribution.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/parts/markers/markers.contribution.ts b/src/vs/workbench/parts/markers/markers.contribution.ts index b7b91dbc852..4ab845211d8 100644 --- a/src/vs/workbench/parts/markers/markers.contribution.ts +++ b/src/vs/workbench/parts/markers/markers.contribution.ts @@ -5,7 +5,7 @@ import { registerContributions } from 'vs/workbench/parts/markers/browser/markersWorkbenchContributions'; import { registerContributions as registerElectronContributions } from 'vs/workbench/parts/markers/electron-browser/markersElectronContributions'; -import './browser/markersFileDecorations'; +// import './browser/markersFileDecorations'; registerContributions(); registerElectronContributions(); From 6796d4105a2d2ddde50cffa336a2a078b246cab8 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Tue, 10 Oct 2017 15:05:08 +0200 Subject: [PATCH 139/158] add useColors/useIcons settings --- .../scm/electron-browser/scm.contribution.ts | 10 ++++++++++ .../electron-browser/scmFileDecorations.ts | 19 ++++++++++++++----- 2 files changed, 24 insertions(+), 5 deletions(-) diff --git a/src/vs/workbench/parts/scm/electron-browser/scm.contribution.ts b/src/vs/workbench/parts/scm/electron-browser/scm.contribution.ts index 9510db9af9e..16f6ce2631c 100644 --- a/src/vs/workbench/parts/scm/electron-browser/scm.contribution.ts +++ b/src/vs/workbench/parts/scm/electron-browser/scm.contribution.ts @@ -76,6 +76,16 @@ Registry.as(Extensions.Configuration).registerConfigurat 'description': localize('scm.fileDecorations.enabled', "Show source control status on files and folders"), 'type': 'boolean', 'default': true + }, + 'scm.fileDecorations.useIcons': { + 'description': localize('scm.fileDecorations.useIcons', "Use icons when showing source control status on files and folders"), + 'type': 'boolean', + 'default': true + }, + 'scm.fileDecorations.useColors': { + 'description': localize('scm.fileDecorations.useColors', "Use colors when showing source control status on files and folders"), + 'type': 'boolean', + 'default': true } } }); diff --git a/src/vs/workbench/parts/scm/electron-browser/scmFileDecorations.ts b/src/vs/workbench/parts/scm/electron-browser/scmFileDecorations.ts index 0f05f5dbc35..f3ffc823a07 100644 --- a/src/vs/workbench/parts/scm/electron-browser/scmFileDecorations.ts +++ b/src/vs/workbench/parts/scm/electron-browser/scmFileDecorations.ts @@ -25,7 +25,8 @@ class SCMDecorationsProvider implements IDecorationsProvider { readonly onDidChange: Event = this._onDidChange.event; constructor( - private readonly _provider: ISCMProvider + private readonly _provider: ISCMProvider, + private readonly _config: ISCMConfiguration ) { this.label = this._provider.label; this._disposable = this._provider.onDidChangeResources(this._updateGroups, this); @@ -66,13 +67,21 @@ class SCMDecorationsProvider implements IDecorationsProvider { } return { severity: Severity.Info, - color: resource.decorations.color, tooltip: localize('tooltip', "{0} - {1}", resource.decorations.tooltip, this._provider.label), - icon: { light: resource.decorations.icon, dark: resource.decorations.iconDark } + color: this._config.fileDecorations.useColors ? resource.decorations.color : undefined, + icon: this._config.fileDecorations.useIcons ? { light: resource.decorations.icon, dark: resource.decorations.iconDark } : undefined }; } } +interface ISCMConfiguration { + fileDecorations: { + enabled: boolean; + useIcons: boolean; + useColors: boolean; + }; +} + export class FileDecorations implements IWorkbenchContribution { private _providers = new Map(); @@ -99,7 +108,7 @@ export class FileDecorations implements IWorkbenchContribution { } private _update(): void { - const value = this._configurationService.getConfiguration<{ fileDecorations: { enabled: boolean } }>('scm'); + const value = this._configurationService.getConfiguration('scm'); if (value.fileDecorations.enabled) { this._scmService.repositories.forEach(this._onDidAddRepository, this); this._repoListeners = [ @@ -113,7 +122,7 @@ export class FileDecorations implements IWorkbenchContribution { } private _onDidAddRepository(repo: ISCMRepository): void { - const provider = new SCMDecorationsProvider(repo.provider); + const provider = new SCMDecorationsProvider(repo.provider, this._configurationService.getConfiguration('scm')); const registration = this._decorationsService.registerDecortionsProvider(provider); this._providers.set(repo, combinedDisposable([registration, provider])); } From 9159b691005ae10896fadfeb77033d009a1dab55 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Tue, 10 Oct 2017 15:11:41 +0200 Subject: [PATCH 140/158] move extra icon into label --- src/vs/base/browser/ui/iconLabel/iconLabel.ts | 17 ++++++++++++++++- src/vs/workbench/browser/labels.ts | 14 ++++++-------- 2 files changed, 22 insertions(+), 9 deletions(-) diff --git a/src/vs/base/browser/ui/iconLabel/iconLabel.ts b/src/vs/base/browser/ui/iconLabel/iconLabel.ts index f41e16128e8..80486cc1e34 100644 --- a/src/vs/base/browser/ui/iconLabel/iconLabel.ts +++ b/src/vs/base/browser/ui/iconLabel/iconLabel.ts @@ -23,8 +23,9 @@ export interface IIconLabelOptions { title?: string; extraClasses?: string[]; italic?: boolean; - color?: Color; matches?: IMatch[]; + color?: Color; + extraIcon?: uri; } class FastLabelNode { @@ -145,6 +146,20 @@ export class IconLabel { this.descriptionNode.textContent = description || ''; this.descriptionNode.empty = !description; + + if (options && options.extraIcon) { + this.element.style.backgroundImage = `url(${options.extraIcon.toString(true)})`; + this.element.style.backgroundRepeat = 'no-repeat'; + this.element.style.backgroundPosition = 'right center'; + this.element.style.paddingRight = '20px'; + this.element.style.marginRight = '14px'; + } else { + this.element.style.backgroundImage = ''; + this.element.style.backgroundRepeat = ''; + this.element.style.backgroundPosition = ''; + this.element.style.paddingRight = ''; + this.element.style.marginRight = ''; + } } public dispose(): void { diff --git a/src/vs/workbench/browser/labels.ts b/src/vs/workbench/browser/labels.ts index 667b934b9c1..58ed73d8fb1 100644 --- a/src/vs/workbench/browser/labels.ts +++ b/src/vs/workbench/browser/labels.ts @@ -181,7 +181,10 @@ export class ResourceLabel extends IconLabel { const italic = this.options && this.options.italic; const matches = this.options && this.options.matches; + + let color: Color; + let extraIcon: uri; if (this.options && this.options.fileDecorations) { let deco = this.decorationsService.getTopDecoration( resource, @@ -211,13 +214,7 @@ export class ResourceLabel extends IconLabel { if (deco.icon) { const { type } = this.themeService.getTheme(); - const icon = type === 'light' ? deco.icon.light : deco.icon.dark; - - this.element.style.backgroundImage = `url(${icon.toString(true)})`; - this.element.style.backgroundRepeat = 'no-repeat'; - this.element.style.backgroundPosition = 'right center'; - this.element.style.paddingRight = '20px'; - this.element.style.marginRight = '14px'; + extraIcon = type === 'light' ? deco.icon.light : deco.icon.dark; } } } @@ -227,7 +224,8 @@ export class ResourceLabel extends IconLabel { extraClasses, italic, matches, - color + color, + extraIcon }); } From 9c4052804d4691e101ee0a88517860bf8a2e79a7 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Tue, 10 Oct 2017 15:16:49 +0200 Subject: [PATCH 141/158] adjust git colors --- extensions/git/package.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/extensions/git/package.json b/extensions/git/package.json index b10cfa73f31..490a7ea49d2 100644 --- a/extensions/git/package.json +++ b/extensions/git/package.json @@ -809,18 +809,18 @@ "id": "git.color.modified", "description": "Color for modified resources", "defaults": { - "light": "#b47d16", - "dark": "#cf9425", - "highContrast": "#cf9425" + "light": "#007BD0", + "dark": "#1B80B2", + "highContrast": "#1B80B2" } }, { "id": "git.color.untracked", "description": "Color for modified resources", "defaults": { - "light": "#49805b", - "dark": "#73c990", - "highContrast": "#73c990" + "light": "#6C6C6C", + "dark": "#6C6C6C", + "highContrast": "#6C6C6C" } } ] From 1b3011020b449b117b9f61b2b99802e72aeec3ce Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Tue, 10 Oct 2017 15:43:01 +0200 Subject: [PATCH 142/158] sync/async results, add unit test --- .../decorations/browser/decorationsService.ts | 33 ++++++--- .../test/browser/decorationsService.test.ts | 74 +++++++++++++++++++ 2 files changed, 96 insertions(+), 11 deletions(-) create mode 100644 src/vs/workbench/services/decorations/test/browser/decorationsService.test.ts diff --git a/src/vs/workbench/services/decorations/browser/decorationsService.ts b/src/vs/workbench/services/decorations/browser/decorationsService.ts index 771b353f193..6583632cb89 100644 --- a/src/vs/workbench/services/decorations/browser/decorationsService.ts +++ b/src/vs/workbench/services/decorations/browser/decorationsService.ts @@ -67,7 +67,7 @@ class DecorationProviderWrapper { getOrRetrieve(uri: URI, includeChildren: boolean, callback: (data: IResourceDecoration) => void): void { const key = uri.toString(); - const item = this._data.get(key); + let item = this._data.get(key); if (isThenable(item)) { // pending -> still waiting @@ -76,8 +76,7 @@ class DecorationProviderWrapper { if (item === undefined && !includeChildren) { // unknown, a leaf node -> trigger request - this._fetchData(uri); - return; + item = this._fetchData(uri); } if (item) { @@ -97,15 +96,27 @@ class DecorationProviderWrapper { } } - private _fetchData(uri: URI) { - const request = Promise.resolve(this._provider.provideDecorations(uri)) - .then(data => { - this._data.set(uri.toString(), data || null); - this._emitter.fire(uri); - }) - .catch(_ => this._data.delete(uri.toString())); + private _fetchData(uri: URI): IResourceDecoration { - this._data.set(uri.toString(), request); + const decoOrThenable = this._provider.provideDecorations(uri); + if (!isThenable(decoOrThenable)) { + // sync -> we have a result now + this._data.set(uri.toString(), decoOrThenable || null); + this._emitter.fire(uri); + return decoOrThenable; + + } else { + // async -> we have a result soon + const request = Promise.resolve(decoOrThenable) + .then(data => { + this._data.set(uri.toString(), data || null); + this._emitter.fire(uri); + }) + .catch(_ => this._data.delete(uri.toString())); + + this._data.set(uri.toString(), request); + return undefined; + } } } diff --git a/src/vs/workbench/services/decorations/test/browser/decorationsService.test.ts b/src/vs/workbench/services/decorations/test/browser/decorationsService.test.ts new file mode 100644 index 00000000000..ba79dc94d91 --- /dev/null +++ b/src/vs/workbench/services/decorations/test/browser/decorationsService.test.ts @@ -0,0 +1,74 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +'use strict'; + +import * as assert from 'assert'; +import { FileDecorationsService } from 'vs/workbench/services/decorations/browser/decorationsService'; +import { IDecorationsProvider, IResourceDecoration } from 'vs/workbench/services/decorations/browser/decorations'; +import URI from 'vs/base/common/uri'; +import Event, { toPromise } from 'vs/base/common/event'; +import Severity from 'vs/base/common/severity'; + +suite('DecorationsService', function () { + + let service: FileDecorationsService; + + setup(function () { + service = new FileDecorationsService(); + }); + + test('Async provider, async/evented result', function () { + + let uri = URI.parse('foo:bar'); + let callCounter = 0; + + service.registerDecortionsProvider(new class implements IDecorationsProvider { + readonly label: string = 'Test'; + readonly onDidChange: Event = Event.None; + provideDecorations(uri: URI) { + callCounter += 1; + return new Promise(resolve => { + setTimeout(() => resolve({ + severity: Severity.Info, + color: 'someBlue' + })); + }); + } + }); + + // trigger -> async + assert.equal(service.getTopDecoration(uri, false), undefined); + assert.equal(callCounter, 1); + + // event when result is computed + return toPromise(service.onDidChangeDecorations).then(e => { + assert.equal(e.affectsResource(uri), true); + + // sync result + assert.deepEqual(service.getTopDecoration(uri, false), { severity: Severity.Info, color: 'someBlue' }); + assert.equal(callCounter, 1); + }); + }); + + test('Sync provider, sync result', function () { + + let uri = URI.parse('foo:bar'); + let callCounter = 0; + + service.registerDecortionsProvider(new class implements IDecorationsProvider { + readonly label: string = 'Test'; + readonly onDidChange: Event = Event.None; + provideDecorations(uri: URI) { + callCounter += 1; + return { severity: Severity.Info, color: 'someBlue' }; + } + }); + + // trigger -> sync + assert.deepEqual(service.getTopDecoration(uri, false), { severity: Severity.Info, color: 'someBlue' }); + assert.equal(callCounter, 1); + }); +}); From 3631852e9c94ff920fe550d9a64994a87c1d2a6d Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Tue, 10 Oct 2017 15:45:53 +0200 Subject: [PATCH 143/158] provider dispose test --- .../test/browser/decorationsService.test.ts | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/src/vs/workbench/services/decorations/test/browser/decorationsService.test.ts b/src/vs/workbench/services/decorations/test/browser/decorationsService.test.ts index ba79dc94d91..50cd8982814 100644 --- a/src/vs/workbench/services/decorations/test/browser/decorationsService.test.ts +++ b/src/vs/workbench/services/decorations/test/browser/decorationsService.test.ts @@ -71,4 +71,32 @@ suite('DecorationsService', function () { assert.deepEqual(service.getTopDecoration(uri, false), { severity: Severity.Info, color: 'someBlue' }); assert.equal(callCounter, 1); }); + + test('Clear decorations on provider dispose', function () { + let uri = URI.parse('foo:bar'); + let callCounter = 0; + + let reg = service.registerDecortionsProvider(new class implements IDecorationsProvider { + readonly label: string = 'Test'; + readonly onDidChange: Event = Event.None; + provideDecorations(uri: URI) { + callCounter += 1; + return { severity: Severity.Info, color: 'someBlue' }; + } + }); + + // trigger -> sync + assert.deepEqual(service.getTopDecoration(uri, false), { severity: Severity.Info, color: 'someBlue' }); + assert.equal(callCounter, 1); + + const p = toPromise(service.onDidChangeDecorations); + + reg.dispose(); + + p.then(e => { + assert.equal(e.affectsResource(uri), true); + assert.deepEqual(service.getTopDecoration(uri, false), undefined); + assert.equal(callCounter, 1); + }); + }); }); From e013bf881f3c7f1c56594a726d5c68eb3c9abffa Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Tue, 10 Oct 2017 15:53:29 +0200 Subject: [PATCH 144/158] improve test --- .../test/browser/decorationsService.test.ts | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/vs/workbench/services/decorations/test/browser/decorationsService.test.ts b/src/vs/workbench/services/decorations/test/browser/decorationsService.test.ts index 50cd8982814..5c6cf38d5db 100644 --- a/src/vs/workbench/services/decorations/test/browser/decorationsService.test.ts +++ b/src/vs/workbench/services/decorations/test/browser/decorationsService.test.ts @@ -89,14 +89,15 @@ suite('DecorationsService', function () { assert.deepEqual(service.getTopDecoration(uri, false), { severity: Severity.Info, color: 'someBlue' }); assert.equal(callCounter, 1); - const p = toPromise(service.onDidChangeDecorations); - - reg.dispose(); - - p.then(e => { + // un-register -> ensure good event + let didSeeEvent = false; + service.onDidChangeDecorations(e => { assert.equal(e.affectsResource(uri), true); assert.deepEqual(service.getTopDecoration(uri, false), undefined); assert.equal(callCounter, 1); + didSeeEvent = true; }); + reg.dispose(); + assert.equal(didSeeEvent, true); }); }); From a34ee0c5aa91e0565f3adf84d5362c87b261b11b Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Tue, 10 Oct 2017 16:05:58 +0200 Subject: [PATCH 145/158] label tweak --- extensions/git/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/git/package.json b/extensions/git/package.json index 490a7ea49d2..58779e50bbc 100644 --- a/extensions/git/package.json +++ b/extensions/git/package.json @@ -816,7 +816,7 @@ }, { "id": "git.color.untracked", - "description": "Color for modified resources", + "description": "Color for untracked resources", "defaults": { "light": "#6C6C6C", "dark": "#6C6C6C", From e7799d19150ec2648a8b4bf4b5dc166846e81869 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Tue, 10 Oct 2017 17:10:21 +0200 Subject: [PATCH 146/158] fix merge/rebase hickup --- src/vs/workbench/parts/files/browser/views/explorerViewer.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/vs/workbench/parts/files/browser/views/explorerViewer.ts b/src/vs/workbench/parts/files/browser/views/explorerViewer.ts index 5073098d46c..a60d36d6116 100644 --- a/src/vs/workbench/parts/files/browser/views/explorerViewer.ts +++ b/src/vs/workbench/parts/files/browser/views/explorerViewer.ts @@ -58,8 +58,6 @@ import { IEnvironmentService } from 'vs/platform/environment/common/environment' import { getPathLabel } from 'vs/base/common/labels'; import { extractResources } from 'vs/base/browser/dnd'; import { IConfigurationEditingService, ConfigurationTarget } from 'vs/workbench/services/configuration/common/configurationEditing'; -import { IDecorationsService } from 'vs/workbench/services/decorations/browser/decorations'; - export class FileDataSource implements IDataSource { constructor( From be10b09e63e86ea2f459627f746622c1c3d930a6 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Tue, 10 Oct 2017 17:47:17 +0200 Subject: [PATCH 147/158] better matchCompactness computation --- .../parts/quickopen/common/quickOpenScorer.ts | 42 ++++++++-------- .../test/common/quickOpenScorer.test.ts | 48 +++++++++++++++++++ 2 files changed, 67 insertions(+), 23 deletions(-) diff --git a/src/vs/base/parts/quickopen/common/quickOpenScorer.ts b/src/vs/base/parts/quickopen/common/quickOpenScorer.ts index 750a6961ca1..1b12ae09842 100644 --- a/src/vs/base/parts/quickopen/common/quickOpenScorer.ts +++ b/src/vs/base/parts/quickopen/common/quickOpenScorer.ts @@ -16,17 +16,6 @@ export type ScorerCache = { [key: string]: IItemScore }; const NO_SCORE: Score = [0, []]; -/** - * Compute a score for the given string and the given query. - * - * Rules: - * Character score: 1 - * Same case bonus: 1 - * Upper case bonus: 1 - * Consecutive match bonus: 5 - * Start of word/path bonus: 7 - * Start of string bonus: 8 - */ export function _doScore(target: string, query: string, fuzzy: boolean): Score { if (!target || !query) { return NO_SCORE; // return early if target or query are undefined @@ -122,7 +111,7 @@ BEGIN THIRD PARTY * Date: Tue Mar 1 2011 * Updated: Tue Mar 10 2015 */ -export function _doScoreFromOffset(target: string, query: string, targetLower: string, queryLower: string, queryLen: number, offset: number): Score { +function _doScoreFromOffset(target: string, query: string, targetLower: string, queryLower: string, queryLen: number, offset: number): Score { const matchingPositions: number[] = []; let targetIndex = offset; @@ -357,14 +346,14 @@ export function compareItemsByScore(itemA: T, itemB: T, query: string, fuzzy: const scoreA = itemScoreA.score; const scoreB = itemScoreB.score; - // 1.) check for identity matches + // 1.) prefer identity matches if (scoreA === PATH_IDENTITY_SCORE || scoreB === PATH_IDENTITY_SCORE) { if (scoreA !== scoreB) { return scoreA === PATH_IDENTITY_SCORE ? -1 : 1; } } - // 2.) check for label prefix matches + // 2.) prefer label prefix matches if (scoreA === LABEL_PREFIX_SCORE || scoreB === LABEL_PREFIX_SCORE) { if (scoreA !== scoreB) { return scoreA === LABEL_PREFIX_SCORE ? -1 : 1; @@ -379,7 +368,7 @@ export function compareItemsByScore(itemA: T, itemB: T, query: string, fuzzy: } } - // 3.) check for camelcase matches + // 3.) prefer camelcase matches if (scoreA === LABEL_CAMELCASE_SCORE || scoreB === LABEL_CAMELCASE_SCORE) { if (scoreA !== scoreB) { return scoreA === LABEL_CAMELCASE_SCORE ? -1 : 1; @@ -400,7 +389,7 @@ export function compareItemsByScore(itemA: T, itemB: T, query: string, fuzzy: } } - // 4.) check for label scores + // 4.) prefer label scores if (scoreA > LABEL_SCORE_THRESHOLD || scoreB > LABEL_SCORE_THRESHOLD) { if (scoreB < LABEL_SCORE_THRESHOLD) { return -1; @@ -411,20 +400,27 @@ export function compareItemsByScore(itemA: T, itemB: T, query: string, fuzzy: } } - // 5.) check for path scores + // 5.) compare by score if (scoreA !== scoreB) { return scoreA > scoreB ? -1 : 1; } // 6.) scores are identical, prefer more compact matches (label and description) - const labelMatchCompactness = compareByMatchLength(itemScoreA.labelMatch, itemScoreB.labelMatch); - if (labelMatchCompactness !== 0) { - return labelMatchCompactness; + let itemAMatches: IMatch[] = []; + if (itemScoreA.descriptionMatch) { + itemAMatches.push(...itemScoreA.descriptionMatch); } + itemAMatches.push(...itemScoreA.labelMatch); - const descriptionMatchCompactness = compareByMatchLength(itemScoreA.descriptionMatch, itemScoreB.descriptionMatch); - if (descriptionMatchCompactness !== 0) { - return descriptionMatchCompactness; + let itemBMatches: IMatch[] = []; + if (itemScoreB.descriptionMatch) { + itemBMatches.push(...itemScoreB.descriptionMatch); + } + itemBMatches.push(...itemScoreB.labelMatch); + + const matchCompactness = compareByMatchLength(itemAMatches, itemBMatches); + if (matchCompactness !== 0) { + return matchCompactness; } // 7.) at this point, scores are identical and match compactness as well diff --git a/src/vs/base/parts/quickopen/test/common/quickOpenScorer.test.ts b/src/vs/base/parts/quickopen/test/common/quickOpenScorer.test.ts index 2df8c19f1ac..8aedf7ce3ea 100644 --- a/src/vs/base/parts/quickopen/test/common/quickOpenScorer.test.ts +++ b/src/vs/base/parts/quickopen/test/common/quickOpenScorer.test.ts @@ -166,6 +166,15 @@ suite('Quick Open Scorer', () => { assert.ok(pathRes.score > noRes.score); }); + test('scoreItem - invalid input', function () { + + let res = scorer.scoreItem(null, null, true, ResourceAccessor, cache); + assert.equal(res.score, 0); + + res = scorer.scoreItem(null, 'null', true, ResourceAccessor, cache); + assert.equal(res.score, 0); + }); + test('scoreItem - optimize for file paths', function () { const resource = URI.file('/xyz/others/spath/some/xsp/file123.txt'); @@ -379,6 +388,25 @@ suite('Quick Open Scorer', () => { assert.equal(res[2], resourceC); }); + test('compareFilesByScore - prefer shorter basenames (match on basename)', function () { + const resourceA = URI.file('/some/path/fileA.txt'); + const resourceB = URI.file('/some/path/other/fileBLonger.txt'); + const resourceC = URI.file('/unrelated/the/path/other/fileC.txt'); + + // Resource A part of path + let query = 'file'; + + let res = [resourceA, resourceB, resourceC].sort((r1, r2) => scorer.compareItemsByScore(r1, r2, query, true, ResourceAccessor, cache)); + assert.equal(res[0], resourceA); + assert.equal(res[1], resourceC); + assert.equal(res[2], resourceB); + + res = [resourceC, resourceB, resourceA].sort((r1, r2) => scorer.compareItemsByScore(r1, r2, query, true, ResourceAccessor, cache)); + assert.equal(res[0], resourceA); + assert.equal(res[1], resourceC); + assert.equal(res[2], resourceB); + }); + test('compareFilesByScore - prefer shorter paths', function () { const resourceA = URI.file('/some/path/fileA.txt'); const resourceB = URI.file('/some/path/other/fileB.txt'); @@ -471,6 +499,21 @@ suite('Quick Open Scorer', () => { assert.equal(res[1], resourceA); }); + test('compareFilesByScore - prefer more compact matches (label and path)', function () { + const resourceA = URI.file('config/example/thisfile.ts'); + const resourceB = URI.file('config/24234243244/example/file.js'); + + let query = 'exfile'; + + let res = [resourceA, resourceB].sort((r1, r2) => scorer.compareItemsByScore(r1, r2, query, true, ResourceAccessor, cache)); + assert.equal(res[0], resourceB); + assert.equal(res[1], resourceA); + + res = [resourceB, resourceA].sort((r1, r2) => scorer.compareItemsByScore(r1, r2, query, true, ResourceAccessor, cache)); + assert.equal(res[0], resourceB); + assert.equal(res[1], resourceA); + }); + test('compareFilesByScore - avoid match scattering (bug #34210)', function () { const resourceA = URI.file('node_modules1/bundle/lib/model/modules/ot1/index.js'); const resourceB = URI.file('node_modules1/bundle/lib/model/modules/un1/index.js'); @@ -539,4 +582,9 @@ suite('Quick Open Scorer', () => { let res = [resourceA, resourceB].sort((r1, r2) => scorer.compareItemsByScore(r1, r2, query, true, ResourceAccessor, cache)); assert.equal(res[0], resourceB); }); + + test('massageSearchForScoring', function () { + assert.equal(scorer.massageSearchForScoring(' f*a '), 'fa'); + assert.equal(scorer.massageSearchForScoring('model tester.ts'), 'modeltester.ts'); + }); }); \ No newline at end of file From fd92bc6a3d22a4f839eb8e31ecec45f6cb72a278 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Tue, 10 Oct 2017 18:09:31 +0200 Subject: [PATCH 148/158] fix scm.fileDecorations.enabled setting --- .../electron-browser/scmFileDecorations.ts | 27 ++++++++++++------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/src/vs/workbench/parts/scm/electron-browser/scmFileDecorations.ts b/src/vs/workbench/parts/scm/electron-browser/scmFileDecorations.ts index f3ffc823a07..021d06178e2 100644 --- a/src/vs/workbench/parts/scm/electron-browser/scmFileDecorations.ts +++ b/src/vs/workbench/parts/scm/electron-browser/scmFileDecorations.ts @@ -14,6 +14,7 @@ import Severity from 'vs/base/common/severity'; import Event, { Emitter } from 'vs/base/common/event'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { localize } from 'vs/nls'; +import { equals } from 'vs/base/common/objects'; class SCMDecorationsProvider implements IDecorationsProvider { @@ -87,6 +88,7 @@ export class FileDecorations implements IWorkbenchContribution { private _providers = new Map(); private _configListener: IDisposable; private _repoListeners: IDisposable[]; + private _currentConfig: ISCMConfiguration; constructor( @IResourceDecorationsService private _decorationsService: IResourceDecorationsService, @@ -108,16 +110,21 @@ export class FileDecorations implements IWorkbenchContribution { } private _update(): void { - const value = this._configurationService.getConfiguration('scm'); - if (value.fileDecorations.enabled) { - this._scmService.repositories.forEach(this._onDidAddRepository, this); - this._repoListeners = [ - this._scmService.onDidAddRepository(this._onDidAddRepository, this), - this._scmService.onDidRemoveRepository(this._onDidRemoveRepository, this) - ]; - } else { - this._providers.forEach(value => dispose(value)); - this._repoListeners = dispose(this._repoListeners); + const config = this._configurationService.getConfiguration('scm'); + if (!equals(config, this._currentConfig)) { + this._currentConfig = config; + + if (this._currentConfig.fileDecorations.enabled) { + this._scmService.repositories.forEach(this._onDidAddRepository, this); + this._repoListeners = [ + this._scmService.onDidAddRepository(this._onDidAddRepository, this), + this._scmService.onDidRemoveRepository(this._onDidRemoveRepository, this) + ]; + } else { + this._repoListeners = dispose(this._repoListeners); + this._providers.forEach(value => dispose(value)); + this._providers.clear(); + } } } From 06e1699b241a5f9ae15bdf8014a73a0c9da4a7cb Mon Sep 17 00:00:00 2001 From: isidor Date: Tue, 10 Oct 2017 18:13:20 +0200 Subject: [PATCH 149/158] debugStatus: only style icon if it is constructed --- src/vs/workbench/parts/debug/browser/debugStatus.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/parts/debug/browser/debugStatus.ts b/src/vs/workbench/parts/debug/browser/debugStatus.ts index 821b34d783b..58ad52104db 100644 --- a/src/vs/workbench/parts/debug/browser/debugStatus.ts +++ b/src/vs/workbench/parts/debug/browser/debugStatus.ts @@ -43,7 +43,9 @@ export class DebugStatus extends Themable implements IStatusbarItem { protected updateStyles(): void { super.updateStyles(); - this.icon.style.backgroundColor = this.getColor(STATUS_BAR_FOREGROUND); + if (this.icon) { + this.icon.style.backgroundColor = this.getColor(STATUS_BAR_FOREGROUND); + } } public render(container: HTMLElement): IDisposable { From a91bad463a4a90409fd6012e4e31a63364cca44b Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Tue, 10 Oct 2017 12:22:59 -0700 Subject: [PATCH 150/158] Only set LANG env var in term if setLocaleVariables is true Fixes #35550 --- .../parts/terminal/electron-browser/terminalInstance.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts b/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts index 4ba392d7be8..e00375c131d 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts +++ b/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts @@ -780,7 +780,9 @@ export class TerminalInstance implements ITerminalInstance { } } env['PTYCWD'] = cwd; - env['LANG'] = TerminalInstance._getLangEnvVariable(locale); + if (locale) { + env['LANG'] = TerminalInstance._getLangEnvVariable(locale); + } if (cols && rows) { env['PTYCOLS'] = cols.toString(); env['PTYROWS'] = rows.toString(); From 63ecf01397911435229dcf47d6f9f84c74bdb44f Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Tue, 10 Oct 2017 15:01:51 -0700 Subject: [PATCH 151/158] Use unique grammar and scope for JavaScript react to avoid conflicts when overriding plain old javascript grammar Fixes #35532 --- .../syntaxes/JavaScript.tmLanguage.json | 4 +- .../syntaxes/JavaScriptReact.tmLanguage.json | 4275 +++++++++++++++++ .../test/colorize-results/test_jsx.json | 436 +- .../typescript/build/update-grammars.js | 10 +- .../syntaxes/TypeScript.tmLanguage.json | 4 +- .../syntaxes/TypeScriptReact.tmLanguage.json | 4 +- 6 files changed, 4505 insertions(+), 228 deletions(-) create mode 100644 extensions/javascript/syntaxes/JavaScriptReact.tmLanguage.json diff --git a/extensions/javascript/syntaxes/JavaScript.tmLanguage.json b/extensions/javascript/syntaxes/JavaScript.tmLanguage.json index 990df29f8b3..466cb34a314 100644 --- a/extensions/javascript/syntaxes/JavaScript.tmLanguage.json +++ b/extensions/javascript/syntaxes/JavaScript.tmLanguage.json @@ -4,7 +4,7 @@ "If you want to provide a fix or improvement, please create a pull request against the original repository.", "Once accepted there, we are happy to receive an update request." ], - "version": "https://github.com/Microsoft/TypeScript-TmLanguage/commit/d6ee336bf6047594768a56f955563ba5ce86e7c9", + "version": "https://github.com/Microsoft/TypeScript-TmLanguage/commit/5955a5aed3d8d2862c614f2137d22f2334d490e9", "name": "JavaScript (with React support)", "scopeName": "source.js", "fileTypes": [ @@ -3332,7 +3332,7 @@ "name": "punctuation.definition.group.regexp" }, "1": { - "name": "punctuation.definition.group.capture.regexp" + "name": "punctuation.definition.group.no-capture.regexp" } }, "end": "\\)", diff --git a/extensions/javascript/syntaxes/JavaScriptReact.tmLanguage.json b/extensions/javascript/syntaxes/JavaScriptReact.tmLanguage.json new file mode 100644 index 00000000000..29aa8b6a2a2 --- /dev/null +++ b/extensions/javascript/syntaxes/JavaScriptReact.tmLanguage.json @@ -0,0 +1,4275 @@ +{ + "information_for_contributors": [ + "This file has been converted from https://github.com/Microsoft/TypeScript-TmLanguage/blob/master/TypeScriptReact.tmLanguage", + "If you want to provide a fix or improvement, please create a pull request against the original repository.", + "Once accepted there, we are happy to receive an update request." + ], + "version": "https://github.com/Microsoft/TypeScript-TmLanguage/commit/5955a5aed3d8d2862c614f2137d22f2334d490e9", + "name": "JavaScript (with React support)", + "scopeName": "source.js.jsx", + "fileTypes": [ + ".js", + ".jsx", + ".es6", + ".mjs" + ], + "uuid": "805375ec-d614-41f5-8993-5843fe63ea82", + "patterns": [ + { + "include": "#directives" + }, + { + "include": "#statements" + }, + { + "name": "comment.line.shebang.ts", + "match": "\\A(#!).*(?=$)", + "captures": { + "1": { + "name": "punctuation.definition.comment.ts" + } + } + } + ], + "repository": { + "statements": { + "patterns": [ + { + "include": "#string" + }, + { + "include": "#template" + }, + { + "include": "#comment" + }, + { + "include": "#declaration" + }, + { + "include": "#control-statement" + }, + { + "include": "#after-operator-block-as-object-literal" + }, + { + "include": "#decl-block" + }, + { + "include": "#expression" + }, + { + "include": "#punctuation-semicolon" + } + ] + }, + "declaration": { + "patterns": [ + { + "include": "#decorator" + }, + { + "include": "#var-expr" + }, + { + "include": "#function-declaration" + }, + { + "include": "#class-declaration" + }, + { + "include": "#interface-declaration" + }, + { + "include": "#enum-declaration" + }, + { + "include": "#namespace-declaration" + }, + { + "include": "#type-alias-declaration" + }, + { + "include": "#import-equals-declaration" + }, + { + "include": "#import-declaration" + }, + { + "include": "#export-declaration" + } + ] + }, + "control-statement": { + "patterns": [ + { + "include": "#switch-statement" + }, + { + "include": "#for-loop" + }, + { + "name": "keyword.control.trycatch.js.jsx", + "match": "(?)\n )) |\n ((async\\s*)?(\n # sure shot arrow functions even if => is on new line\n(\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*[_$[:alpha:]\\{\\(]([^<>=]|=[^<]|\\<\\s*[_$[:alpha:]\\{\\(]([^=<>]|=[^<])+\\>)+>\\s*)? # typeparameters\n \\((\\s*[_$[:alpha:]\\{\\(]([^()]|\\((\\s*[_$[:alpha:]\\{\\(]\\{\\(][^()]*)?\\))*)?\\) # parameteres\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)) |\n# typeannotation is fn type: < | () | (... | (param: | (param, | (param? | (param= | (param) =>\n(:\\s*(\n (<) |\n ([(]\\s*(\n ([)]) |\n (\\.\\.\\.) |\n ([_$[:alnum:]]+\\s*(\n ([:,?=])|\n ([)]\\s*=>)\n ))\n ))\n)))", + "beginCaptures": { + "1": { + "name": "meta.definition.variable.js.jsx entity.name.function.js.jsx" + } + }, + "end": "(?=$|^|[;,=}]|(\\s+(of|in)\\s+))", + "patterns": [ + { + "include": "#var-single-variable-type-annotation" + } + ] + }, + { + "name": "meta.var-single-variable.expr.js.jsx", + "begin": "([[:upper:]][_$[:digit:][:upper:]]*)(?![_$[:alnum:]])", + "beginCaptures": { + "1": { + "name": "meta.definition.variable.js.jsx variable.other.constant.js.jsx" + } + }, + "end": "(?=$|^|[;,=}]|(\\s+(of|in)\\s+))", + "patterns": [ + { + "include": "#var-single-variable-type-annotation" + } + ] + }, + { + "name": "meta.var-single-variable.expr.js.jsx", + "begin": "([_$[:alpha:]][_$[:alnum:]]*)", + "beginCaptures": { + "1": { + "name": "meta.definition.variable.js.jsx variable.other.readwrite.js.jsx" + } + }, + "end": "(?=$|^|[;,=}]|(\\s+(of|in)\\s+))", + "patterns": [ + { + "include": "#var-single-variable-type-annotation" + } + ] + } + ] + }, + "var-single-variable-type-annotation": { + "patterns": [ + { + "include": "#type-annotation" + }, + { + "include": "#string" + }, + { + "include": "#comment" + } + ] + }, + "destructuring-variable": { + "patterns": [ + { + "name": "meta.object-binding-pattern-variable.js.jsx", + "begin": "(?)\n )) |\n ((async\\s*)?(\n # sure shot arrow functions even if => is on new line\n(\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*[_$[:alpha:]\\{\\(]([^<>=]|=[^<]|\\<\\s*[_$[:alpha:]\\{\\(]([^=<>]|=[^<])+\\>)+>\\s*)? # typeparameters\n \\((\\s*[_$[:alpha:]\\{\\(]([^()]|\\((\\s*[_$[:alpha:]\\{\\(]\\{\\(][^()]*)?\\))*)?\\) # parameteres\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)) |\n# typeannotation is fn type: < | () | (... | (param: | (param, | (param? | (param= | (param) =>\n(:\\s*(\n (<) |\n ([(]\\s*(\n ([)]) |\n (\\.\\.\\.) |\n ([_$[:alnum:]]+\\s*(\n ([:,?=])|\n ([)]\\s*=>)\n ))\n ))\n)))", + "captures": { + "1": { + "name": "storage.modifier.js.jsx" + }, + "2": { + "name": "keyword.operator.rest.js.jsx" + }, + "3": { + "name": "entity.name.function.js.jsx variable.language.this.js.jsx" + }, + "4": { + "name": "entity.name.function.js.jsx" + }, + "5": { + "name": "keyword.operator.optional.js.jsx" + } + } + }, + { + "match": "(?:\\s*\\b(public|private|protected|readonly)\\s+)?(\\.\\.\\.)?\\s*(?)\n )) |\n ((async\\s*)?(\n # sure shot arrow functions even if => is on new line\n(\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*[_$[:alpha:]\\{\\(]([^<>=]|=[^<]|\\<\\s*[_$[:alpha:]\\{\\(]([^=<>]|=[^<])+\\>)+>\\s*)? # typeparameters\n \\((\\s*[_$[:alpha:]\\{\\(]([^()]|\\((\\s*[_$[:alpha:]\\{\\(]\\{\\(][^()]*)?\\))*)?\\) # parameteres\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)) |\n# typeannotation is fn type: < | () | (... | (param: | (param, | (param? | (param= | (param) =>\n(:\\s*(\n (<) |\n ([(]\\s*(\n ([)]) |\n (\\.\\.\\.) |\n ([_$[:alnum:]]+\\s*(\n ([:,?=])|\n ([)]\\s*=>)\n ))\n ))\n)))" + }, + { + "name": "meta.definition.property.js.jsx variable.object.property.js.jsx", + "match": "[_$[:alpha:]][_$[:alnum:]]*" + }, + { + "name": "keyword.operator.optional.js.jsx", + "match": "\\?" + } + ] + } + ] + }, + "variable-initializer": { + "patterns": [ + { + "begin": "(?)", + "captures": { + "1": { + "name": "storage.modifier.async.js.jsx" + }, + "2": { + "name": "variable.parameter.js.jsx" + } + } + }, + { + "name": "meta.arrow.js.jsx", + "begin": "(?x) (?:\n (? is on new line\n(\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*[_$[:alpha:]\\{\\(]([^<>=]|=[^<]|\\<\\s*[_$[:alpha:]\\{\\(]([^=<>]|=[^<])+\\>)+>\\s*)? # typeparameters\n \\((\\s*[_$[:alpha:]\\{\\(]([^()]|\\((\\s*[_$[:alpha:]\\{\\(]\\{\\(][^()]*)?\\))*)?\\) # parameteres\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n )\n)", + "beginCaptures": { + "1": { + "name": "storage.modifier.async.js.jsx" + } + }, + "end": "(?==>|\\{|(^\\s*(export|function|class|interface|let|var|const|import|enum|namespace|module|type|abstract|declare)\\s+))", + "patterns": [ + { + "include": "#comment" + }, + { + "include": "#type-parameters" + }, + { + "include": "#function-parameters" + }, + { + "include": "#arrow-return-type" + } + ] + }, + { + "name": "meta.arrow.js.jsx", + "begin": "=>", + "beginCaptures": { + "0": { + "name": "storage.type.function.arrow.js.jsx" + } + }, + "end": "(?<=\\}|\\S)(?)|((?!\\{)(?=\\S))", + "patterns": [ + { + "include": "#decl-block" + }, + { + "include": "#expression" + } + ] + } + ] + }, + "indexer-declaration": { + "name": "meta.indexer.declaration.js.jsx", + "begin": "(?:(?)\n )) |\n ((async\\s*)?(\n # sure shot arrow functions even if => is on new line\n(\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*[_$[:alpha:]\\{\\(]([^<>=]|=[^<]|\\<\\s*[_$[:alpha:]\\{\\(]([^=<>]|=[^<])+\\>)+>\\s*)? # typeparameters\n \\((\\s*[_$[:alpha:]\\{\\(]([^()]|\\((\\s*[_$[:alpha:]\\{\\(]\\{\\(][^()]*)?\\))*)?\\) # parameteres\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n)))", + "captures": { + "0": { + "name": "meta.object-literal.key.js.jsx" + }, + "1": { + "name": "entity.name.function.js.jsx" + } + } + }, + { + "name": "meta.object.member.js.jsx", + "match": "(?:[_$[:alpha:]][_$[:alnum:]]*)\\s*(?=:)", + "captures": { + "0": { + "name": "meta.object-literal.key.js.jsx" + } + } + }, + { + "name": "meta.object.member.js.jsx", + "begin": "\\.\\.\\.", + "beginCaptures": { + "0": { + "name": "keyword.operator.spread.js.jsx" + } + }, + "end": "(?=,|\\})", + "patterns": [ + { + "include": "#expression" + } + ] + }, + { + "name": "meta.object.member.js.jsx", + "match": "([_$[:alpha:]][_$[:alnum:]]*)\\s*(?=,|\\}|$)", + "captures": { + "1": { + "name": "variable.other.readwrite.js.jsx" + } + } + }, + { + "name": "meta.object.member.js.jsx", + "begin": "(?=[_$[:alpha:]][_$[:alnum:]]*\\s*=)", + "end": "(?=,|\\}|$)", + "patterns": [ + { + "include": "#expression" + } + ] + }, + { + "name": "meta.object.member.js.jsx", + "begin": ":", + "beginCaptures": { + "0": { + "name": "meta.object-literal.key.js.jsx punctuation.separator.key-value.js.jsx" + } + }, + "end": "(?=,|\\})", + "patterns": [ + { + "include": "#expression" + } + ] + }, + { + "include": "#punctuation-comma" + } + ] + }, + "ternary-expression": { + "begin": "(\\?)", + "beginCaptures": { + "0": { + "name": "keyword.operator.ternary.js.jsx" + } + }, + "end": "(:)", + "endCaptures": { + "0": { + "name": "keyword.operator.ternary.js.jsx" + } + }, + "patterns": [ + { + "include": "#expression" + } + ] + }, + "function-call": { + "begin": "(?=(([_$[:alpha:]][_$[:alnum:]]*\\s*\\.\\s*)*|(\\.\\s*)?)([_$[:alpha:]][_$[:alnum:]]*)\\s*(<\\s*[_$[:alpha:]\\{\\(]([^<>=]|=[^<]|\\<\\s*[_$[:alpha:]\\{\\(]([^=<>]|=[^<])+\\>)+>\\s*)?\\()", + "end": "(?<=\\))(?!(([_$[:alpha:]][_$[:alnum:]]*\\s*\\.\\s*)*|(\\.\\s*)?)([_$[:alpha:]][_$[:alnum:]]*)\\s*(<\\s*[_$[:alpha:]\\{\\(]([^<>=]|=[^<]|\\<\\s*[_$[:alpha:]\\{\\(]([^=<>]|=[^<])+\\>)+>\\s*)?\\()", + "patterns": [ + { + "name": "meta.function-call.js.jsx", + "begin": "(?=(([_$[:alpha:]][_$[:alnum:]]*\\s*\\.\\s*)*|(\\.\\s*)?)([_$[:alpha:]][_$[:alnum:]]*))", + "end": "(?=\\s*(<\\s*[_$[:alpha:]\\{\\(]([^<>=]|=[^<]|\\<\\s*[_$[:alpha:]\\{\\(]([^=<>]|=[^<])+\\>)+>\\s*)?\\()", + "patterns": [ + { + "include": "#literal" + }, + { + "include": "#support-objects" + }, + { + "include": "#object-identifiers" + }, + { + "include": "#punctuation-accessor" + }, + { + "name": "keyword.operator.expression.import.js.jsx", + "match": "(?![\\.\\$])\\bimport(?=\\s*[\\(]\\s*[\\\"\\'\\`])" + }, + { + "name": "entity.name.function.js.jsx", + "match": "([_$[:alpha:]][_$[:alnum:]]*)" + } + ] + }, + { + "include": "#comment" + }, + { + "name": "meta.type.parameters.js.jsx", + "begin": "\\<", + "beginCaptures": { + "0": { + "name": "punctuation.definition.typeparameters.begin.js.jsx" + } + }, + "end": "\\>", + "endCaptures": { + "0": { + "name": "punctuation.definition.typeparameters.end.js.jsx" + } + }, + "patterns": [ + { + "include": "#type" + }, + { + "include": "#punctuation-comma" + } + ] + }, + { + "include": "#paren-expression" + } + ] + }, + "new-expr": { + "name": "new.expr.js.jsx", + "begin": "(?>=|>>>=|\\|=" + }, + { + "name": "keyword.operator.bitwise.shift.js.jsx", + "match": "<<|>>>|>>" + }, + { + "name": "keyword.operator.comparison.js.jsx", + "match": "===|!==|==|!=" + }, + { + "name": "keyword.operator.relational.js.jsx", + "match": "<=|>=|<>|<|>" + }, + { + "name": "keyword.operator.logical.js.jsx", + "match": "\\!|&&|\\|\\|" + }, + { + "name": "keyword.operator.bitwise.js.jsx", + "match": "\\&|~|\\^|\\|" + }, + { + "name": "keyword.operator.assignment.js.jsx", + "match": "\\=" + }, + { + "name": "keyword.operator.decrement.js.jsx", + "match": "--" + }, + { + "name": "keyword.operator.increment.js.jsx", + "match": "\\+\\+" + }, + { + "name": "keyword.operator.arithmetic.js.jsx", + "match": "%|\\*|/|-|\\+" + }, + { + "match": "(?<=[_$[:alnum:])])\\s*(/)(?![/*])", + "captures": { + "1": { + "name": "keyword.operator.arithmetic.js.jsx" + } + } + } + ] + }, + "typeof-operator": { + "name": "keyword.operator.expression.typeof.js.jsx", + "match": "(?=]|=[^<]|\\<\\s*[_$[:alpha:]\\{\\(]([^=<>]|=[^<])+\\>)+>\\s*)?\\()", + "captures": { + "1": { + "name": "punctuation.accessor.js.jsx" + }, + "2": { + "name": "support.constant.dom.js.jsx" + }, + "3": { + "name": "support.variable.property.dom.js.jsx" + } + } + }, + { + "name": "support.class.node.js.jsx", + "match": "(?x)(?)\n )) |\n ((async\\s*)?(\n # sure shot arrow functions even if => is on new line\n(\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n) |\n(\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends\n) |\n# arrow function possible to detect only with => on same line\n(\n (<\\s*[_$[:alpha:]\\{\\(]([^<>=]|=[^<]|\\<\\s*[_$[:alpha:]\\{\\(]([^=<>]|=[^<])+\\>)+>\\s*)? # typeparameters\n \\((\\s*[_$[:alpha:]\\{\\(]([^()]|\\((\\s*[_$[:alpha:]\\{\\(]\\{\\(][^()]*)?\\))*)?\\) # parameteres\n (\\s*:\\s*([^<>\\(\\)]|\\<[^<>]+\\>|\\([^\\(\\)]+\\))+)? # return type\n \\s*=> # arrow operator\n)\n ))\n))", + "captures": { + "1": { + "name": "punctuation.accessor.js.jsx" + }, + "2": { + "name": "entity.name.function.js.jsx" + } + } + }, + { + "match": "(\\.)\\s*([[:upper:]][_$[:digit:][:upper:]]*)(?![_$[:alnum:]])", + "captures": { + "1": { + "name": "punctuation.accessor.js.jsx" + }, + "2": { + "name": "variable.other.constant.property.js.jsx" + } + } + }, + { + "match": "(\\.)\\s*([_$[:alpha:]][_$[:alnum:]]*)", + "captures": { + "1": { + "name": "punctuation.accessor.js.jsx" + }, + "2": { + "name": "variable.other.property.js.jsx" + } + } + }, + { + "name": "variable.other.constant.js.jsx", + "match": "([[:upper:]][_$[:digit:][:upper:]]*)(?![_$[:alnum:]])" + }, + { + "name": "variable.other.readwrite.js.jsx", + "match": "[_$[:alpha:]][_$[:alnum:]]*" + } + ] + }, + "object-identifiers": { + "patterns": [ + { + "name": "support.class.js.jsx", + "match": "([_$[:alpha:]][_$[:alnum:]]*)(?=\\s*\\.\\s*prototype\\b(?!\\$))" + }, + { + "match": "(?x)(\\.)\\s*(?:\n ([[:upper:]][_$[:digit:][:upper:]]*) |\n ([_$[:alpha:]][_$[:alnum:]]*)\n)(?=\\s*\\.\\s*[_$[:alpha:]][_$[:alnum:]]*)", + "captures": { + "1": { + "name": "punctuation.accessor.js.jsx" + }, + "2": { + "name": "variable.other.constant.object.property.js.jsx" + }, + "3": { + "name": "variable.other.object.property.js.jsx" + } + } + }, + { + "match": "(?x)(?:\n ([[:upper:]][_$[:digit:][:upper:]]*) |\n ([_$[:alpha:]][_$[:alnum:]]*)\n)(?=\\s*\\.\\s*[_$[:alpha:]][_$[:alnum:]]*)", + "captures": { + "1": { + "name": "variable.other.constant.object.js.jsx" + }, + "2": { + "name": "variable.other.object.js.jsx" + } + } + } + ] + }, + "type-annotation": { + "patterns": [ + { + "name": "meta.type.annotation.js.jsx", + "begin": "(:)(?=\\s*\\S)", + "beginCaptures": { + "1": { + "name": "keyword.operator.type.annotation.js.jsx" + } + }, + "end": "(?])|((?<=[\\}>\\]\\)]|[_$[:alpha:]])\\s*(?=\\{)))", + "patterns": [ + { + "include": "#type" + } + ] + }, + { + "name": "meta.type.annotation.js.jsx", + "begin": "(:)", + "beginCaptures": { + "1": { + "name": "keyword.operator.type.annotation.js.jsx" + } + }, + "end": "(?])|(?=^\\s*$)|((?<=\\S)(?=\\s*$))|((?<=[\\}>\\]\\)]|[_$[:alpha:]])\\s*(?=\\{)))", + "patterns": [ + { + "include": "#type" + } + ] + } + ] + }, + "return-type": { + "patterns": [ + { + "name": "meta.return.type.js.jsx", + "begin": "(?<=\\))\\s*(:)(?=\\s*\\S)", + "beginCaptures": { + "1": { + "name": "keyword.operator.type.annotation.js.jsx" + } + }, + "end": "(?|\\{|(^\\s*(export|function|class|interface|let|var|const|import|enum|namespace|module|type|abstract|declare)\\s+))", + "patterns": [ + { + "begin": "(?<=[:])(?=\\s*\\{)", + "end": "(?<=\\})", + "patterns": [ + { + "include": "#type-object" + } + ] + }, + { + "include": "#type-predicate-operator" + }, + { + "include": "#type" + } + ] + }, + "type-parameters": { + "name": "meta.type.parameters.js.jsx", + "begin": "(<)", + "beginCaptures": { + "1": { + "name": "punctuation.definition.typeparameters.begin.js.jsx" + } + }, + "end": "(>)", + "endCaptures": { + "1": { + "name": "punctuation.definition.typeparameters.end.js.jsx" + } + }, + "patterns": [ + { + "include": "#comment" + }, + { + "name": "storage.modifier.js.jsx", + "match": "(?)" + }, + { + "include": "#type" + }, + { + "include": "#punctuation-comma" + } + ] + }, + "type": { + "patterns": [ + { + "include": "#comment" + }, + { + "include": "#string" + }, + { + "include": "#numeric-literal" + }, + { + "include": "#type-primitive" + }, + { + "include": "#type-builtin-literals" + }, + { + "include": "#type-parameters" + }, + { + "include": "#type-tuple" + }, + { + "include": "#type-object" + }, + { + "include": "#type-operators" + }, + { + "include": "#type-fn-type-parameters" + }, + { + "include": "#type-paren-or-function-parameters" + }, + { + "include": "#type-function-return-type" + }, + { + "include": "#type-name" + } + ] + }, + "type-primitive": { + "name": "support.type.primitive.js.jsx", + "match": "(?)\n ))\n )\n )\n)", + "end": "(?<=\\))", + "patterns": [ + { + "include": "#function-parameters" + } + ] + } + ] + }, + "type-function-return-type": { + "patterns": [ + { + "name": "meta.type.function.return.js.jsx", + "begin": "(=>)(?=\\s*\\S)", + "beginCaptures": { + "1": { + "name": "storage.type.function.arrow.js.jsx" + } + }, + "end": "(?)(?]|//|$)", + "patterns": [ + { + "include": "#type-function-return-type-core" + } + ] + }, + { + "name": "meta.type.function.return.js.jsx", + "begin": "=>", + "beginCaptures": { + "0": { + "name": "storage.type.function.arrow.js.jsx" + } + }, + "end": "(?)(?]|//|^\\s*$)|((?<=\\S)(?=\\s*$)))", + "patterns": [ + { + "include": "#type-function-return-type-core" + } + ] + } + ] + }, + "type-function-return-type-core": { + "patterns": [ + { + "include": "#comment" + }, + { + "begin": "(?<==>)(?=\\s*\\{)", + "end": "(?<=\\})", + "patterns": [ + { + "include": "#type-object" + } + ] + }, + { + "include": "#type-predicate-operator" + }, + { + "include": "#type" + } + ] + }, + "type-operators": { + "patterns": [ + { + "include": "#typeof-operator" + }, + { + "begin": "([&|])(?=\\s*\\{)", + "beginCaptures": { + "0": { + "name": "keyword.operator.type.js.jsx" + } + }, + "end": "(?<=\\})", + "patterns": [ + { + "include": "#type-object" + } + ] + }, + { + "begin": "[&|]", + "beginCaptures": { + "0": { + "name": "keyword.operator.type.js.jsx" + } + }, + "end": "(?=\\S)" + }, + { + "name": "keyword.operator.expression.keyof.js.jsx", + "match": "(?|&&|\\|\\||\\*\\/)\\s*(\\/)(?![\\/*])(?=(?:[^\\/\\\\\\[]|\\\\.|\\[([^\\]\\\\]|\\\\.)+\\])+\\/(?![\\/*])[gimuy]*(?!\\s*[a-zA-Z0-9_$]))", + "beginCaptures": { + "1": { + "name": "punctuation.definition.string.begin.js.jsx" + } + }, + "end": "(/)([gimuy]*)", + "endCaptures": { + "1": { + "name": "punctuation.definition.string.end.js.jsx" + }, + "2": { + "name": "keyword.other.js.jsx" + } + }, + "patterns": [ + { + "include": "#regexp" + } + ] + }, + { + "name": "string.regexp.js.jsx", + "begin": "(?\\s*$)", + "beginCaptures": { + "1": { + "name": "punctuation.definition.comment.js.jsx" + } + }, + "end": "(?=^)", + "patterns": [ + { + "name": "meta.tag.js.jsx", + "begin": "(<)(reference|amd-dependency|amd-module)", + "beginCaptures": { + "1": { + "name": "punctuation.definition.tag.directive.js.jsx" + }, + "2": { + "name": "entity.name.tag.directive.js.jsx" + } + }, + "end": "/>", + "endCaptures": { + "0": { + "name": "punctuation.definition.tag.directive.js.jsx" + } + }, + "patterns": [ + { + "name": "entity.other.attribute-name.directive.js.jsx", + "match": "path|types|no-default-lib|name" + }, + { + "name": "keyword.operator.assignment.js.jsx", + "match": "=" + }, + { + "include": "#string" + } + ] + } + ] + }, + "docblock": { + "patterns": [ + { + "match": "(?x)\n((@)(?:access|api))\n\\s+\n(private|protected|public)\n\\b", + "captures": { + "1": { + "name": "storage.type.class.jsdoc" + }, + "2": { + "name": "punctuation.definition.block.tag.jsdoc" + }, + "3": { + "name": "constant.language.access-type.jsdoc" + } + } + }, + { + "match": "(?x)\n((@)author)\n\\s+\n(\n [^@\\s<>*/]\n (?:[^@<>*/]|\\*[^/])*\n)\n(?:\n \\s*\n (<)\n ([^>\\s]+)\n (>)\n)?", + "captures": { + "1": { + "name": "storage.type.class.jsdoc" + }, + "2": { + "name": "punctuation.definition.block.tag.jsdoc" + }, + "3": { + "name": "entity.name.type.instance.jsdoc" + }, + "4": { + "name": "punctuation.definition.bracket.angle.begin.jsdoc" + }, + "5": { + "name": "constant.other.email.link.underline.jsdoc" + }, + "6": { + "name": "punctuation.definition.bracket.angle.end.jsdoc" + } + } + }, + { + "match": "(?x)\n((@)borrows) \\s+\n((?:[^@\\s*/]|\\*[^/])+) # \n\\s+ (as) \\s+ # as\n((?:[^@\\s*/]|\\*[^/])+) # ", + "captures": { + "1": { + "name": "storage.type.class.jsdoc" + }, + "2": { + "name": "punctuation.definition.block.tag.jsdoc" + }, + "3": { + "name": "entity.name.type.instance.jsdoc" + }, + "4": { + "name": "keyword.operator.control.jsdoc" + }, + "5": { + "name": "entity.name.type.instance.jsdoc" + } + } + }, + { + "name": "meta.example.jsdoc", + "begin": "((@)example)\\s+", + "end": "(?=@|\\*/)", + "beginCaptures": { + "1": { + "name": "storage.type.class.jsdoc" + }, + "2": { + "name": "punctuation.definition.block.tag.jsdoc" + } + }, + "patterns": [ + { + "match": "^\\s\\*\\s+" + }, + { + "contentName": "constant.other.description.jsdoc", + "begin": "\\G(<)caption(>)", + "beginCaptures": { + "0": { + "name": "entity.name.tag.inline.jsdoc" + }, + "1": { + "name": "punctuation.definition.bracket.angle.begin.jsdoc" + }, + "2": { + "name": "punctuation.definition.bracket.angle.end.jsdoc" + } + }, + "end": "()|(?=\\*/)", + "endCaptures": { + "0": { + "name": "entity.name.tag.inline.jsdoc" + }, + "1": { + "name": "punctuation.definition.bracket.angle.begin.jsdoc" + }, + "2": { + "name": "punctuation.definition.bracket.angle.end.jsdoc" + } + } + }, + { + "match": "[^\\s@*](?:[^*]|\\*[^/])*", + "captures": { + "0": { + "name": "source.embedded.js.jsx" + } + } + } + ] + }, + { + "match": "(?x) ((@)kind) \\s+ (class|constant|event|external|file|function|member|mixin|module|namespace|typedef) \\b", + "captures": { + "1": { + "name": "storage.type.class.jsdoc" + }, + "2": { + "name": "punctuation.definition.block.tag.jsdoc" + }, + "3": { + "name": "constant.language.symbol-type.jsdoc" + } + } + }, + { + "match": "(?x)\n((@)see)\n\\s+\n(?:\n # URL\n (\n (?=https?://)\n (?:[^\\s*]|\\*[^/])+\n )\n |\n # JSDoc namepath\n (\n (?!\n # Avoid matching bare URIs (also acceptable as links)\n https?://\n |\n # Avoid matching {@inline tags}; we match those below\n (?:\\[[^\\[\\]]*\\])? # Possible description [preceding]{@tag}\n {@(?:link|linkcode|linkplain|tutorial)\\b\n )\n # Matched namepath\n (?:[^@\\s*/]|\\*[^/])+\n )\n)", + "captures": { + "1": { + "name": "storage.type.class.jsdoc" + }, + "2": { + "name": "punctuation.definition.block.tag.jsdoc" + }, + "3": { + "name": "variable.other.link.underline.jsdoc" + }, + "4": { + "name": "entity.name.type.instance.jsdoc" + } + } + }, + { + "match": "(?x)\n((@)template)\n\\s+\n# One or more valid identifiers\n(\n [A-Za-z_$] # First character: non-numeric word character\n [\\w$.\\[\\]]* # Rest of identifier\n (?: # Possible list of additional identifiers\n \\s* , \\s*\n [A-Za-z_$]\n [\\w$.\\[\\]]*\n )*\n)", + "captures": { + "1": { + "name": "storage.type.class.jsdoc" + }, + "2": { + "name": "punctuation.definition.block.tag.jsdoc" + }, + "3": { + "name": "variable.other.jsdoc" + } + } + }, + { + "match": "(?x)\n(\n (@)\n (?:arg|argument|const|constant|member|namespace|param|var)\n)\n\\s+\n(\n [A-Za-z_$]\n [\\w$.\\[\\]]*\n)", + "captures": { + "1": { + "name": "storage.type.class.jsdoc" + }, + "2": { + "name": "punctuation.definition.block.tag.jsdoc" + }, + "3": { + "name": "variable.other.jsdoc" + } + } + }, + { + "begin": "((@)typedef)\\s+(?={)", + "beginCaptures": { + "1": { + "name": "storage.type.class.jsdoc" + }, + "2": { + "name": "punctuation.definition.block.tag.jsdoc" + } + }, + "end": "(?=\\s|\\*/|[^{}\\[\\]A-Za-z_$])", + "patterns": [ + { + "include": "#jsdoctype" + }, + { + "name": "entity.name.type.instance.jsdoc", + "match": "(?:[^@\\s*/]|\\*[^/])+" + } + ] + }, + { + "begin": "((@)(?:arg|argument|const|constant|member|namespace|param|prop|property|var))\\s+(?={)", + "beginCaptures": { + "1": { + "name": "storage.type.class.jsdoc" + }, + "2": { + "name": "punctuation.definition.block.tag.jsdoc" + } + }, + "end": "(?=\\s|\\*/|[^{}\\[\\]A-Za-z_$])", + "patterns": [ + { + "include": "#jsdoctype" + }, + { + "name": "variable.other.jsdoc", + "match": "([A-Za-z_$][\\w$.\\[\\]]*)" + }, + { + "name": "variable.other.jsdoc", + "match": "(?x)\n(\\[)\\s*\n[\\w$]+\n(?:\n (?:\\[\\])? # Foo[ ].bar properties within an array\n \\. # Foo.Bar namespaced parameter\n [\\w$]+\n)*\n(?:\n \\s*\n (=) # [foo=bar] Default parameter value\n \\s*\n (\n # The inner regexes are to stop the match early at */ and to not stop at escaped quotes\n (?>\n \"(?:(?:\\*(?!/))|(?:\\\\(?!\"))|[^*\\\\])*?\" | # [foo=\"bar\"] Double-quoted\n '(?:(?:\\*(?!/))|(?:\\\\(?!'))|[^*\\\\])*?' | # [foo='bar'] Single-quoted\n \\[ (?:(?:\\*(?!/))|[^*])*? \\] | # [foo=[1,2]] Array literal\n (?:(?:\\*(?!/))|\\s(?!\\s*\\])|\\[.*?(?:\\]|(?=\\*/))|[^*\\s\\[\\]])* # Everything else\n )*\n )\n)?\n\\s*(?:(\\])((?:[^*\\s]|\\*[^\\s/])+)?|(?=\\*/))", + "captures": { + "1": { + "name": "punctuation.definition.optional-value.begin.bracket.square.jsdoc" + }, + "2": { + "name": "keyword.operator.assignment.jsdoc" + }, + "3": { + "name": "source.embedded.js.jsx" + }, + "4": { + "name": "punctuation.definition.optional-value.end.bracket.square.jsdoc" + }, + "5": { + "name": "invalid.illegal.syntax.jsdoc" + } + } + } + ] + }, + { + "begin": "(?x)\n(\n (@)\n (?:define|enum|exception|export|extends|lends|implements|modifies\n |namespace|private|protected|returns?|suppress|this|throws|type\n |yields?)\n)\n\\s+(?={)", + "beginCaptures": { + "1": { + "name": "storage.type.class.jsdoc" + }, + "2": { + "name": "punctuation.definition.block.tag.jsdoc" + } + }, + "end": "(?=\\s|\\*/|[^{}\\[\\]A-Za-z_$])", + "patterns": [ + { + "include": "#jsdoctype" + } + ] + }, + { + "match": "(?x)\n(\n (@)\n (?:alias|augments|callback|constructs|emits|event|fires|exports?\n |extends|external|function|func|host|lends|listens|interface|memberof!?\n |method|module|mixes|mixin|name|requires|see|this|typedef|uses)\n)\n\\s+\n(\n (?:\n [^{}@\\s*] | \\*[^/]\n )+\n)", + "captures": { + "1": { + "name": "storage.type.class.jsdoc" + }, + "2": { + "name": "punctuation.definition.block.tag.jsdoc" + }, + "3": { + "name": "entity.name.type.instance.jsdoc" + } + } + }, + { + "contentName": "variable.other.jsdoc", + "begin": "((@)(?:default(?:value)?|license|version))\\s+(([''\"]))", + "beginCaptures": { + "1": { + "name": "storage.type.class.jsdoc" + }, + "2": { + "name": "punctuation.definition.block.tag.jsdoc" + }, + "3": { + "name": "variable.other.jsdoc" + }, + "4": { + "name": "punctuation.definition.string.begin.jsdoc" + } + }, + "end": "(\\3)|(?=$|\\*/)", + "endCaptures": { + "0": { + "name": "variable.other.jsdoc" + }, + "1": { + "name": "punctuation.definition.string.end.jsdoc" + } + } + }, + { + "match": "((@)(?:default(?:value)?|license|tutorial|variation|version))\\s+([^\\s*]+)", + "captures": { + "1": { + "name": "storage.type.class.jsdoc" + }, + "2": { + "name": "punctuation.definition.block.tag.jsdoc" + }, + "3": { + "name": "variable.other.jsdoc" + } + } + }, + { + "name": "storage.type.class.jsdoc", + "match": "(?x) (@) (?:abstract|access|alias|api|arg|argument|async|attribute|augments|author|beta|borrows|bubbles |callback|chainable|class|classdesc|code|config|const|constant|constructor|constructs|copyright |default|defaultvalue|define|deprecated|desc|description|dict|emits|enum|event|example|exception |exports?|extends|extension(?:_?for)?|external|externs|file|fileoverview|final|fires|for|func |function|generator|global|hideconstructor|host|ignore|implements|implicitCast|inherit[Dd]oc |inner|instance|interface|internal|kind|lends|license|listens|main|member|memberof!?|method |mixes|mixins?|modifies|module|name|namespace|noalias|nocollapse|nocompile|nosideeffects |override|overview|package|param|polymer(?:Behavior)?|preserve|private|prop|property|protected |public|read[Oo]nly|record|require[ds]|returns?|see|since|static|struct|submodule|summary |suppress|template|this|throws|todo|tutorial|type|typedef|unrestricted|uses|var|variation |version|virtual|writeOnce|yields?) \\b", + "captures": { + "1": { + "name": "punctuation.definition.block.tag.jsdoc" + } + } + }, + { + "include": "#inline-tags" + } + ] + }, + "brackets": { + "patterns": [ + { + "begin": "{", + "end": "}|(?=\\*/)", + "patterns": [ + { + "include": "#brackets" + } + ] + }, + { + "begin": "\\[", + "end": "\\]|(?=\\*/)", + "patterns": [ + { + "include": "#brackets" + } + ] + } + ] + }, + "inline-tags": { + "patterns": [ + { + "name": "constant.other.description.jsdoc", + "match": "(\\[)[^\\]]+(\\])(?={@(?:link|linkcode|linkplain|tutorial))", + "captures": { + "1": { + "name": "punctuation.definition.bracket.square.begin.jsdoc" + }, + "2": { + "name": "punctuation.definition.bracket.square.end.jsdoc" + } + } + }, + { + "name": "entity.name.type.instance.jsdoc", + "begin": "({)((@)(?:link(?:code|plain)?|tutorial))\\s*", + "beginCaptures": { + "1": { + "name": "punctuation.definition.bracket.curly.begin.jsdoc" + }, + "2": { + "name": "storage.type.class.jsdoc" + }, + "3": { + "name": "punctuation.definition.inline.tag.jsdoc" + } + }, + "end": "}|(?=\\*/)", + "endCaptures": { + "0": { + "name": "punctuation.definition.bracket.curly.end.jsdoc" + } + }, + "patterns": [ + { + "match": "\\G((?=https?://)(?:[^|}\\s*]|\\*[/])+)(\\|)?", + "captures": { + "1": { + "name": "variable.other.link.underline.jsdoc" + }, + "2": { + "name": "punctuation.separator.pipe.jsdoc" + } + } + }, + { + "match": "\\G((?:[^{}@\\s|*]|\\*[^/])+)(\\|)?", + "captures": { + "1": { + "name": "variable.other.description.jsdoc" + }, + "2": { + "name": "punctuation.separator.pipe.jsdoc" + } + } + } + ] + } + ] + }, + "jsdoctype": { + "patterns": [ + { + "name": "invalid.illegal.type.jsdoc", + "match": "\\G{(?:[^}*]|\\*[^/}])+$" + }, + { + "contentName": "entity.name.type.instance.jsdoc", + "begin": "\\G({)", + "beginCaptures": { + "0": { + "name": "entity.name.type.instance.jsdoc" + }, + "1": { + "name": "punctuation.definition.bracket.curly.begin.jsdoc" + } + }, + "end": "((}))\\s*|(?=\\*/)", + "endCaptures": { + "1": { + "name": "entity.name.type.instance.jsdoc" + }, + "2": { + "name": "punctuation.definition.bracket.curly.end.jsdoc" + } + }, + "patterns": [ + { + "include": "#brackets" + } + ] + } + ] + }, + "jsx": { + "patterns": [ + { + "include": "#jsx-tag-without-attributes-in-expression" + }, + { + "include": "#jsx-tag-in-expression" + }, + { + "include": "#jsx-tag-invalid" + } + ] + }, + "jsx-tag-without-attributes-in-expression": { + "begin": "(?x)\n (?<=[({\\[,?=>:*]|&&|\\|\\||\\?|\\Wreturn|^return|\\Wdefault|^)\\s*\n (?=(<)\\s*((?:[a-z][a-z0-9]*|([_$a-zA-Z][-$\\w.]*))(?))", + "end": "(?!\\s*(<)\\s*((?:[a-z][a-z0-9]*|([_$a-zA-Z][-$\\w.]*))(?))", + "patterns": [ + { + "include": "#jsx-tag-without-attributes" + } + ] + }, + "jsx-tag-without-attributes": { + "name": "meta.tag.without-attributes.js.jsx", + "begin": "(<)\\s*((?:[a-z][a-z0-9]*|([_$a-zA-Z][-$\\w.]*))(?)", + "end": "()", + "beginCaptures": { + "1": { + "name": "punctuation.definition.tag.begin.js.jsx" + }, + "2": { + "name": "entity.name.tag.js.jsx" + }, + "3": { + "name": "support.class.component.js.jsx" + }, + "4": { + "name": "punctuation.definition.tag.end.js.jsx" + } + }, + "endCaptures": { + "1": { + "name": "punctuation.definition.tag.begin.js.jsx" + }, + "2": { + "name": "entity.name.tag.js.jsx" + }, + "3": { + "name": "support.class.component.js.jsx" + }, + "4": { + "name": "punctuation.definition.tag.end.js.jsx" + } + }, + "contentName": "meta.jsx.children.tsx", + "patterns": [ + { + "include": "#jsx-children" + } + ] + }, + "jsx-tag-in-expression": { + "begin": "(?x)\n (?<=[({\\[,?=>:*]|&&|\\|\\||\\?|\\Wreturn|^return|\\Wdefault|^)\\s*\n (?!<\\s*[_$[:alpha:]][_$[:alnum:]]*((\\s+extends\\s+[^=>])|,)) # look ahead is not type parameter of arrow\n (?=(<)\\s*\n ([_$a-zA-Z][-$\\w.]*(?))", + "end": "(/>)|(?:())", + "endCaptures": { + "0": { + "name": "meta.tag.js.jsx" + }, + "1": { + "name": "punctuation.definition.tag.end.js.jsx" + }, + "2": { + "name": "punctuation.definition.tag.begin.js.jsx" + }, + "3": { + "name": "entity.name.tag.js.jsx" + }, + "4": { + "name": "support.class.component.js.jsx" + }, + "5": { + "name": "punctuation.definition.tag.end.js.jsx" + } + }, + "patterns": [ + { + "include": "#jsx-tag" + } + ] + }, + "jsx-child-tag": { + "begin": "(?x)\n (?=(<)\\s*\n ([_$a-zA-Z][-$\\w.]*(?))", + "end": "(/>)|(?:())", + "endCaptures": { + "0": { + "name": "meta.tag.js.jsx" + }, + "1": { + "name": "punctuation.definition.tag.end.js.jsx" + }, + "2": { + "name": "punctuation.definition.tag.begin.js.jsx" + }, + "3": { + "name": "entity.name.tag.js.jsx" + }, + "4": { + "name": "support.class.component.js.jsx" + }, + "5": { + "name": "punctuation.definition.tag.end.js.jsx" + } + }, + "patterns": [ + { + "include": "#jsx-tag" + } + ] + }, + "jsx-tag": { + "name": "meta.tag.js.jsx", + "begin": "(?x)\n (?=(<)\\s*\n ([_$a-zA-Z][-$\\w.]*(?))", + "end": "(?=(/>)|(?:()))", + "patterns": [ + { + "begin": "(?x)\n (<)\\s*\n ((?:[a-z][a-z0-9]*|([_$a-zA-Z][-$\\w.]*))(?)", + "beginCaptures": { + "1": { + "name": "punctuation.definition.tag.begin.js.jsx" + }, + "2": { + "name": "entity.name.tag.js.jsx" + }, + "3": { + "name": "support.class.component.js.jsx" + } + }, + "end": "(?=[/]?>)", + "patterns": [ + { + "include": "#comment" + }, + { + "include": "#jsx-tag-attributes" + }, + { + "include": "#jsx-tag-attributes-illegal" + } + ] + }, + { + "begin": "(>)", + "beginCaptures": { + "1": { + "name": "punctuation.definition.tag.end.js.jsx" + } + }, + "end": "(?=" + }, + "jsx-children": { + "patterns": [ + { + "include": "#jsx-tag-without-attributes" + }, + { + "include": "#jsx-child-tag" + }, + { + "include": "#jsx-tag-invalid" + }, + { + "include": "#jsx-evaluated-code" + }, + { + "include": "#jsx-entities" + } + ] + }, + "jsx-evaluated-code": { + "name": "meta.embedded.expression.js.jsx", + "begin": "\\{", + "end": "\\}", + "beginCaptures": { + "0": { + "name": "punctuation.section.embedded.begin.js.jsx" + } + }, + "endCaptures": { + "0": { + "name": "punctuation.section.embedded.end.js.jsx" + } + }, + "patterns": [ + { + "include": "#expression" + } + ] + }, + "jsx-entities": { + "patterns": [ + { + "name": "constant.character.entity.js.jsx", + "match": "(&)([a-zA-Z0-9]+|#[0-9]+|#x[0-9a-fA-F]+)(;)", + "captures": { + "1": { + "name": "punctuation.definition.entity.js.jsx" + }, + "3": { + "name": "punctuation.definition.entity.js.jsx" + } + } + }, + { + "name": "invalid.illegal.bad-ampersand.js.jsx", + "match": "&" + } + ] + }, + "jsx-tag-attributes": { + "patterns": [ + { + "include": "#jsx-tag-attribute-name" + }, + { + "include": "#jsx-tag-attribute-assignment" + }, + { + "include": "#jsx-string-double-quoted" + }, + { + "include": "#jsx-string-single-quoted" + }, + { + "include": "#jsx-evaluated-code" + } + ] + }, + "jsx-tag-attribute-name": { + "match": "(?x)\n \\s*\n ([_$a-zA-Z][-$\\w]*)\n (?=\\s|=|/?>|/\\*|//)", + "captures": { + "1": { + "name": "entity.other.attribute-name.js.jsx" + } + } + }, + "jsx-tag-attribute-assignment": { + "name": "keyword.operator.assignment.js.jsx", + "match": "=(?=\\s*(?:'|\"|{|/\\*|//|\\n))" + }, + "jsx-string-double-quoted": { + "name": "string.quoted.double.js.jsx", + "begin": "\"", + "end": "\"", + "beginCaptures": { + "0": { + "name": "punctuation.definition.string.begin.js.jsx" + } + }, + "endCaptures": { + "0": { + "name": "punctuation.definition.string.end.js.jsx" + } + }, + "patterns": [ + { + "include": "#jsx-entities" + } + ] + }, + "jsx-string-single-quoted": { + "name": "string.quoted.single.js.jsx", + "begin": "'", + "end": "'", + "beginCaptures": { + "0": { + "name": "punctuation.definition.string.begin.js.jsx" + } + }, + "endCaptures": { + "0": { + "name": "punctuation.definition.string.end.js.jsx" + } + }, + "patterns": [ + { + "include": "#jsx-entities" + } + ] + }, + "jsx-tag-attributes-illegal": { + "name": "invalid.illegal.attribute.js.jsx", + "match": "\\S+" + } + } +} \ No newline at end of file diff --git a/extensions/javascript/test/colorize-results/test_jsx.json b/extensions/javascript/test/colorize-results/test_jsx.json index f12ab38729b..80d1d740615 100644 --- a/extensions/javascript/test/colorize-results/test_jsx.json +++ b/extensions/javascript/test/colorize-results/test_jsx.json @@ -1,7 +1,7 @@ [ { "c": "var", - "t": "source.js meta.var.expr.js storage.type.js", + "t": "source.js.jsx meta.var.expr.js.jsx storage.type.js.jsx", "r": { "dark_plus": "storage.type: #569CD6", "light_plus": "storage.type: #0000FF", @@ -12,7 +12,7 @@ }, { "c": " ", - "t": "source.js meta.var.expr.js", + "t": "source.js.jsx meta.var.expr.js.jsx", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -23,7 +23,7 @@ }, { "c": "ToggleText", - "t": "source.js meta.var.expr.js meta.var-single-variable.expr.js meta.definition.variable.js variable.other.readwrite.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.var-single-variable.expr.js.jsx meta.definition.variable.js.jsx variable.other.readwrite.js.jsx", "r": { "dark_plus": "variable: #9CDCFE", "light_plus": "variable: #001080", @@ -34,7 +34,7 @@ }, { "c": " ", - "t": "source.js meta.var.expr.js meta.var-single-variable.expr.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.var-single-variable.expr.js.jsx", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -45,7 +45,7 @@ }, { "c": "=", - "t": "source.js meta.var.expr.js keyword.operator.assignment.js", + "t": "source.js.jsx meta.var.expr.js.jsx keyword.operator.assignment.js.jsx", "r": { "dark_plus": "keyword.operator: #D4D4D4", "light_plus": "keyword.operator: #000000", @@ -56,7 +56,7 @@ }, { "c": " ", - "t": "source.js meta.var.expr.js", + "t": "source.js.jsx meta.var.expr.js.jsx", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -67,7 +67,7 @@ }, { "c": "React", - "t": "source.js meta.var.expr.js meta.function-call.js variable.other.object.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.function-call.js.jsx variable.other.object.js.jsx", "r": { "dark_plus": "variable: #9CDCFE", "light_plus": "variable: #001080", @@ -78,7 +78,7 @@ }, { "c": ".", - "t": "source.js meta.var.expr.js meta.function-call.js punctuation.accessor.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.function-call.js.jsx punctuation.accessor.js.jsx", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -89,7 +89,7 @@ }, { "c": "createClass", - "t": "source.js meta.var.expr.js meta.function-call.js entity.name.function.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.function-call.js.jsx entity.name.function.js.jsx", "r": { "dark_plus": "entity.name.function: #DCDCAA", "light_plus": "entity.name.function: #795E26", @@ -100,7 +100,7 @@ }, { "c": "(", - "t": "source.js meta.var.expr.js meta.brace.round.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.brace.round.js.jsx", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -111,7 +111,7 @@ }, { "c": "{", - "t": "source.js meta.var.expr.js meta.objectliteral.js punctuation.definition.block.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx punctuation.definition.block.js.jsx", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -122,7 +122,7 @@ }, { "c": " ", - "t": "source.js meta.var.expr.js meta.objectliteral.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -133,7 +133,7 @@ }, { "c": "getInitialState", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.object-literal.key.js entity.name.function.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.object-literal.key.js.jsx entity.name.function.js.jsx", "r": { "dark_plus": "meta.object-literal.key entity.name.function: #9CDCFE", "light_plus": "meta.object-literal.key entity.name.function: #001080", @@ -144,7 +144,7 @@ }, { "c": ":", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.object-literal.key.js punctuation.separator.key-value.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.object-literal.key.js.jsx punctuation.separator.key-value.js.jsx", "r": { "dark_plus": "meta.object-literal.key: #9CDCFE", "light_plus": "meta.object-literal.key: #001080", @@ -155,7 +155,7 @@ }, { "c": " ", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -166,7 +166,7 @@ }, { "c": "function", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js storage.type.function.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx storage.type.function.js.jsx", "r": { "dark_plus": "storage.type: #569CD6", "light_plus": "storage.type: #0000FF", @@ -177,7 +177,7 @@ }, { "c": " ", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -188,7 +188,7 @@ }, { "c": "(", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.parameters.js punctuation.definition.parameters.begin.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx meta.parameters.js.jsx punctuation.definition.parameters.begin.js.jsx", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -199,7 +199,7 @@ }, { "c": ")", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.parameters.js punctuation.definition.parameters.end.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx meta.parameters.js.jsx punctuation.definition.parameters.end.js.jsx", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -210,7 +210,7 @@ }, { "c": " ", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -221,7 +221,7 @@ }, { "c": "{", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js punctuation.definition.block.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx meta.block.js.jsx punctuation.definition.block.js.jsx", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -232,7 +232,7 @@ }, { "c": " ", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx meta.block.js.jsx", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -243,7 +243,7 @@ }, { "c": "return", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js keyword.control.flow.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx meta.block.js.jsx keyword.control.flow.js.jsx", "r": { "dark_plus": "keyword.control: #C586C0", "light_plus": "keyword.control: #AF00DB", @@ -254,7 +254,7 @@ }, { "c": " ", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js meta.objectliteral.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx meta.block.js.jsx meta.objectliteral.js.jsx", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -265,7 +265,7 @@ }, { "c": "{", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js meta.objectliteral.js punctuation.definition.block.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx meta.block.js.jsx meta.objectliteral.js.jsx punctuation.definition.block.js.jsx", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -276,7 +276,7 @@ }, { "c": " ", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js meta.objectliteral.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx meta.block.js.jsx meta.objectliteral.js.jsx", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -287,7 +287,7 @@ }, { "c": "showDefault", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js meta.objectliteral.js meta.object.member.js meta.object-literal.key.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx meta.block.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.object-literal.key.js.jsx", "r": { "dark_plus": "meta.object-literal.key: #9CDCFE", "light_plus": "meta.object-literal.key: #001080", @@ -298,7 +298,7 @@ }, { "c": ":", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js meta.objectliteral.js meta.object.member.js meta.object-literal.key.js punctuation.separator.key-value.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx meta.block.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.object-literal.key.js.jsx punctuation.separator.key-value.js.jsx", "r": { "dark_plus": "meta.object-literal.key: #9CDCFE", "light_plus": "meta.object-literal.key: #001080", @@ -309,7 +309,7 @@ }, { "c": " ", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js meta.objectliteral.js meta.object.member.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx meta.block.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -320,7 +320,7 @@ }, { "c": "true", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js meta.objectliteral.js meta.object.member.js constant.language.boolean.true.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx meta.block.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx constant.language.boolean.true.js.jsx", "r": { "dark_plus": "constant.language: #569CD6", "light_plus": "constant.language: #0000FF", @@ -331,7 +331,7 @@ }, { "c": " ", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js meta.objectliteral.js meta.object.member.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx meta.block.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -342,7 +342,7 @@ }, { "c": "}", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js meta.objectliteral.js punctuation.definition.block.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx meta.block.js.jsx meta.objectliteral.js.jsx punctuation.definition.block.js.jsx", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -353,7 +353,7 @@ }, { "c": " ", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx meta.block.js.jsx", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -364,7 +364,7 @@ }, { "c": "}", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js punctuation.definition.block.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx meta.block.js.jsx punctuation.definition.block.js.jsx", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -375,7 +375,7 @@ }, { "c": ",", - "t": "source.js meta.var.expr.js meta.objectliteral.js punctuation.separator.comma.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx punctuation.separator.comma.js.jsx", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -386,7 +386,7 @@ }, { "c": " ", - "t": "source.js meta.var.expr.js meta.objectliteral.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -397,7 +397,7 @@ }, { "c": "toggle", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.object-literal.key.js entity.name.function.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.object-literal.key.js.jsx entity.name.function.js.jsx", "r": { "dark_plus": "meta.object-literal.key entity.name.function: #9CDCFE", "light_plus": "meta.object-literal.key entity.name.function: #001080", @@ -408,7 +408,7 @@ }, { "c": ":", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.object-literal.key.js punctuation.separator.key-value.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.object-literal.key.js.jsx punctuation.separator.key-value.js.jsx", "r": { "dark_plus": "meta.object-literal.key: #9CDCFE", "light_plus": "meta.object-literal.key: #001080", @@ -419,7 +419,7 @@ }, { "c": " ", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -430,7 +430,7 @@ }, { "c": "function", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js storage.type.function.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx storage.type.function.js.jsx", "r": { "dark_plus": "storage.type: #569CD6", "light_plus": "storage.type: #0000FF", @@ -441,7 +441,7 @@ }, { "c": " ", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -452,7 +452,7 @@ }, { "c": "(", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.parameters.js punctuation.definition.parameters.begin.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx meta.parameters.js.jsx punctuation.definition.parameters.begin.js.jsx", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -463,7 +463,7 @@ }, { "c": "e", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.parameters.js variable.parameter.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx meta.parameters.js.jsx variable.parameter.js.jsx", "r": { "dark_plus": "variable: #9CDCFE", "light_plus": "variable: #001080", @@ -474,7 +474,7 @@ }, { "c": ")", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.parameters.js punctuation.definition.parameters.end.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx meta.parameters.js.jsx punctuation.definition.parameters.end.js.jsx", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -485,7 +485,7 @@ }, { "c": " ", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -496,7 +496,7 @@ }, { "c": "{", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js punctuation.definition.block.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx meta.block.js.jsx punctuation.definition.block.js.jsx", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -507,7 +507,7 @@ }, { "c": " ", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js punctuation.whitespace.comment.leading.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx meta.block.js.jsx punctuation.whitespace.comment.leading.js.jsx", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -518,7 +518,7 @@ }, { "c": "//", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js comment.line.double-slash.js punctuation.definition.comment.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx meta.block.js.jsx comment.line.double-slash.js.jsx punctuation.definition.comment.js.jsx", "r": { "dark_plus": "comment: #608B4E", "light_plus": "comment: #008000", @@ -529,7 +529,7 @@ }, { "c": " Prevent following the link.", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js comment.line.double-slash.tsx", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx meta.block.js.jsx comment.line.double-slash.tsx", "r": { "dark_plus": "comment: #608B4E", "light_plus": "comment: #008000", @@ -540,7 +540,7 @@ }, { "c": " ", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx meta.block.js.jsx", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -551,7 +551,7 @@ }, { "c": "e", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js meta.function-call.js variable.other.object.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx meta.block.js.jsx meta.function-call.js.jsx variable.other.object.js.jsx", "r": { "dark_plus": "variable: #9CDCFE", "light_plus": "variable: #001080", @@ -562,7 +562,7 @@ }, { "c": ".", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js meta.function-call.js punctuation.accessor.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx meta.block.js.jsx meta.function-call.js.jsx punctuation.accessor.js.jsx", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -573,7 +573,7 @@ }, { "c": "preventDefault", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js meta.function-call.js support.function.dom.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx meta.block.js.jsx meta.function-call.js.jsx support.function.dom.js.jsx", "r": { "dark_plus": "support.function: #DCDCAA", "light_plus": "support.function: #795E26", @@ -584,7 +584,7 @@ }, { "c": "()", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js meta.brace.round.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx meta.block.js.jsx meta.brace.round.js.jsx", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -595,7 +595,7 @@ }, { "c": ";", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js punctuation.terminator.statement.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx meta.block.js.jsx punctuation.terminator.statement.js.jsx", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -606,7 +606,7 @@ }, { "c": " ", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js punctuation.whitespace.comment.leading.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx meta.block.js.jsx punctuation.whitespace.comment.leading.js.jsx", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -617,7 +617,7 @@ }, { "c": "//", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js comment.line.double-slash.js punctuation.definition.comment.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx meta.block.js.jsx comment.line.double-slash.js.jsx punctuation.definition.comment.js.jsx", "r": { "dark_plus": "comment: #608B4E", "light_plus": "comment: #008000", @@ -628,7 +628,7 @@ }, { "c": " Invert the chosen default.", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js comment.line.double-slash.tsx", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx meta.block.js.jsx comment.line.double-slash.tsx", "r": { "dark_plus": "comment: #608B4E", "light_plus": "comment: #008000", @@ -639,7 +639,7 @@ }, { "c": " ", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js punctuation.whitespace.comment.leading.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx meta.block.js.jsx punctuation.whitespace.comment.leading.js.jsx", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -650,7 +650,7 @@ }, { "c": "//", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js comment.line.double-slash.js punctuation.definition.comment.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx meta.block.js.jsx comment.line.double-slash.js.jsx punctuation.definition.comment.js.jsx", "r": { "dark_plus": "comment: #608B4E", "light_plus": "comment: #008000", @@ -661,7 +661,7 @@ }, { "c": " This will trigger an intelligent re-render of the component.", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js comment.line.double-slash.tsx", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx meta.block.js.jsx comment.line.double-slash.tsx", "r": { "dark_plus": "comment: #608B4E", "light_plus": "comment: #008000", @@ -672,7 +672,7 @@ }, { "c": " ", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx meta.block.js.jsx", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -683,7 +683,7 @@ }, { "c": "this", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js meta.function-call.js variable.language.this.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx meta.block.js.jsx meta.function-call.js.jsx variable.language.this.js.jsx", "r": { "dark_plus": "variable.language: #569CD6", "light_plus": "variable.language: #0000FF", @@ -694,7 +694,7 @@ }, { "c": ".", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js meta.function-call.js punctuation.accessor.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx meta.block.js.jsx meta.function-call.js.jsx punctuation.accessor.js.jsx", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -705,7 +705,7 @@ }, { "c": "setState", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js meta.function-call.js entity.name.function.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx meta.block.js.jsx meta.function-call.js.jsx entity.name.function.js.jsx", "r": { "dark_plus": "entity.name.function: #DCDCAA", "light_plus": "entity.name.function: #795E26", @@ -716,7 +716,7 @@ }, { "c": "(", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js meta.brace.round.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx meta.block.js.jsx meta.brace.round.js.jsx", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -727,7 +727,7 @@ }, { "c": "{", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js meta.objectliteral.js punctuation.definition.block.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx meta.block.js.jsx meta.objectliteral.js.jsx punctuation.definition.block.js.jsx", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -738,7 +738,7 @@ }, { "c": " ", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js meta.objectliteral.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx meta.block.js.jsx meta.objectliteral.js.jsx", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -749,7 +749,7 @@ }, { "c": "showDefault", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js meta.objectliteral.js meta.object.member.js meta.object-literal.key.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx meta.block.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.object-literal.key.js.jsx", "r": { "dark_plus": "meta.object-literal.key: #9CDCFE", "light_plus": "meta.object-literal.key: #001080", @@ -760,7 +760,7 @@ }, { "c": ":", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js meta.objectliteral.js meta.object.member.js meta.object-literal.key.js punctuation.separator.key-value.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx meta.block.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.object-literal.key.js.jsx punctuation.separator.key-value.js.jsx", "r": { "dark_plus": "meta.object-literal.key: #9CDCFE", "light_plus": "meta.object-literal.key: #001080", @@ -771,7 +771,7 @@ }, { "c": " ", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js meta.objectliteral.js meta.object.member.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx meta.block.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -782,7 +782,7 @@ }, { "c": "!", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js meta.objectliteral.js meta.object.member.js keyword.operator.logical.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx meta.block.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx keyword.operator.logical.js.jsx", "r": { "dark_plus": "keyword.operator: #D4D4D4", "light_plus": "keyword.operator: #000000", @@ -793,7 +793,7 @@ }, { "c": "this", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js meta.objectliteral.js meta.object.member.js variable.language.this.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx meta.block.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx variable.language.this.js.jsx", "r": { "dark_plus": "variable.language: #569CD6", "light_plus": "variable.language: #0000FF", @@ -804,7 +804,7 @@ }, { "c": ".", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js meta.objectliteral.js meta.object.member.js punctuation.accessor.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx meta.block.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx punctuation.accessor.js.jsx", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -815,7 +815,7 @@ }, { "c": "state", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js meta.objectliteral.js meta.object.member.js variable.other.object.property.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx meta.block.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx variable.other.object.property.js.jsx", "r": { "dark_plus": "variable: #9CDCFE", "light_plus": "variable: #001080", @@ -826,7 +826,7 @@ }, { "c": ".", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js meta.objectliteral.js meta.object.member.js punctuation.accessor.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx meta.block.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx punctuation.accessor.js.jsx", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -837,7 +837,7 @@ }, { "c": "showDefault", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js meta.objectliteral.js meta.object.member.js variable.other.property.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx meta.block.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx variable.other.property.js.jsx", "r": { "dark_plus": "variable: #9CDCFE", "light_plus": "variable: #001080", @@ -848,7 +848,7 @@ }, { "c": " ", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js meta.objectliteral.js meta.object.member.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx meta.block.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -859,7 +859,7 @@ }, { "c": "}", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js meta.objectliteral.js punctuation.definition.block.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx meta.block.js.jsx meta.objectliteral.js.jsx punctuation.definition.block.js.jsx", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -870,7 +870,7 @@ }, { "c": ")", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js meta.brace.round.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx meta.block.js.jsx meta.brace.round.js.jsx", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -881,7 +881,7 @@ }, { "c": " ", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx meta.block.js.jsx", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -892,7 +892,7 @@ }, { "c": "}", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js punctuation.definition.block.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx meta.block.js.jsx punctuation.definition.block.js.jsx", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -903,7 +903,7 @@ }, { "c": ",", - "t": "source.js meta.var.expr.js meta.objectliteral.js punctuation.separator.comma.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx punctuation.separator.comma.js.jsx", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -914,7 +914,7 @@ }, { "c": " ", - "t": "source.js meta.var.expr.js meta.objectliteral.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -925,7 +925,7 @@ }, { "c": "render", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.object-literal.key.js entity.name.function.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.object-literal.key.js.jsx entity.name.function.js.jsx", "r": { "dark_plus": "meta.object-literal.key entity.name.function: #9CDCFE", "light_plus": "meta.object-literal.key entity.name.function: #001080", @@ -936,7 +936,7 @@ }, { "c": ":", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.object-literal.key.js punctuation.separator.key-value.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.object-literal.key.js.jsx punctuation.separator.key-value.js.jsx", "r": { "dark_plus": "meta.object-literal.key: #9CDCFE", "light_plus": "meta.object-literal.key: #001080", @@ -947,7 +947,7 @@ }, { "c": " ", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -958,7 +958,7 @@ }, { "c": "function", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js storage.type.function.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx storage.type.function.js.jsx", "r": { "dark_plus": "storage.type: #569CD6", "light_plus": "storage.type: #0000FF", @@ -969,7 +969,7 @@ }, { "c": " ", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -980,7 +980,7 @@ }, { "c": "(", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.parameters.js punctuation.definition.parameters.begin.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx meta.parameters.js.jsx punctuation.definition.parameters.begin.js.jsx", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -991,7 +991,7 @@ }, { "c": ")", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.parameters.js punctuation.definition.parameters.end.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx meta.parameters.js.jsx punctuation.definition.parameters.end.js.jsx", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -1002,7 +1002,7 @@ }, { "c": " ", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -1013,7 +1013,7 @@ }, { "c": "{", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js punctuation.definition.block.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx meta.block.js.jsx punctuation.definition.block.js.jsx", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -1024,7 +1024,7 @@ }, { "c": " ", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js punctuation.whitespace.comment.leading.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx meta.block.js.jsx punctuation.whitespace.comment.leading.js.jsx", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -1035,7 +1035,7 @@ }, { "c": "//", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js comment.line.double-slash.js punctuation.definition.comment.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx meta.block.js.jsx comment.line.double-slash.js.jsx punctuation.definition.comment.js.jsx", "r": { "dark_plus": "comment: #608B4E", "light_plus": "comment: #008000", @@ -1046,7 +1046,7 @@ }, { "c": " Default to the default message.", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js comment.line.double-slash.tsx", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx meta.block.js.jsx comment.line.double-slash.tsx", "r": { "dark_plus": "comment: #608B4E", "light_plus": "comment: #008000", @@ -1057,7 +1057,7 @@ }, { "c": " ", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx meta.block.js.jsx", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -1068,7 +1068,7 @@ }, { "c": "var", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js meta.var.expr.js storage.type.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx meta.block.js.jsx meta.var.expr.js.jsx storage.type.js.jsx", "r": { "dark_plus": "storage.type: #569CD6", "light_plus": "storage.type: #0000FF", @@ -1079,7 +1079,7 @@ }, { "c": " ", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js meta.var.expr.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx meta.block.js.jsx meta.var.expr.js.jsx", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -1090,7 +1090,7 @@ }, { "c": "message", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js meta.var.expr.js meta.var-single-variable.expr.js meta.definition.variable.js variable.other.readwrite.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx meta.block.js.jsx meta.var.expr.js.jsx meta.var-single-variable.expr.js.jsx meta.definition.variable.js.jsx variable.other.readwrite.js.jsx", "r": { "dark_plus": "variable: #9CDCFE", "light_plus": "variable: #001080", @@ -1101,7 +1101,7 @@ }, { "c": " ", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js meta.var.expr.js meta.var-single-variable.expr.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx meta.block.js.jsx meta.var.expr.js.jsx meta.var-single-variable.expr.js.jsx", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -1112,7 +1112,7 @@ }, { "c": "=", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js meta.var.expr.js keyword.operator.assignment.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx meta.block.js.jsx meta.var.expr.js.jsx keyword.operator.assignment.js.jsx", "r": { "dark_plus": "keyword.operator: #D4D4D4", "light_plus": "keyword.operator: #000000", @@ -1123,7 +1123,7 @@ }, { "c": " ", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js meta.var.expr.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx meta.block.js.jsx meta.var.expr.js.jsx", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -1134,7 +1134,7 @@ }, { "c": "this", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js meta.var.expr.js variable.language.this.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx meta.block.js.jsx meta.var.expr.js.jsx variable.language.this.js.jsx", "r": { "dark_plus": "variable.language: #569CD6", "light_plus": "variable.language: #0000FF", @@ -1145,7 +1145,7 @@ }, { "c": ".", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js meta.var.expr.js punctuation.accessor.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx meta.block.js.jsx meta.var.expr.js.jsx punctuation.accessor.js.jsx", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -1156,7 +1156,7 @@ }, { "c": "props", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js meta.var.expr.js variable.other.object.property.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx meta.block.js.jsx meta.var.expr.js.jsx variable.other.object.property.js.jsx", "r": { "dark_plus": "variable: #9CDCFE", "light_plus": "variable: #001080", @@ -1167,7 +1167,7 @@ }, { "c": ".", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js meta.var.expr.js punctuation.accessor.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx meta.block.js.jsx meta.var.expr.js.jsx punctuation.accessor.js.jsx", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -1178,7 +1178,7 @@ }, { "c": "default", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js meta.var.expr.js variable.other.property.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx meta.block.js.jsx meta.var.expr.js.jsx variable.other.property.js.jsx", "r": { "dark_plus": "variable: #9CDCFE", "light_plus": "variable: #001080", @@ -1189,7 +1189,7 @@ }, { "c": ";", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js punctuation.terminator.statement.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx meta.block.js.jsx punctuation.terminator.statement.js.jsx", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -1200,7 +1200,7 @@ }, { "c": " ", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js punctuation.whitespace.comment.leading.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx meta.block.js.jsx punctuation.whitespace.comment.leading.js.jsx", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -1211,7 +1211,7 @@ }, { "c": "//", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js comment.line.double-slash.js punctuation.definition.comment.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx meta.block.js.jsx comment.line.double-slash.js.jsx punctuation.definition.comment.js.jsx", "r": { "dark_plus": "comment: #608B4E", "light_plus": "comment: #008000", @@ -1222,7 +1222,7 @@ }, { "c": " If toggled, show the alternate message.", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js comment.line.double-slash.tsx", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx meta.block.js.jsx comment.line.double-slash.tsx", "r": { "dark_plus": "comment: #608B4E", "light_plus": "comment: #008000", @@ -1233,7 +1233,7 @@ }, { "c": " ", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx meta.block.js.jsx", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -1244,7 +1244,7 @@ }, { "c": "if", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js keyword.control.conditional.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx meta.block.js.jsx keyword.control.conditional.js.jsx", "r": { "dark_plus": "keyword.control: #C586C0", "light_plus": "keyword.control: #AF00DB", @@ -1255,7 +1255,7 @@ }, { "c": " ", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx meta.block.js.jsx", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -1266,7 +1266,7 @@ }, { "c": "(", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js meta.brace.round.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx meta.block.js.jsx meta.brace.round.js.jsx", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -1277,7 +1277,7 @@ }, { "c": "!", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js keyword.operator.logical.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx meta.block.js.jsx keyword.operator.logical.js.jsx", "r": { "dark_plus": "keyword.operator: #D4D4D4", "light_plus": "keyword.operator: #000000", @@ -1288,7 +1288,7 @@ }, { "c": "this", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js variable.language.this.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx meta.block.js.jsx variable.language.this.js.jsx", "r": { "dark_plus": "variable.language: #569CD6", "light_plus": "variable.language: #0000FF", @@ -1299,7 +1299,7 @@ }, { "c": ".", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js punctuation.accessor.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx meta.block.js.jsx punctuation.accessor.js.jsx", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -1310,7 +1310,7 @@ }, { "c": "state", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js variable.other.object.property.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx meta.block.js.jsx variable.other.object.property.js.jsx", "r": { "dark_plus": "variable: #9CDCFE", "light_plus": "variable: #001080", @@ -1321,7 +1321,7 @@ }, { "c": ".", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js punctuation.accessor.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx meta.block.js.jsx punctuation.accessor.js.jsx", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -1332,7 +1332,7 @@ }, { "c": "showDefault", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js variable.other.property.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx meta.block.js.jsx variable.other.property.js.jsx", "r": { "dark_plus": "variable: #9CDCFE", "light_plus": "variable: #001080", @@ -1343,7 +1343,7 @@ }, { "c": ")", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js meta.brace.round.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx meta.block.js.jsx meta.brace.round.js.jsx", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -1354,7 +1354,7 @@ }, { "c": " ", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx meta.block.js.jsx", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -1365,7 +1365,7 @@ }, { "c": "{", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js meta.block.js punctuation.definition.block.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx meta.block.js.jsx meta.block.js.jsx punctuation.definition.block.js.jsx", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -1376,7 +1376,7 @@ }, { "c": " ", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js meta.block.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx meta.block.js.jsx meta.block.js.jsx", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -1387,7 +1387,7 @@ }, { "c": "message", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js meta.block.js variable.other.readwrite.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx meta.block.js.jsx meta.block.js.jsx variable.other.readwrite.js.jsx", "r": { "dark_plus": "variable: #9CDCFE", "light_plus": "variable: #001080", @@ -1398,7 +1398,7 @@ }, { "c": " ", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js meta.block.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx meta.block.js.jsx meta.block.js.jsx", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -1409,7 +1409,7 @@ }, { "c": "=", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js meta.block.js keyword.operator.assignment.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx meta.block.js.jsx meta.block.js.jsx keyword.operator.assignment.js.jsx", "r": { "dark_plus": "keyword.operator: #D4D4D4", "light_plus": "keyword.operator: #000000", @@ -1420,7 +1420,7 @@ }, { "c": " ", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js meta.block.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx meta.block.js.jsx meta.block.js.jsx", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -1431,7 +1431,7 @@ }, { "c": "this", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js meta.block.js variable.language.this.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx meta.block.js.jsx meta.block.js.jsx variable.language.this.js.jsx", "r": { "dark_plus": "variable.language: #569CD6", "light_plus": "variable.language: #0000FF", @@ -1442,7 +1442,7 @@ }, { "c": ".", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js meta.block.js punctuation.accessor.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx meta.block.js.jsx meta.block.js.jsx punctuation.accessor.js.jsx", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -1453,7 +1453,7 @@ }, { "c": "props", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js meta.block.js variable.other.object.property.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx meta.block.js.jsx meta.block.js.jsx variable.other.object.property.js.jsx", "r": { "dark_plus": "variable: #9CDCFE", "light_plus": "variable: #001080", @@ -1464,7 +1464,7 @@ }, { "c": ".", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js meta.block.js punctuation.accessor.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx meta.block.js.jsx meta.block.js.jsx punctuation.accessor.js.jsx", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -1475,7 +1475,7 @@ }, { "c": "alt", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js meta.block.js support.variable.property.dom.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx meta.block.js.jsx meta.block.js.jsx support.variable.property.dom.js.jsx", "r": { "dark_plus": "support.variable: #9CDCFE", "light_plus": "support.variable: #001080", @@ -1486,7 +1486,7 @@ }, { "c": ";", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js meta.block.js punctuation.terminator.statement.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx meta.block.js.jsx meta.block.js.jsx punctuation.terminator.statement.js.jsx", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -1497,7 +1497,7 @@ }, { "c": " ", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js meta.block.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx meta.block.js.jsx meta.block.js.jsx", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -1508,7 +1508,7 @@ }, { "c": "}", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js meta.block.js punctuation.definition.block.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx meta.block.js.jsx meta.block.js.jsx punctuation.definition.block.js.jsx", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -1519,7 +1519,7 @@ }, { "c": " ", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx meta.block.js.jsx", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -1530,7 +1530,7 @@ }, { "c": "return", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js keyword.control.flow.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx meta.block.js.jsx keyword.control.flow.js.jsx", "r": { "dark_plus": "keyword.control: #C586C0", "light_plus": "keyword.control: #AF00DB", @@ -1541,7 +1541,7 @@ }, { "c": " ", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx meta.block.js.jsx", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -1552,7 +1552,7 @@ }, { "c": "(", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js meta.brace.round.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx meta.block.js.jsx meta.brace.round.js.jsx", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -1563,7 +1563,7 @@ }, { "c": " ", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx meta.block.js.jsx", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -1574,7 +1574,7 @@ }, { "c": "<", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js meta.tag.without-attributes.js punctuation.definition.tag.begin.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx meta.block.js.jsx meta.tag.without-attributes.js.jsx punctuation.definition.tag.begin.js.jsx", "r": { "dark_plus": "punctuation.definition.tag: #808080", "light_plus": "punctuation.definition.tag: #800000", @@ -1585,7 +1585,7 @@ }, { "c": "div", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js meta.tag.without-attributes.js entity.name.tag.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx meta.block.js.jsx meta.tag.without-attributes.js.jsx entity.name.tag.js.jsx", "r": { "dark_plus": "entity.name.tag: #569CD6", "light_plus": "entity.name.tag: #800000", @@ -1596,7 +1596,7 @@ }, { "c": ">", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js meta.tag.without-attributes.js punctuation.definition.tag.end.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx meta.block.js.jsx meta.tag.without-attributes.js.jsx punctuation.definition.tag.end.js.jsx", "r": { "dark_plus": "punctuation.definition.tag: #808080", "light_plus": "punctuation.definition.tag: #800000", @@ -1607,7 +1607,7 @@ }, { "c": " ", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js meta.tag.without-attributes.js meta.jsx.children.tsx", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx meta.block.js.jsx meta.tag.without-attributes.js.jsx meta.jsx.children.tsx", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -1618,7 +1618,7 @@ }, { "c": "<", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js meta.tag.without-attributes.js meta.jsx.children.tsx meta.tag.without-attributes.js punctuation.definition.tag.begin.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx meta.block.js.jsx meta.tag.without-attributes.js.jsx meta.jsx.children.tsx meta.tag.without-attributes.js.jsx punctuation.definition.tag.begin.js.jsx", "r": { "dark_plus": "punctuation.definition.tag: #808080", "light_plus": "punctuation.definition.tag: #800000", @@ -1629,7 +1629,7 @@ }, { "c": "h1", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js meta.tag.without-attributes.js meta.jsx.children.tsx meta.tag.without-attributes.js entity.name.tag.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx meta.block.js.jsx meta.tag.without-attributes.js.jsx meta.jsx.children.tsx meta.tag.without-attributes.js.jsx entity.name.tag.js.jsx", "r": { "dark_plus": "entity.name.tag: #569CD6", "light_plus": "entity.name.tag: #800000", @@ -1640,7 +1640,7 @@ }, { "c": ">", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js meta.tag.without-attributes.js meta.jsx.children.tsx meta.tag.without-attributes.js punctuation.definition.tag.end.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx meta.block.js.jsx meta.tag.without-attributes.js.jsx meta.jsx.children.tsx meta.tag.without-attributes.js.jsx punctuation.definition.tag.end.js.jsx", "r": { "dark_plus": "punctuation.definition.tag: #808080", "light_plus": "punctuation.definition.tag: #800000", @@ -1651,7 +1651,7 @@ }, { "c": "Hello ", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js meta.tag.without-attributes.js meta.jsx.children.tsx meta.tag.without-attributes.js meta.jsx.children.tsx", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx meta.block.js.jsx meta.tag.without-attributes.js.jsx meta.jsx.children.tsx meta.tag.without-attributes.js.jsx meta.jsx.children.tsx", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -1662,7 +1662,7 @@ }, { "c": "{", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js meta.tag.without-attributes.js meta.jsx.children.tsx meta.tag.without-attributes.js meta.jsx.children.tsx meta.embedded.expression.js punctuation.section.embedded.begin.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx meta.block.js.jsx meta.tag.without-attributes.js.jsx meta.jsx.children.tsx meta.tag.without-attributes.js.jsx meta.jsx.children.tsx meta.embedded.expression.js.jsx punctuation.section.embedded.begin.js.jsx", "r": { "dark_plus": "punctuation.section.embedded: #569CD6", "light_plus": "punctuation.section.embedded: #0000FF", @@ -1673,7 +1673,7 @@ }, { "c": "message", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js meta.tag.without-attributes.js meta.jsx.children.tsx meta.tag.without-attributes.js meta.jsx.children.tsx meta.embedded.expression.js variable.other.readwrite.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx meta.block.js.jsx meta.tag.without-attributes.js.jsx meta.jsx.children.tsx meta.tag.without-attributes.js.jsx meta.jsx.children.tsx meta.embedded.expression.js.jsx variable.other.readwrite.js.jsx", "r": { "dark_plus": "variable: #9CDCFE", "light_plus": "variable: #001080", @@ -1684,7 +1684,7 @@ }, { "c": "}", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js meta.tag.without-attributes.js meta.jsx.children.tsx meta.tag.without-attributes.js meta.jsx.children.tsx meta.embedded.expression.js punctuation.section.embedded.end.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx meta.block.js.jsx meta.tag.without-attributes.js.jsx meta.jsx.children.tsx meta.tag.without-attributes.js.jsx meta.jsx.children.tsx meta.embedded.expression.js.jsx punctuation.section.embedded.end.js.jsx", "r": { "dark_plus": "punctuation.section.embedded: #569CD6", "light_plus": "punctuation.section.embedded: #0000FF", @@ -1695,7 +1695,7 @@ }, { "c": "!", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js meta.tag.without-attributes.js meta.jsx.children.tsx meta.tag.without-attributes.js meta.jsx.children.tsx", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx meta.block.js.jsx meta.tag.without-attributes.js.jsx meta.jsx.children.tsx meta.tag.without-attributes.js.jsx meta.jsx.children.tsx", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -1706,7 +1706,7 @@ }, { "c": "", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js meta.tag.without-attributes.js meta.jsx.children.tsx meta.tag.without-attributes.js punctuation.definition.tag.end.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx meta.block.js.jsx meta.tag.without-attributes.js.jsx meta.jsx.children.tsx meta.tag.without-attributes.js.jsx punctuation.definition.tag.end.js.jsx", "r": { "dark_plus": "punctuation.definition.tag: #808080", "light_plus": "punctuation.definition.tag: #800000", @@ -1739,7 +1739,7 @@ }, { "c": " ", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js meta.tag.without-attributes.js meta.jsx.children.tsx", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx meta.block.js.jsx meta.tag.without-attributes.js.jsx meta.jsx.children.tsx", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -1750,7 +1750,7 @@ }, { "c": "<", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js meta.tag.without-attributes.js meta.jsx.children.tsx meta.tag.js punctuation.definition.tag.begin.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx meta.block.js.jsx meta.tag.without-attributes.js.jsx meta.jsx.children.tsx meta.tag.js.jsx punctuation.definition.tag.begin.js.jsx", "r": { "dark_plus": "punctuation.definition.tag: #808080", "light_plus": "punctuation.definition.tag: #800000", @@ -1761,7 +1761,7 @@ }, { "c": "a", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js meta.tag.without-attributes.js meta.jsx.children.tsx meta.tag.js entity.name.tag.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx meta.block.js.jsx meta.tag.without-attributes.js.jsx meta.jsx.children.tsx meta.tag.js.jsx entity.name.tag.js.jsx", "r": { "dark_plus": "entity.name.tag: #569CD6", "light_plus": "entity.name.tag: #800000", @@ -1772,7 +1772,7 @@ }, { "c": " ", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js meta.tag.without-attributes.js meta.jsx.children.tsx meta.tag.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx meta.block.js.jsx meta.tag.without-attributes.js.jsx meta.jsx.children.tsx meta.tag.js.jsx", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -1783,7 +1783,7 @@ }, { "c": "href", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js meta.tag.without-attributes.js meta.jsx.children.tsx meta.tag.js entity.other.attribute-name.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx meta.block.js.jsx meta.tag.without-attributes.js.jsx meta.jsx.children.tsx meta.tag.js.jsx entity.other.attribute-name.js.jsx", "r": { "dark_plus": "entity.other.attribute-name: #9CDCFE", "light_plus": "entity.other.attribute-name: #FF0000", @@ -1794,7 +1794,7 @@ }, { "c": "=", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js meta.tag.without-attributes.js meta.jsx.children.tsx meta.tag.js keyword.operator.assignment.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx meta.block.js.jsx meta.tag.without-attributes.js.jsx meta.jsx.children.tsx meta.tag.js.jsx keyword.operator.assignment.js.jsx", "r": { "dark_plus": "keyword.operator: #D4D4D4", "light_plus": "keyword.operator: #000000", @@ -1805,7 +1805,7 @@ }, { "c": "\"", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js meta.tag.without-attributes.js meta.jsx.children.tsx meta.tag.js string.quoted.double.js punctuation.definition.string.begin.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx meta.block.js.jsx meta.tag.without-attributes.js.jsx meta.jsx.children.tsx meta.tag.js.jsx string.quoted.double.js.jsx punctuation.definition.string.begin.js.jsx", "r": { "dark_plus": "string: #CE9178", "light_plus": "string: #A31515", @@ -1816,7 +1816,7 @@ }, { "c": "\"", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js meta.tag.without-attributes.js meta.jsx.children.tsx meta.tag.js string.quoted.double.js punctuation.definition.string.end.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx meta.block.js.jsx meta.tag.without-attributes.js.jsx meta.jsx.children.tsx meta.tag.js.jsx string.quoted.double.js.jsx punctuation.definition.string.end.js.jsx", "r": { "dark_plus": "string: #CE9178", "light_plus": "string: #A31515", @@ -1827,7 +1827,7 @@ }, { "c": " ", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js meta.tag.without-attributes.js meta.jsx.children.tsx meta.tag.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx meta.block.js.jsx meta.tag.without-attributes.js.jsx meta.jsx.children.tsx meta.tag.js.jsx", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -1838,7 +1838,7 @@ }, { "c": "onClick", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js meta.tag.without-attributes.js meta.jsx.children.tsx meta.tag.js entity.other.attribute-name.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx meta.block.js.jsx meta.tag.without-attributes.js.jsx meta.jsx.children.tsx meta.tag.js.jsx entity.other.attribute-name.js.jsx", "r": { "dark_plus": "entity.other.attribute-name: #9CDCFE", "light_plus": "entity.other.attribute-name: #FF0000", @@ -1849,7 +1849,7 @@ }, { "c": "=", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js meta.tag.without-attributes.js meta.jsx.children.tsx meta.tag.js keyword.operator.assignment.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx meta.block.js.jsx meta.tag.without-attributes.js.jsx meta.jsx.children.tsx meta.tag.js.jsx keyword.operator.assignment.js.jsx", "r": { "dark_plus": "keyword.operator: #D4D4D4", "light_plus": "keyword.operator: #000000", @@ -1860,7 +1860,7 @@ }, { "c": "{", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js meta.tag.without-attributes.js meta.jsx.children.tsx meta.tag.js meta.embedded.expression.js punctuation.section.embedded.begin.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx meta.block.js.jsx meta.tag.without-attributes.js.jsx meta.jsx.children.tsx meta.tag.js.jsx meta.embedded.expression.js.jsx punctuation.section.embedded.begin.js.jsx", "r": { "dark_plus": "punctuation.section.embedded: #569CD6", "light_plus": "punctuation.section.embedded: #0000FF", @@ -1871,7 +1871,7 @@ }, { "c": "this", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js meta.tag.without-attributes.js meta.jsx.children.tsx meta.tag.js meta.embedded.expression.js variable.language.this.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx meta.block.js.jsx meta.tag.without-attributes.js.jsx meta.jsx.children.tsx meta.tag.js.jsx meta.embedded.expression.js.jsx variable.language.this.js.jsx", "r": { "dark_plus": "variable.language: #569CD6", "light_plus": "variable.language: #0000FF", @@ -1882,7 +1882,7 @@ }, { "c": ".", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js meta.tag.without-attributes.js meta.jsx.children.tsx meta.tag.js meta.embedded.expression.js punctuation.accessor.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx meta.block.js.jsx meta.tag.without-attributes.js.jsx meta.jsx.children.tsx meta.tag.js.jsx meta.embedded.expression.js.jsx punctuation.accessor.js.jsx", "r": { "dark_plus": "meta.embedded: #D4D4D4", "light_plus": "meta.embedded: #000000", @@ -1893,7 +1893,7 @@ }, { "c": "toggle", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js meta.tag.without-attributes.js meta.jsx.children.tsx meta.tag.js meta.embedded.expression.js variable.other.property.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx meta.block.js.jsx meta.tag.without-attributes.js.jsx meta.jsx.children.tsx meta.tag.js.jsx meta.embedded.expression.js.jsx variable.other.property.js.jsx", "r": { "dark_plus": "variable: #9CDCFE", "light_plus": "variable: #001080", @@ -1904,7 +1904,7 @@ }, { "c": "}", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js meta.tag.without-attributes.js meta.jsx.children.tsx meta.tag.js meta.embedded.expression.js punctuation.section.embedded.end.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx meta.block.js.jsx meta.tag.without-attributes.js.jsx meta.jsx.children.tsx meta.tag.js.jsx meta.embedded.expression.js.jsx punctuation.section.embedded.end.js.jsx", "r": { "dark_plus": "punctuation.section.embedded: #569CD6", "light_plus": "punctuation.section.embedded: #0000FF", @@ -1915,7 +1915,7 @@ }, { "c": ">", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js meta.tag.without-attributes.js meta.jsx.children.tsx meta.tag.js punctuation.definition.tag.end.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx meta.block.js.jsx meta.tag.without-attributes.js.jsx meta.jsx.children.tsx meta.tag.js.jsx punctuation.definition.tag.end.js.jsx", "r": { "dark_plus": "punctuation.definition.tag: #808080", "light_plus": "punctuation.definition.tag: #800000", @@ -1926,7 +1926,7 @@ }, { "c": "Toggle", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js meta.tag.without-attributes.js meta.jsx.children.tsx meta.tag.js meta.jsx.children.tsx", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx meta.block.js.jsx meta.tag.without-attributes.js.jsx meta.jsx.children.tsx meta.tag.js.jsx meta.jsx.children.tsx", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -1937,7 +1937,7 @@ }, { "c": "", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js meta.tag.without-attributes.js meta.jsx.children.tsx meta.tag.js punctuation.definition.tag.end.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx meta.block.js.jsx meta.tag.without-attributes.js.jsx meta.jsx.children.tsx meta.tag.js.jsx punctuation.definition.tag.end.js.jsx", "r": { "dark_plus": "punctuation.definition.tag: #808080", "light_plus": "punctuation.definition.tag: #800000", @@ -1970,7 +1970,7 @@ }, { "c": " ", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js meta.tag.without-attributes.js meta.jsx.children.tsx", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx meta.block.js.jsx meta.tag.without-attributes.js.jsx meta.jsx.children.tsx", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -1981,7 +1981,7 @@ }, { "c": "", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js meta.tag.without-attributes.js punctuation.definition.tag.end.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx meta.block.js.jsx meta.tag.without-attributes.js.jsx punctuation.definition.tag.end.js.jsx", "r": { "dark_plus": "punctuation.definition.tag: #808080", "light_plus": "punctuation.definition.tag: #800000", @@ -2014,7 +2014,7 @@ }, { "c": " ", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx meta.block.js.jsx", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -2025,7 +2025,7 @@ }, { "c": ")", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js meta.brace.round.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx meta.block.js.jsx meta.brace.round.js.jsx", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -2036,7 +2036,7 @@ }, { "c": ";", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js punctuation.terminator.statement.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx meta.block.js.jsx punctuation.terminator.statement.js.jsx", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -2047,7 +2047,7 @@ }, { "c": " ", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx meta.block.js.jsx", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -2058,7 +2058,7 @@ }, { "c": "}", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js punctuation.definition.block.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx meta.object.member.js.jsx meta.function.expression.js.jsx meta.block.js.jsx punctuation.definition.block.js.jsx", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -2069,7 +2069,7 @@ }, { "c": "}", - "t": "source.js meta.var.expr.js meta.objectliteral.js punctuation.definition.block.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.objectliteral.js.jsx punctuation.definition.block.js.jsx", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -2080,7 +2080,7 @@ }, { "c": ")", - "t": "source.js meta.var.expr.js meta.brace.round.js", + "t": "source.js.jsx meta.var.expr.js.jsx meta.brace.round.js.jsx", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -2091,7 +2091,7 @@ }, { "c": ";", - "t": "source.js punctuation.terminator.statement.js", + "t": "source.js.jsx punctuation.terminator.statement.js.jsx", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -2102,7 +2102,7 @@ }, { "c": "React", - "t": "source.js meta.function-call.js variable.other.object.js", + "t": "source.js.jsx meta.function-call.js.jsx variable.other.object.js.jsx", "r": { "dark_plus": "variable: #9CDCFE", "light_plus": "variable: #001080", @@ -2113,7 +2113,7 @@ }, { "c": ".", - "t": "source.js meta.function-call.js punctuation.accessor.js", + "t": "source.js.jsx meta.function-call.js.jsx punctuation.accessor.js.jsx", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -2124,7 +2124,7 @@ }, { "c": "render", - "t": "source.js meta.function-call.js entity.name.function.js", + "t": "source.js.jsx meta.function-call.js.jsx entity.name.function.js.jsx", "r": { "dark_plus": "entity.name.function: #DCDCAA", "light_plus": "entity.name.function: #795E26", @@ -2135,7 +2135,7 @@ }, { "c": "(", - "t": "source.js meta.brace.round.js", + "t": "source.js.jsx meta.brace.round.js.jsx", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -2146,7 +2146,7 @@ }, { "c": "<", - "t": "source.js meta.tag.js punctuation.definition.tag.begin.js", + "t": "source.js.jsx meta.tag.js.jsx punctuation.definition.tag.begin.js.jsx", "r": { "dark_plus": "punctuation.definition.tag: #808080", "light_plus": "punctuation.definition.tag: #800000", @@ -2157,7 +2157,7 @@ }, { "c": "ToggleText", - "t": "source.js meta.tag.js entity.name.tag.js support.class.component.js", + "t": "source.js.jsx meta.tag.js.jsx entity.name.tag.js.jsx support.class.component.js.jsx", "r": { "dark_plus": "support.class: #4EC9B0", "light_plus": "support.class: #267F99", @@ -2168,7 +2168,7 @@ }, { "c": " ", - "t": "source.js meta.tag.js", + "t": "source.js.jsx meta.tag.js.jsx", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -2179,7 +2179,7 @@ }, { "c": "default", - "t": "source.js meta.tag.js entity.other.attribute-name.js", + "t": "source.js.jsx meta.tag.js.jsx entity.other.attribute-name.js.jsx", "r": { "dark_plus": "entity.other.attribute-name: #9CDCFE", "light_plus": "entity.other.attribute-name: #FF0000", @@ -2190,7 +2190,7 @@ }, { "c": "=", - "t": "source.js meta.tag.js keyword.operator.assignment.js", + "t": "source.js.jsx meta.tag.js.jsx keyword.operator.assignment.js.jsx", "r": { "dark_plus": "keyword.operator: #D4D4D4", "light_plus": "keyword.operator: #000000", @@ -2201,7 +2201,7 @@ }, { "c": "\"", - "t": "source.js meta.tag.js string.quoted.double.js punctuation.definition.string.begin.js", + "t": "source.js.jsx meta.tag.js.jsx string.quoted.double.js.jsx punctuation.definition.string.begin.js.jsx", "r": { "dark_plus": "string: #CE9178", "light_plus": "string: #A31515", @@ -2212,7 +2212,7 @@ }, { "c": "World", - "t": "source.js meta.tag.js string.quoted.double.js", + "t": "source.js.jsx meta.tag.js.jsx string.quoted.double.js.jsx", "r": { "dark_plus": "string: #CE9178", "light_plus": "string: #A31515", @@ -2223,7 +2223,7 @@ }, { "c": "\"", - "t": "source.js meta.tag.js string.quoted.double.js punctuation.definition.string.end.js", + "t": "source.js.jsx meta.tag.js.jsx string.quoted.double.js.jsx punctuation.definition.string.end.js.jsx", "r": { "dark_plus": "string: #CE9178", "light_plus": "string: #A31515", @@ -2234,7 +2234,7 @@ }, { "c": " ", - "t": "source.js meta.tag.js", + "t": "source.js.jsx meta.tag.js.jsx", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -2245,7 +2245,7 @@ }, { "c": "alt", - "t": "source.js meta.tag.js entity.other.attribute-name.js", + "t": "source.js.jsx meta.tag.js.jsx entity.other.attribute-name.js.jsx", "r": { "dark_plus": "entity.other.attribute-name: #9CDCFE", "light_plus": "entity.other.attribute-name: #FF0000", @@ -2256,7 +2256,7 @@ }, { "c": "=", - "t": "source.js meta.tag.js keyword.operator.assignment.js", + "t": "source.js.jsx meta.tag.js.jsx keyword.operator.assignment.js.jsx", "r": { "dark_plus": "keyword.operator: #D4D4D4", "light_plus": "keyword.operator: #000000", @@ -2267,7 +2267,7 @@ }, { "c": "\"", - "t": "source.js meta.tag.js string.quoted.double.js punctuation.definition.string.begin.js", + "t": "source.js.jsx meta.tag.js.jsx string.quoted.double.js.jsx punctuation.definition.string.begin.js.jsx", "r": { "dark_plus": "string: #CE9178", "light_plus": "string: #A31515", @@ -2278,7 +2278,7 @@ }, { "c": "Mars", - "t": "source.js meta.tag.js string.quoted.double.js", + "t": "source.js.jsx meta.tag.js.jsx string.quoted.double.js.jsx", "r": { "dark_plus": "string: #CE9178", "light_plus": "string: #A31515", @@ -2289,7 +2289,7 @@ }, { "c": "\"", - "t": "source.js meta.tag.js string.quoted.double.js punctuation.definition.string.end.js", + "t": "source.js.jsx meta.tag.js.jsx string.quoted.double.js.jsx punctuation.definition.string.end.js.jsx", "r": { "dark_plus": "string: #CE9178", "light_plus": "string: #A31515", @@ -2300,7 +2300,7 @@ }, { "c": " ", - "t": "source.js meta.tag.js", + "t": "source.js.jsx meta.tag.js.jsx", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -2311,7 +2311,7 @@ }, { "c": "/>", - "t": "source.js meta.tag.js punctuation.definition.tag.end.js", + "t": "source.js.jsx meta.tag.js.jsx punctuation.definition.tag.end.js.jsx", "r": { "dark_plus": "punctuation.definition.tag: #808080", "light_plus": "punctuation.definition.tag: #800000", @@ -2322,7 +2322,7 @@ }, { "c": ",", - "t": "source.js punctuation.separator.comma.js", + "t": "source.js.jsx punctuation.separator.comma.js.jsx", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -2333,7 +2333,7 @@ }, { "c": " ", - "t": "source.js", + "t": "source.js.jsx", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -2344,7 +2344,7 @@ }, { "c": "document", - "t": "source.js support.variable.dom.js", + "t": "source.js.jsx support.variable.dom.js.jsx", "r": { "dark_plus": "support.variable: #9CDCFE", "light_plus": "support.variable: #001080", @@ -2355,7 +2355,7 @@ }, { "c": ".", - "t": "source.js punctuation.accessor.js", + "t": "source.js.jsx punctuation.accessor.js.jsx", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -2366,7 +2366,7 @@ }, { "c": "body", - "t": "source.js support.variable.property.dom.js", + "t": "source.js.jsx support.variable.property.dom.js.jsx", "r": { "dark_plus": "support.variable: #9CDCFE", "light_plus": "support.variable: #001080", @@ -2377,7 +2377,7 @@ }, { "c": ")", - "t": "source.js meta.brace.round.js", + "t": "source.js.jsx meta.brace.round.js.jsx", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -2388,7 +2388,7 @@ }, { "c": ";", - "t": "source.js punctuation.terminator.statement.js", + "t": "source.js.jsx punctuation.terminator.statement.js.jsx", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", diff --git a/extensions/typescript/build/update-grammars.js b/extensions/typescript/build/update-grammars.js index c38d6f10510..e82549b4eef 100644 --- a/extensions/typescript/build/update-grammars.js +++ b/extensions/typescript/build/update-grammars.js @@ -6,14 +6,14 @@ var updateGrammar = require('../../../build/npm/update-grammar'); -function adaptToJavaScript(grammar) { +function adaptToJavaScript(grammar, replacementScope) { grammar.name = 'JavaScript (with React support)'; grammar.fileTypes = ['.js', '.jsx', '.es6', '.mjs' ]; - grammar.scopeName = 'source.js'; + grammar.scopeName = `source${replacementScope}`; var fixScopeNames = function(rule) { if (typeof rule.name === 'string') { - rule.name = rule.name.replace(/\.tsx/g, '.js'); + rule.name = rule.name.replace(/\.tsx/g, replacementScope); } for (var property in rule) { var value = rule[property]; @@ -32,7 +32,9 @@ function adaptToJavaScript(grammar) { var tsGrammarRepo = 'Microsoft/TypeScript-TmLanguage'; updateGrammar.update(tsGrammarRepo, 'TypeScript.tmLanguage', './syntaxes/TypeScript.tmLanguage.json'); updateGrammar.update(tsGrammarRepo, 'TypeScriptReact.tmLanguage', './syntaxes/TypeScriptReact.tmLanguage.json'); -updateGrammar.update(tsGrammarRepo, 'TypeScriptReact.tmLanguage', '../javascript/syntaxes/JavaScript.tmLanguage.json', adaptToJavaScript); +updateGrammar.update(tsGrammarRepo, 'TypeScriptReact.tmLanguage', '../javascript/syntaxes/JavaScript.tmLanguage.json', grammar => adaptToJavaScript(grammar, '.js')); +updateGrammar.update(tsGrammarRepo, 'TypeScriptReact.tmLanguage', '../javascript/syntaxes/JavaScriptReact.tmLanguage.json', grammar => adaptToJavaScript(grammar, '.js.jsx')); + diff --git a/extensions/typescript/syntaxes/TypeScript.tmLanguage.json b/extensions/typescript/syntaxes/TypeScript.tmLanguage.json index 28b955a0742..ba5c664ccf4 100644 --- a/extensions/typescript/syntaxes/TypeScript.tmLanguage.json +++ b/extensions/typescript/syntaxes/TypeScript.tmLanguage.json @@ -4,7 +4,7 @@ "If you want to provide a fix or improvement, please create a pull request against the original repository.", "Once accepted there, we are happy to receive an update request." ], - "version": "https://github.com/Microsoft/TypeScript-TmLanguage/commit/cd202a57fd738d6d2c712c2ed63f5f41a11eb558", + "version": "https://github.com/Microsoft/TypeScript-TmLanguage/commit/5955a5aed3d8d2862c614f2137d22f2334d490e9", "name": "TypeScript", "scopeName": "source.ts", "fileTypes": [ @@ -3363,7 +3363,7 @@ "name": "punctuation.definition.group.regexp" }, "1": { - "name": "punctuation.definition.group.capture.regexp" + "name": "punctuation.definition.group.no-capture.regexp" } }, "end": "\\)", diff --git a/extensions/typescript/syntaxes/TypeScriptReact.tmLanguage.json b/extensions/typescript/syntaxes/TypeScriptReact.tmLanguage.json index 52273319c2e..8266fec39bb 100644 --- a/extensions/typescript/syntaxes/TypeScriptReact.tmLanguage.json +++ b/extensions/typescript/syntaxes/TypeScriptReact.tmLanguage.json @@ -4,7 +4,7 @@ "If you want to provide a fix or improvement, please create a pull request against the original repository.", "Once accepted there, we are happy to receive an update request." ], - "version": "https://github.com/Microsoft/TypeScript-TmLanguage/commit/d6ee336bf6047594768a56f955563ba5ce86e7c9", + "version": "https://github.com/Microsoft/TypeScript-TmLanguage/commit/5955a5aed3d8d2862c614f2137d22f2334d490e9", "name": "TypeScriptReact", "scopeName": "source.tsx", "fileTypes": [ @@ -3329,7 +3329,7 @@ "name": "punctuation.definition.group.regexp" }, "1": { - "name": "punctuation.definition.group.capture.regexp" + "name": "punctuation.definition.group.no-capture.regexp" } }, "end": "\\)", From 00dbc4541cb07f33c32a2c55a1fd76a3831e375e Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Tue, 10 Oct 2017 18:05:14 -0700 Subject: [PATCH 152/158] Autoshow intellisense for import with no side effects Fixes #35691 --- extensions/typescript/src/features/completionItemProvider.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/typescript/src/features/completionItemProvider.ts b/extensions/typescript/src/features/completionItemProvider.ts index 1d7b35cd4e2..77fe1015a32 100644 --- a/extensions/typescript/src/features/completionItemProvider.ts +++ b/extensions/typescript/src/features/completionItemProvider.ts @@ -177,7 +177,7 @@ export default class TypeScriptCompletionItemProvider implements CompletionItemP if (context.triggerCharacter === '"' || context.triggerCharacter === '\'') { // make sure we are in something that looks like the start of an import const line = document.lineAt(position.line).text.slice(0, position.character); - if (!line.match(/\bfrom\s*["']$/) && !line.match(/\b(import|require)\(['"]$/)) { + if (!line.match(/\b(from|import)\s*["']$/) && !line.match(/\b(import|require)\(['"]$/)) { return Promise.resolve([]); } } From a627a95c4d78684e3285107c428b9cd2a151761d Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Tue, 10 Oct 2017 18:13:47 -0700 Subject: [PATCH 153/158] Use consistent style for inline code in hover/suggest/parameter hints Fixes #35813 --- src/vs/editor/contrib/hover/browser/hover.ts | 1 - .../contrib/parameterHints/browser/parameterHints.css | 5 +++++ .../contrib/parameterHints/browser/parameterHintsWidget.ts | 7 ++++++- src/vs/editor/contrib/suggest/browser/media/suggest.css | 4 ++++ src/vs/editor/contrib/suggest/browser/suggestWidget.ts | 7 ++++++- 5 files changed, 21 insertions(+), 3 deletions(-) diff --git a/src/vs/editor/contrib/hover/browser/hover.ts b/src/vs/editor/contrib/hover/browser/hover.ts index c973826bfa7..179eb9d2973 100644 --- a/src/vs/editor/contrib/hover/browser/hover.ts +++ b/src/vs/editor/contrib/hover/browser/hover.ts @@ -219,5 +219,4 @@ registerThemingParticipant((theme, collector) => { if (codeBackground) { collector.addRule(`.monaco-editor .monaco-editor-hover code { background-color: ${codeBackground}; }`); } - }); diff --git a/src/vs/editor/contrib/parameterHints/browser/parameterHints.css b/src/vs/editor/contrib/parameterHints/browser/parameterHints.css index 812bff41e87..2f89fb1658c 100644 --- a/src/vs/editor/contrib/parameterHints/browser/parameterHints.css +++ b/src/vs/editor/contrib/parameterHints/browser/parameterHints.css @@ -56,6 +56,11 @@ white-space: pre-wrap; } +.monaco-editor .parameter-hints-widget .docs code { + border-radius: 3px; + padding: 0 0.4em; +} + .monaco-editor .parameter-hints-widget .buttons { position: absolute; display: none; diff --git a/src/vs/editor/contrib/parameterHints/browser/parameterHintsWidget.ts b/src/vs/editor/contrib/parameterHints/browser/parameterHintsWidget.ts index fd7fe899f0d..2d022f949a3 100644 --- a/src/vs/editor/contrib/parameterHints/browser/parameterHintsWidget.ts +++ b/src/vs/editor/contrib/parameterHints/browser/parameterHintsWidget.ts @@ -25,7 +25,7 @@ import { CharacterSet } from 'vs/editor/common/core/characterClassifier'; import { IConfigurationChangedEvent } from 'vs/editor/common/config/editorOptions'; import { ICursorSelectionChangedEvent } from 'vs/editor/common/controller/cursorEvents'; import { registerThemingParticipant, HIGH_CONTRAST } from 'vs/platform/theme/common/themeService'; -import { editorHoverBackground, editorHoverBorder, textLinkForeground } from 'vs/platform/theme/common/colorRegistry'; +import { editorHoverBackground, editorHoverBorder, textLinkForeground, textCodeBlockBackground } from 'vs/platform/theme/common/colorRegistry'; import { IOpenerService } from 'vs/platform/opener/common/opener'; import { IModeService } from 'vs/editor/common/services/modeService'; import { MarkdownRenderer } from 'vs/editor/contrib/markdown/browser/markdownRenderer'; @@ -511,4 +511,9 @@ registerThemingParticipant((theme, collector) => { if (link) { collector.addRule(`.monaco-editor .parameter-hints-widget a { color: ${link}; }`); } + + let codeBackground = theme.getColor(textCodeBlockBackground); + if (codeBackground) { + collector.addRule(`.monaco-editor .parameter-hints-widget code { background-color: ${codeBackground}; }`); + } }); diff --git a/src/vs/editor/contrib/suggest/browser/media/suggest.css b/src/vs/editor/contrib/suggest/browser/media/suggest.css index 2cd4a1b4896..f51c70d511a 100644 --- a/src/vs/editor/contrib/suggest/browser/media/suggest.css +++ b/src/vs/editor/contrib/suggest/browser/media/suggest.css @@ -244,6 +244,10 @@ display: none; } +.monaco-editor .suggest-widget .details code { + border-radius: 3px; + padding: 0 0.4em; +} /* High Contrast and Dark Theming */ diff --git a/src/vs/editor/contrib/suggest/browser/suggestWidget.ts b/src/vs/editor/contrib/suggest/browser/suggestWidget.ts index ebd0216c50a..f7a076a2780 100644 --- a/src/vs/editor/contrib/suggest/browser/suggestWidget.ts +++ b/src/vs/editor/contrib/suggest/browser/suggestWidget.ts @@ -28,7 +28,7 @@ import { alert } from 'vs/base/browser/ui/aria/aria'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { attachListStyler } from 'vs/platform/theme/common/styler'; import { IThemeService, ITheme, registerThemingParticipant } from 'vs/platform/theme/common/themeService'; -import { registerColor, editorWidgetBackground, listFocusBackground, activeContrastBorder, listHighlightForeground, editorForeground, editorWidgetBorder, focusBorder, textLinkForeground } from 'vs/platform/theme/common/colorRegistry'; +import { registerColor, editorWidgetBackground, listFocusBackground, activeContrastBorder, listHighlightForeground, editorForeground, editorWidgetBorder, focusBorder, textLinkForeground, textCodeBlockBackground } from 'vs/platform/theme/common/colorRegistry'; import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage'; import { MarkdownRenderer } from 'vs/editor/contrib/markdown/browser/markdownRenderer'; import { IModeService } from 'vs/editor/common/services/modeService'; @@ -1117,4 +1117,9 @@ registerThemingParticipant((theme, collector) => { if (link) { collector.addRule(`.monaco-editor .suggest-widget a { color: ${link}; }`); } + + let codeBackground = theme.getColor(textCodeBlockBackground); + if (codeBackground) { + collector.addRule(`.monaco-editor .suggest-widget code { background-color: ${codeBackground}; }`); + } }); From 3ffa14e5ed86b3489f86d9f8d966ae3076f94a61 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Tue, 10 Oct 2017 21:24:19 -0700 Subject: [PATCH 154/158] Revert "Only set LANG env var in term if setLocaleVariables is true" This reverts commit a91bad463a4a90409fd6012e4e31a63364cca44b. --- .../parts/terminal/electron-browser/terminalInstance.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts b/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts index e00375c131d..4ba392d7be8 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts +++ b/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts @@ -780,9 +780,7 @@ export class TerminalInstance implements ITerminalInstance { } } env['PTYCWD'] = cwd; - if (locale) { - env['LANG'] = TerminalInstance._getLangEnvVariable(locale); - } + env['LANG'] = TerminalInstance._getLangEnvVariable(locale); if (cols && rows) { env['PTYCOLS'] = cols.toString(); env['PTYROWS'] = rows.toString(); From 2b99699e36b81dfd2d1c3c00c502483ff5aef44b Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Tue, 10 Oct 2017 22:29:45 -0700 Subject: [PATCH 155/158] Fix blurry terminal fonts particularly on low dpi screens Fixes #35991 --- npm-shrinkwrap.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index 17ee6622a1e..db4d423bbcd 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -574,7 +574,7 @@ "xterm": { "version": "2.9.1", "from": "Tyriar/xterm.js#vscode-release/1.18", - "resolved": "git+https://github.com/Tyriar/xterm.js.git#b49fe4a329ca792e1eb59d647042e0460e860b4d" + "resolved": "git+https://github.com/Tyriar/xterm.js.git#24fff1743b18ac7291e43c0ba547c7e2681efe65" }, "yauzl": { "version": "2.8.0", From 4cfb2487331b643f13d2409340e9ed9695a68f8c Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 11 Oct 2017 09:30:07 +0200 Subject: [PATCH 156/158] fixes #36010 --- src/vs/workbench/api/node/extHost.api.impl.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/api/node/extHost.api.impl.ts b/src/vs/workbench/api/node/extHost.api.impl.ts index b5423526507..52629733171 100644 --- a/src/vs/workbench/api/node/extHost.api.impl.ts +++ b/src/vs/workbench/api/node/extHost.api.impl.ts @@ -346,9 +346,9 @@ export function createApiFactory( get state() { return extHostWindow.state; }, - onDidChangeWindowState: proposedApiFunction(extension, (listener, thisArg?, disposables?) => { + onDidChangeWindowState(listener, thisArg?, disposables?) { return extHostWindow.onDidChangeWindowState(listener, thisArg, disposables); - }), + }, showInformationMessage(message, first, ...rest) { return extHostMessageService.showMessage(extension, Severity.Info, message, first, rest); }, From 88a6e81055577e8e7cfc2a5957b0fa9f157b6b24 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Wed, 11 Oct 2017 09:53:32 +0200 Subject: [PATCH 157/158] remote - don't read another time when encoding guessing already read the while file --- .../files/electron-browser/remoteFileService.ts | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/src/vs/workbench/services/files/electron-browser/remoteFileService.ts b/src/vs/workbench/services/files/electron-browser/remoteFileService.ts index 1b4f1bcd61d..676358b5598 100644 --- a/src/vs/workbench/services/files/electron-browser/remoteFileService.ts +++ b/src/vs/workbench/services/files/electron-browser/remoteFileService.ts @@ -283,12 +283,19 @@ export class RemoteFileService extends FileService { stream.write(chunk); offset += chunk.length; } - provider.read(resource, offset, Number.MAX_VALUE, new Progress(chunk => stream.write(chunk))).then(() => { + if (offset < count) { + // we didn't read enough the first time which means + // that we are done stream.end(); - }, err => { - stream.emit('error', err); - stream.end(); - }); + } else { + // there is more to read + provider.read(resource, offset, Number.MAX_VALUE, new Progress(chunk => stream.write(chunk))).then(() => { + stream.end(); + }, err => { + stream.emit('error', err); + stream.end(); + }); + } return { encoding: preferredEncoding, From e03163d9a8c330bba80a368af47ce9f0cddfc26c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?D=C3=A1niel=20Tar?= Date: Wed, 11 Oct 2017 10:02:55 +0200 Subject: [PATCH 158/158] Fix wrong placement of 'e.g.'s in the description of `window.title` setting (#35986) * Fix wrong placement of 'e.g.'s in the description of `window.title` setting * Fix the same error in configuration-editing --- .../configuration-editing/src/settingsDocumentHelper.ts | 6 +++--- src/vs/workbench/electron-browser/main.contribution.ts | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/extensions/configuration-editing/src/settingsDocumentHelper.ts b/extensions/configuration-editing/src/settingsDocumentHelper.ts index 86db16eb4f9..c0067652e9a 100644 --- a/extensions/configuration-editing/src/settingsDocumentHelper.ts +++ b/extensions/configuration-editing/src/settingsDocumentHelper.ts @@ -43,9 +43,9 @@ export class SettingsDocument { private provideWindowTitleCompletionItems(location: Location, range: vscode.Range): vscode.ProviderResult { const completions: vscode.CompletionItem[] = []; - completions.push(this.newSimpleCompletionItem('${activeEditorShort}', range, localize('activeEditorShort', "e.g. the file name (myFile.txt)"))); - completions.push(this.newSimpleCompletionItem('${activeEditorMedium}', range, localize('activeEditorMedium', "e.g. the path of the file relative to the workspace folder (myFolder/myFile.txt)"))); - completions.push(this.newSimpleCompletionItem('${activeEditorLong}', range, localize('activeEditorLong', "e.g. the full path of the file (/Users/Development/myProject/myFolder/myFile.txt)"))); + completions.push(this.newSimpleCompletionItem('${activeEditorShort}', range, localize('activeEditorShort', "the file name (e.g. myFile.txt)"))); + completions.push(this.newSimpleCompletionItem('${activeEditorMedium}', range, localize('activeEditorMedium', "the path of the file relative to the workspace folder (e.g. myFolder/myFile.txt)"))); + completions.push(this.newSimpleCompletionItem('${activeEditorLong}', range, localize('activeEditorLong', "the full path of the file (e.g. /Users/Development/myProject/myFolder/myFile.txt)"))); completions.push(this.newSimpleCompletionItem('${rootName}', range, localize('rootName', "name of the workspace (e.g. myFolder or myWorkspace)"))); completions.push(this.newSimpleCompletionItem('${rootPath}', range, localize('rootPath', "file path of the workspace (e.g. /Users/Development/myWorkspace)"))); completions.push(this.newSimpleCompletionItem('${folderName}', range, localize('folderName', "name of the workspace folder the file is contained in (e.g. myFolder)"))); diff --git a/src/vs/workbench/electron-browser/main.contribution.ts b/src/vs/workbench/electron-browser/main.contribution.ts index dc469437580..704135c3b57 100644 --- a/src/vs/workbench/electron-browser/main.contribution.ts +++ b/src/vs/workbench/electron-browser/main.contribution.ts @@ -322,9 +322,9 @@ Note that there can still be cases where this setting is ignored (e.g. when usin 'default': isMacintosh ? '${activeEditorShort}${separator}${rootName}' : '${dirty}${activeEditorShort}${separator}${rootName}${separator}${appName}', 'description': nls.localize({ comment: ['This is the description for a setting. Values surrounded by parenthesis are not to be translated.'], key: 'title' }, `Controls the window title based on the active editor. Variables are substituted based on the context: -\${activeEditorShort}: e.g. the file name (myFile.txt) -\${activeEditorMedium}: e.g. the path of the file relative to the workspace folder (myFolder/myFile.txt) -\${activeEditorLong}: e.g. the full path of the file (/Users/Development/myProject/myFolder/myFile.txt) +\${activeEditorShort}: the file name (e.g. myFile.txt) +\${activeEditorMedium}: the path of the file relative to the workspace folder (e.g. myFolder/myFile.txt) +\${activeEditorLong}: the full path of the file (e.g. /Users/Development/myProject/myFolder/myFile.txt) \${folderName}: name of the workspace folder the file is contained in (e.g. myFolder) \${folderPath}: file path of the workspace folder the file is contained in (e.g. /Users/Development/myFolder) \${rootName}: name of the workspace (e.g. myFolder or myWorkspace)