提交 18bd8798 编写于 作者: B Benjamin Pasero

navigate in editor groups

上级 bc8547c4
...@@ -416,9 +416,9 @@ export class QuickOpenWidget implements IModelProvider { ...@@ -416,9 +416,9 @@ export class QuickOpenWidget implements IModelProvider {
} }
} }
public show(prefix: string): void; public show(prefix: string, quickNavigateConfiguration?: IQuickNavigateConfiguration): void;
public show(input: IModel<any>, autoFocus?: IAutoFocus, quickNavigateConfiguration?: IQuickNavigateConfiguration): void; public show(input: IModel<any>, quickNavigateConfiguration?: IQuickNavigateConfiguration, autoFocus?: IAutoFocus): void;
public show(param: any, autoFocus?: IAutoFocus, quickNavigateConfiguration?: IQuickNavigateConfiguration): void { public show(param: any, quickNavigateConfiguration?: IQuickNavigateConfiguration, autoFocus?: IAutoFocus): void {
if (types.isUndefined(autoFocus)) { if (types.isUndefined(autoFocus)) {
autoFocus = {}; autoFocus = {};
} }
......
/*---------------------------------------------------------------------------------------------
* 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 {IWorkbenchActionRegistry, Extensions} from 'vs/workbench/common/actionRegistry';
import {Registry} from 'vs/platform/platform';
import {Action} from 'vs/base/common/actions';
import {TPromise} from 'vs/base/common/winjs.base';
import {KeybindingsRegistry} from 'vs/platform/keybinding/common/keybindingsRegistry';
import {IQuickOpenService} from 'vs/workbench/services/quickopen/common/quickOpenService';
import {KbExpr, IKeybindingService, IKeybindings} from 'vs/platform/keybinding/common/keybindingService';
import {SyncActionDescriptor} from 'vs/platform/actions/common/actions';
import {KeyMod, KeyCode} from 'vs/base/common/keyCodes';
// Trigger Quick Open
class GlobalQuickOpenAction extends Action {
public static ID = 'workbench.action.quickOpen';
public static LABEL = nls.localize('quickOpen', "Go to File...");
constructor(id: string, label: string, @IQuickOpenService private quickOpenService: IQuickOpenService) {
super(id, label);
this.order = 100; // Allow other actions to position before or after
this.class = 'quickopen';
}
public run(): TPromise<any> {
this.quickOpenService.show(null);
return TPromise.as(true);
}
}
// Open Previous Editor
class OpenPreviousEditorAction extends Action {
public static ID = 'workbench.action.openPreviousEditor';
public static LABEL = nls.localize('navigateEditorHistoryByInput', "Navigate History");
constructor(
id: string,
label: string,
@IQuickOpenService private quickOpenService: IQuickOpenService,
@IKeybindingService private keybindingService: IKeybindingService
) {
super(id, label);
}
public run(): TPromise<any> {
let keys = this.keybindingService.lookupKeybindings(this.id);
this.quickOpenService.show(null, {
keybindings: keys
});
return TPromise.as(true);
}
}
class BaseQuickOpenNavigateAction extends Action {
private navigateNext: boolean;
constructor(
id: string,
label: string,
navigateNext: boolean,
@IQuickOpenService private quickOpenService: IQuickOpenService,
@IKeybindingService private keybindingService: IKeybindingService
) {
super(id, label);
this.navigateNext = navigateNext;
}
public run(event?: any): TPromise<any> {
let keys = this.keybindingService.lookupKeybindings(this.id);
this.quickOpenService.quickNavigate({
keybindings: keys
}, this.navigateNext);
return TPromise.as(true);
}
}
class QuickOpenNavigateNextAction extends BaseQuickOpenNavigateAction {
public static ID = 'workbench.action.quickOpenNavigateNext';
public static LABEL = nls.localize('quickNavigateNext', "Navigate Next in Quick Open");
constructor(
id: string,
label: string,
@IQuickOpenService quickOpenService: IQuickOpenService,
@IKeybindingService keybindingService: IKeybindingService
) {
super(id, label, true, quickOpenService, keybindingService);
}
}
class QuickOpenNavigatePreviousAction extends BaseQuickOpenNavigateAction {
public static ID = 'workbench.action.quickOpenNavigatePrevious';
public static LABEL = nls.localize('quickNavigatePrevious', "Navigate Previous in Quick Open");
constructor(
id: string,
label: string,
@IQuickOpenService quickOpenService: IQuickOpenService,
@IKeybindingService keybindingService: IKeybindingService
) {
super(id, label, false, quickOpenService, keybindingService);
}
}
const quickOpenKb: IKeybindings = {
primary: KeyMod.CtrlCmd | KeyCode.KEY_P,
secondary: [KeyMod.CtrlCmd | KeyCode.KEY_E]
};
const QUICK_NAVIGATE_KEY = KeyCode.KEY_Q;
const prevEditorKb: IKeybindings = {
primary: KeyMod.CtrlCmd | QUICK_NAVIGATE_KEY,
secondary: [KeyMod.CtrlCmd | KeyMod.Shift | QUICK_NAVIGATE_KEY],
mac: {
primary: KeyMod.WinCtrl | QUICK_NAVIGATE_KEY,
secondary: [KeyMod.WinCtrl | KeyMod.Shift | QUICK_NAVIGATE_KEY]
}
};
function navigateKeybinding(shift: boolean): IKeybindings {
if (shift) {
return {
primary: KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.KEY_P,
secondary: [KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.KEY_E, KeyMod.CtrlCmd | KeyMod.Shift | QUICK_NAVIGATE_KEY],
mac: {
primary: KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.KEY_P,
secondary: [KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.KEY_E, KeyMod.WinCtrl | KeyMod.Shift | QUICK_NAVIGATE_KEY]
}
};
} else {
return {
primary: KeyMod.CtrlCmd | KeyCode.KEY_P,
secondary: [KeyMod.CtrlCmd | KeyCode.KEY_E, KeyMod.CtrlCmd | QUICK_NAVIGATE_KEY],
mac: {
primary: KeyMod.CtrlCmd | KeyCode.KEY_P,
secondary: [KeyMod.CtrlCmd | KeyCode.KEY_E, KeyMod.WinCtrl | QUICK_NAVIGATE_KEY]
}
};
}
}
// Contribute Quick Open
const registry = Registry.as<IWorkbenchActionRegistry>(Extensions.WorkbenchActions);
registry.registerWorkbenchAction(new SyncActionDescriptor(GlobalQuickOpenAction, GlobalQuickOpenAction.ID, GlobalQuickOpenAction.LABEL, quickOpenKb), 'Go to File...');
// Contribute Quick Navigate
registry.registerWorkbenchAction(new SyncActionDescriptor(OpenPreviousEditorAction, OpenPreviousEditorAction.ID, OpenPreviousEditorAction.LABEL, prevEditorKb), 'Navigate History');
// Contribute Quick Navigate in Quick Open
registry.registerWorkbenchAction(new SyncActionDescriptor(QuickOpenNavigateNextAction, QuickOpenNavigateNextAction.ID, QuickOpenNavigateNextAction.LABEL, navigateKeybinding(false), KbExpr.has('inQuickOpen')), 'Navigate Next in Quick Open');
registry.registerWorkbenchAction(new SyncActionDescriptor(QuickOpenNavigatePreviousAction, QuickOpenNavigatePreviousAction.ID, QuickOpenNavigatePreviousAction.LABEL, navigateKeybinding(true), KbExpr.has('inQuickOpen'), KeybindingsRegistry.WEIGHT.workbenchContrib(50)), 'Navigate Previous in Quick Open');
\ No newline at end of file
...@@ -9,7 +9,7 @@ import nls = require('vs/nls'); ...@@ -9,7 +9,7 @@ import nls = require('vs/nls');
import {TPromise} from 'vs/base/common/winjs.base'; import {TPromise} from 'vs/base/common/winjs.base';
import {Action, IAction} from 'vs/base/common/actions'; import {Action, IAction} from 'vs/base/common/actions';
import {IWorkspaceContextService} from 'vs/platform/workspace/common/workspace'; import {IWorkspaceContextService} from 'vs/platform/workspace/common/workspace';
import {IEditorQuickOpenEntry} from 'vs/workbench/browser/quickopen'; import {IEditorQuickOpenEntry, IQuickOpenRegistry, Extensions as QuickOpenExtensions, QuickOpenHandlerDescriptor} from 'vs/workbench/browser/quickopen';
import {StatusbarItemDescriptor, StatusbarAlignment, IStatusbarRegistry, Extensions as StatusExtensions} from 'vs/workbench/browser/parts/statusbar/statusbar'; import {StatusbarItemDescriptor, StatusbarAlignment, IStatusbarRegistry, Extensions as StatusExtensions} from 'vs/workbench/browser/parts/statusbar/statusbar';
import {EditorDescriptor, IEditorRegistry, Extensions as EditorExtensions, IEditorInputActionContext, IEditorInputAction, EditorInputActionContributor, EditorInputAction} from 'vs/workbench/browser/parts/editor/baseEditor'; import {EditorDescriptor, IEditorRegistry, Extensions as EditorExtensions, IEditorInputActionContext, IEditorInputAction, EditorInputActionContributor, EditorInputAction} from 'vs/workbench/browser/parts/editor/baseEditor';
import {StringEditorInput} from 'vs/workbench/common/editor/stringEditorInput'; import {StringEditorInput} from 'vs/workbench/common/editor/stringEditorInput';
...@@ -19,7 +19,7 @@ import {UntitledEditorInput} from 'vs/workbench/common/editor/untitledEditorInpu ...@@ -19,7 +19,7 @@ import {UntitledEditorInput} from 'vs/workbench/common/editor/untitledEditorInpu
import {ResourceEditorInput} from 'vs/workbench/common/editor/resourceEditorInput'; import {ResourceEditorInput} from 'vs/workbench/common/editor/resourceEditorInput';
import {IInstantiationService, ServicesAccessor} from 'vs/platform/instantiation/common/instantiation'; import {IInstantiationService, ServicesAccessor} from 'vs/platform/instantiation/common/instantiation';
import {KeybindingsRegistry} from 'vs/platform/keybinding/common/keybindingsRegistry'; import {KeybindingsRegistry} from 'vs/platform/keybinding/common/keybindingsRegistry';
import {KbExpr} from 'vs/platform/keybinding/common/keybindingService'; import {KbExpr, IKeybindings} from 'vs/platform/keybinding/common/keybindingService';
import {TextDiffEditor} from 'vs/workbench/browser/parts/editor/textDiffEditor'; import {TextDiffEditor} from 'vs/workbench/browser/parts/editor/textDiffEditor';
import {IWorkbenchEditorService} from 'vs/workbench/services/editor/common/editorService'; import {IWorkbenchEditorService} from 'vs/workbench/services/editor/common/editorService';
import {BinaryResourceDiffEditor} from 'vs/workbench/browser/parts/editor/binaryDiffEditor'; import {BinaryResourceDiffEditor} from 'vs/workbench/browser/parts/editor/binaryDiffEditor';
...@@ -33,8 +33,9 @@ import {SyncDescriptor} from 'vs/platform/instantiation/common/descriptors'; ...@@ -33,8 +33,9 @@ import {SyncDescriptor} from 'vs/platform/instantiation/common/descriptors';
import {KeyMod, KeyCode} from 'vs/base/common/keyCodes'; import {KeyMod, KeyCode} from 'vs/base/common/keyCodes';
import {EditorStacksModel} from 'vs/workbench/common/editor/editorStacksModel'; import {EditorStacksModel} from 'vs/workbench/common/editor/editorStacksModel';
import {CloseEditorsInGroupAction, CloseEditorsInOtherGroupsAction, CloseAllEditorsAction, MoveGroupLeftAction, MoveGroupRightAction, SplitEditorAction, PinEditorAction, UnpinEditorAction, CloseOtherEditorsInGroupAction, OpenToSideAction, import {CloseEditorsInGroupAction, CloseEditorsInOtherGroupsAction, CloseAllEditorsAction, MoveGroupLeftAction, MoveGroupRightAction, SplitEditorAction, PinEditorAction, UnpinEditorAction, CloseOtherEditorsInGroupAction, OpenToSideAction,
NavigateBetweenGroupsAction, FocusFirstGroupAction, FocusSecondGroupAction, FocusThirdGroupAction, EvenGroupWidthsAction, MaximizeGroupAction, MinimizeOtherGroupsAction, FocusPreviousGroup, FocusNextGroup, NavigateBetweenGroupsAction, FocusFirstGroupAction, FocusSecondGroupAction, FocusThirdGroupAction, EvenGroupWidthsAction, MaximizeGroupAction, MinimizeOtherGroupsAction, FocusPreviousGroup, FocusNextGroup, ShowEditorsInGroupAction,
toEditorQuickOpenEntry, CloseLeftEditorsInGroupAction, CloseRightEditorsInGroupAction, OpenNextEditor, OpenPreviousEditor, NavigateBackwardsAction, NavigateForwardAction, ReopenClosedEditorAction toEditorQuickOpenEntry, CloseLeftEditorsInGroupAction, CloseRightEditorsInGroupAction, OpenNextEditor, OpenPreviousEditor, NavigateBackwardsAction, NavigateForwardAction, ReopenClosedEditorAction, OpenPreviousEditorInGroupAction, NAVIGATE_IN_GROUP_PREFIX,
GlobalQuickOpenAction, OpenPreviousEditorAction, QuickOpenNavigateNextAction, QuickOpenNavigatePreviousAction
} from 'vs/workbench/browser/parts/editor/editorActions'; } from 'vs/workbench/browser/parts/editor/editorActions';
// Register String Editor // Register String Editor
...@@ -242,12 +243,62 @@ export class QuickOpenActionContributor extends ActionBarContributor { ...@@ -242,12 +243,62 @@ export class QuickOpenActionContributor extends ActionBarContributor {
} }
} }
// Contribute to Quick Open
actionBarRegistry.registerActionBarContributor(Scope.VIEWER, QuickOpenActionContributor); actionBarRegistry.registerActionBarContributor(Scope.VIEWER, QuickOpenActionContributor);
// Register quick open handler for navigating in editor group
Registry.as<IQuickOpenRegistry>(QuickOpenExtensions.Quickopen).registerQuickOpenHandler(
new QuickOpenHandlerDescriptor(
'vs/workbench/browser/parts/editor/editorGroupPicker',
'EditorGroupPicker',
NAVIGATE_IN_GROUP_PREFIX,
[
{
prefix: NAVIGATE_IN_GROUP_PREFIX,
needsEditor: false,
description: nls.localize('navigateInGroup', "Navigate in Editor Group")
}
]
)
);
const quickOpenKb: IKeybindings = {
primary: KeyMod.CtrlCmd | KeyCode.KEY_P,
secondary: [KeyMod.CtrlCmd | KeyCode.KEY_E]
};
function navigateKeybinding(shift: boolean): IKeybindings {
if (shift) {
return {
primary: KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.KEY_P,
secondary: [KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.KEY_E, KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.Tab],
mac: {
primary: KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.KEY_P,
secondary: [KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.KEY_E, KeyMod.WinCtrl | KeyMod.Shift | KeyCode.Tab]
}
};
} else {
return {
primary: KeyMod.CtrlCmd | KeyCode.KEY_P,
secondary: [KeyMod.CtrlCmd | KeyCode.KEY_E, KeyMod.CtrlCmd | KeyCode.Tab],
mac: {
primary: KeyMod.CtrlCmd | KeyCode.KEY_P,
secondary: [KeyMod.CtrlCmd | KeyCode.KEY_E, KeyMod.WinCtrl | KeyCode.Tab]
}
};
}
}
// Register Editor Actions // Register Editor Actions
const category = nls.localize('view', "View"); const category = nls.localize('view', "View");
registry.registerWorkbenchAction(new SyncActionDescriptor(OpenPreviousEditorInGroupAction, OpenPreviousEditorInGroupAction.ID, OpenPreviousEditorInGroupAction.LABEL, {
primary: KeyMod.CtrlCmd | KeyCode.Tab,
secondary: [KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.Tab],
mac: {
primary: KeyMod.WinCtrl | KeyCode.Tab,
secondary: [KeyMod.WinCtrl | KeyMod.Shift | KeyCode.Tab]
}
}), 'Open Previous in Editor Group');
registry.registerWorkbenchAction(new SyncActionDescriptor(ShowEditorsInGroupAction, ShowEditorsInGroupAction.ID, ShowEditorsInGroupAction.LABEL), 'View: Show Editors in Group', category);
registry.registerWorkbenchAction(new SyncActionDescriptor(OpenNextEditor, OpenNextEditor.ID, OpenNextEditor.LABEL, { registry.registerWorkbenchAction(new SyncActionDescriptor(OpenNextEditor, OpenNextEditor.ID, OpenNextEditor.LABEL, {
primary: KeyMod.CtrlCmd | KeyCode.PageDown, primary: KeyMod.CtrlCmd | KeyCode.PageDown,
mac: { primary: KeyMod.CtrlCmd | KeyMod.Alt | KeyCode.RightArrow } mac: { primary: KeyMod.CtrlCmd | KeyMod.Alt | KeyCode.RightArrow }
...@@ -292,4 +343,9 @@ registry.registerWorkbenchAction(new SyncActionDescriptor(NavigateBackwardsActio ...@@ -292,4 +343,9 @@ registry.registerWorkbenchAction(new SyncActionDescriptor(NavigateBackwardsActio
win: { primary: KeyMod.Alt | KeyCode.LeftArrow }, win: { primary: KeyMod.Alt | KeyCode.LeftArrow },
mac: { primary: KeyMod.WinCtrl | KeyCode.US_MINUS }, mac: { primary: KeyMod.WinCtrl | KeyCode.US_MINUS },
linux: { primary: KeyMod.CtrlCmd | KeyMod.Alt | KeyCode.US_MINUS } linux: { primary: KeyMod.CtrlCmd | KeyMod.Alt | KeyCode.US_MINUS }
}), 'Go Back'); }), 'Go Back');
\ No newline at end of file
registry.registerWorkbenchAction(new SyncActionDescriptor(GlobalQuickOpenAction, GlobalQuickOpenAction.ID, GlobalQuickOpenAction.LABEL, quickOpenKb), 'Go to File...');
registry.registerWorkbenchAction(new SyncActionDescriptor(OpenPreviousEditorAction, OpenPreviousEditorAction.ID, OpenPreviousEditorAction.LABEL), 'Navigate History');
registry.registerWorkbenchAction(new SyncActionDescriptor(QuickOpenNavigateNextAction, QuickOpenNavigateNextAction.ID, QuickOpenNavigateNextAction.LABEL, navigateKeybinding(false), KbExpr.has('inQuickOpen')), 'Navigate Next in Quick Open');
registry.registerWorkbenchAction(new SyncActionDescriptor(QuickOpenNavigatePreviousAction, QuickOpenNavigatePreviousAction.ID, QuickOpenNavigatePreviousAction.LABEL, navigateKeybinding(true), KbExpr.has('inQuickOpen'), KeybindingsRegistry.WEIGHT.workbenchContrib(50)), 'Navigate Previous in Quick Open');
\ No newline at end of file
...@@ -11,7 +11,7 @@ import {Action} from 'vs/base/common/actions'; ...@@ -11,7 +11,7 @@ import {Action} from 'vs/base/common/actions';
import {BaseEditor} from 'vs/workbench/browser/parts/editor/baseEditor'; import {BaseEditor} from 'vs/workbench/browser/parts/editor/baseEditor';
import {EditorInput, getUntitledOrFileResource, TextEditorOptions, EditorOptions} from 'vs/workbench/common/editor'; import {EditorInput, getUntitledOrFileResource, TextEditorOptions, EditorOptions} from 'vs/workbench/common/editor';
import {QuickOpenEntryGroup} from 'vs/base/parts/quickopen/browser/quickOpenModel'; import {QuickOpenEntryGroup} from 'vs/base/parts/quickopen/browser/quickOpenModel';
import {EditorQuickOpenEntry, EditorQuickOpenEntryGroup, IEditorQuickOpenEntry} from 'vs/workbench/browser/quickopen'; import {EditorQuickOpenEntry, EditorQuickOpenEntryGroup, IEditorQuickOpenEntry, QuickOpenAction} from 'vs/workbench/browser/quickopen';
import {IWorkbenchEditorService, GroupArrangement} from 'vs/workbench/services/editor/common/editorService'; import {IWorkbenchEditorService, GroupArrangement} from 'vs/workbench/services/editor/common/editorService';
import {IQuickOpenService} from 'vs/workbench/services/quickopen/common/quickOpenService'; import {IQuickOpenService} from 'vs/workbench/services/quickopen/common/quickOpenService';
import {IPartService} from 'vs/workbench/services/part/common/partService'; import {IPartService} from 'vs/workbench/services/part/common/partService';
...@@ -19,6 +19,7 @@ import {Position, IEditor, Direction} from 'vs/platform/editor/common/editor'; ...@@ -19,6 +19,7 @@ import {Position, IEditor, Direction} from 'vs/platform/editor/common/editor';
import {IInstantiationService} from 'vs/platform/instantiation/common/instantiation'; import {IInstantiationService} from 'vs/platform/instantiation/common/instantiation';
import {IEditorIdentifier} from 'vs/workbench/common/editor/editorStacksModel'; import {IEditorIdentifier} from 'vs/workbench/common/editor/editorStacksModel';
import {IHistoryService} from 'vs/workbench/services/history/common/history'; import {IHistoryService} from 'vs/workbench/services/history/common/history';
import {IKeybindingService} from 'vs/platform/keybinding/common/keybindingService';
export class SplitEditorAction extends Action { export class SplitEditorAction extends Action {
...@@ -838,4 +839,141 @@ export class ReopenClosedEditorAction extends Action { ...@@ -838,4 +839,141 @@ export class ReopenClosedEditorAction extends Action {
return TPromise.as(false); return TPromise.as(false);
} }
}
export const NAVIGATE_IN_GROUP_PREFIX = '~';
export class ShowEditorsInGroupAction extends QuickOpenAction {
public static ID = 'workbench.action.showEditorsInGroup';
public static LABEL = nls.localize('showEditorsInGroup', "Show Editors in Group");
constructor(actionId: string, actionLabel: string, @IQuickOpenService quickOpenService: IQuickOpenService) {
super(actionId, actionLabel, NAVIGATE_IN_GROUP_PREFIX, quickOpenService);
}
}
export class OpenPreviousEditorInGroupAction extends Action {
public static ID = 'workbench.action.openPreviousEditorInGroup';
public static LABEL = nls.localize('openPreviousEditorInGroup', "Open Previous in Editor Group");
constructor(
id: string,
label: string,
@IQuickOpenService private quickOpenService: IQuickOpenService,
@IKeybindingService private keybindingService: IKeybindingService
) {
super(id, label);
}
public run(): TPromise<any> {
let keys = this.keybindingService.lookupKeybindings(this.id);
this.quickOpenService.show(NAVIGATE_IN_GROUP_PREFIX, {
keybindings: keys
});
return TPromise.as(true);
}
}
export class GlobalQuickOpenAction extends Action {
public static ID = 'workbench.action.quickOpen';
public static LABEL = nls.localize('quickOpen', "Go to File...");
constructor(id: string, label: string, @IQuickOpenService private quickOpenService: IQuickOpenService) {
super(id, label);
this.order = 100; // Allow other actions to position before or after
this.class = 'quickopen';
}
public run(): TPromise<any> {
this.quickOpenService.show(null);
return TPromise.as(true);
}
}
export class OpenPreviousEditorAction extends Action {
public static ID = 'workbench.action.openPreviousEditor';
public static LABEL = nls.localize('navigateEditorHistoryByInput', "Navigate History");
constructor(
id: string,
label: string,
@IQuickOpenService private quickOpenService: IQuickOpenService,
@IKeybindingService private keybindingService: IKeybindingService
) {
super(id, label);
}
public run(): TPromise<any> {
let keys = this.keybindingService.lookupKeybindings(this.id);
this.quickOpenService.show(null, {
keybindings: keys
});
return TPromise.as(true);
}
}
export class BaseQuickOpenNavigateAction extends Action {
private navigateNext: boolean;
constructor(
id: string,
label: string,
navigateNext: boolean,
@IQuickOpenService private quickOpenService: IQuickOpenService,
@IKeybindingService private keybindingService: IKeybindingService
) {
super(id, label);
this.navigateNext = navigateNext;
}
public run(event?: any): TPromise<any> {
let keys = this.keybindingService.lookupKeybindings(this.id);
this.quickOpenService.quickNavigate({
keybindings: keys
}, this.navigateNext);
return TPromise.as(true);
}
}
export class QuickOpenNavigateNextAction extends BaseQuickOpenNavigateAction {
public static ID = 'workbench.action.quickOpenNavigateNext';
public static LABEL = nls.localize('quickNavigateNext', "Navigate Next in Quick Open");
constructor(
id: string,
label: string,
@IQuickOpenService quickOpenService: IQuickOpenService,
@IKeybindingService keybindingService: IKeybindingService
) {
super(id, label, true, quickOpenService, keybindingService);
}
}
export class QuickOpenNavigatePreviousAction extends BaseQuickOpenNavigateAction {
public static ID = 'workbench.action.quickOpenNavigatePrevious';
public static LABEL = nls.localize('quickNavigatePrevious', "Navigate Previous in Quick Open");
constructor(
id: string,
label: string,
@IQuickOpenService quickOpenService: IQuickOpenService,
@IKeybindingService keybindingService: IKeybindingService
) {
super(id, label, false, quickOpenService, keybindingService);
}
} }
\ No newline at end of file
...@@ -6,41 +6,33 @@ ...@@ -6,41 +6,33 @@
import {TPromise} from 'vs/base/common/winjs.base'; import {TPromise} from 'vs/base/common/winjs.base';
import nls = require('vs/nls'); import nls = require('vs/nls');
import paths = require('vs/base/common/paths');
import labels = require('vs/base/common/labels'); import labels = require('vs/base/common/labels');
import URI from 'vs/base/common/uri'; import URI from 'vs/base/common/uri';
import errors = require('vs/base/common/errors'); import errors = require('vs/base/common/errors');
import strings = require('vs/base/common/strings'); import strings = require('vs/base/common/strings');
import {IAutoFocus, Mode, IContext} from 'vs/base/parts/quickopen/common/quickOpen'; import {IAutoFocus, Mode, IContext} from 'vs/base/parts/quickopen/common/quickOpen';
import {QuickOpenModel, QuickOpenEntry, QuickOpenEntryGroup} from 'vs/base/parts/quickopen/browser/quickOpenModel'; import {QuickOpenModel, QuickOpenEntry, QuickOpenEntryGroup} from 'vs/base/parts/quickopen/browser/quickOpenModel';
import {WorkingFilesModel, WorkingFileEntry} from 'vs/workbench/parts/files/common/workingFilesModel';
import scorer = require('vs/base/common/scorer'); import scorer = require('vs/base/common/scorer');
import {QuickOpenHandler} from 'vs/workbench/browser/quickopen'; import {QuickOpenHandler} from 'vs/workbench/browser/quickopen';
import {ITextFileService} from 'vs/workbench/parts/files/common/files';
import {IWorkbenchEditorService} from 'vs/workbench/services/editor/common/editorService'; import {IWorkbenchEditorService} from 'vs/workbench/services/editor/common/editorService';
import {IInstantiationService} from 'vs/platform/instantiation/common/instantiation'; import {IInstantiationService} from 'vs/platform/instantiation/common/instantiation';
import {IWorkspaceContextService} from 'vs/platform/workspace/common/workspace'; import {IWorkspaceContextService} from 'vs/platform/workspace/common/workspace';
import {EditorInput, asFileEditorInput} from 'vs/workbench/common/editor';
export class WorkingFilePickerEntry extends QuickOpenEntryGroup { export class EditorGroupPickerEntry extends QuickOpenEntryGroup {
private name: string; private editor: EditorInput;
private description: string;
private workingFilesEntry: WorkingFileEntry;
constructor( constructor(
name: string, editor: EditorInput,
description: string,
entry: WorkingFileEntry,
@IWorkbenchEditorService private editorService: IWorkbenchEditorService @IWorkbenchEditorService private editorService: IWorkbenchEditorService
) { ) {
super(); super();
this.workingFilesEntry = entry; this.editor = editor;
this.name = name;
this.description = description;
} }
public getPrefix(): string { public getPrefix(): string {
if (this.workingFilesEntry.dirty) { if (this.editor.isDirty()) {
return '\u25cf '; // dirty decoration return '\u25cf '; // dirty decoration
} }
...@@ -48,23 +40,21 @@ export class WorkingFilePickerEntry extends QuickOpenEntryGroup { ...@@ -48,23 +40,21 @@ export class WorkingFilePickerEntry extends QuickOpenEntryGroup {
} }
public getLabel(): string { public getLabel(): string {
return this.name; return this.editor.getName();
} }
public getAriaLabel(): string { public getResource(): URI {
return nls.localize('entryAriaLabel', "{0}, working file picker", this.getLabel()); const fileInput = asFileEditorInput(this.editor, true);
}
public getDescription(): string { return fileInput && fileInput.getResource();
return this.description;
} }
public getResource(): URI { public getAriaLabel(): string {
return this.workingFilesEntry.resource; return nls.localize('entryAriaLabel', "{0}, editor group picker", this.getLabel());
} }
public getWorkingFilesEntry(): WorkingFileEntry { public getDescription(): string {
return this.workingFilesEntry; return this.editor.getDescription();
} }
public run(mode: Mode, context: IContext): boolean { public run(mode: Mode, context: IContext): boolean {
...@@ -76,22 +66,19 @@ export class WorkingFilePickerEntry extends QuickOpenEntryGroup { ...@@ -76,22 +66,19 @@ export class WorkingFilePickerEntry extends QuickOpenEntryGroup {
} }
private runOpen(context: IContext): boolean { private runOpen(context: IContext): boolean {
let event = context.event; this.editorService.openEditor(this.editor).done(null, errors.onUnexpectedError);
let sideBySide = (event && (event.ctrlKey || event.metaKey || (event.payload && event.payload.originalEvent && (event.payload.originalEvent.ctrlKey || event.payload.originalEvent.metaKey))));
this.editorService.openEditor({ resource: this.workingFilesEntry.resource }, sideBySide).done(null, errors.onUnexpectedError);
return true; return true;
} }
} }
export class WorkingFilesPicker extends QuickOpenHandler { export class EditorGroupPicker extends QuickOpenHandler {
private scorerCache: { [key: string]: number }; private scorerCache: { [key: string]: number };
constructor( constructor(
@IInstantiationService private instantiationService: IInstantiationService, @IInstantiationService private instantiationService: IInstantiationService,
@IWorkspaceContextService private contextService: IWorkspaceContextService, @IWorkspaceContextService private contextService: IWorkspaceContextService,
@ITextFileService private textFileService: ITextFileService @IWorkbenchEditorService private editorService: IWorkbenchEditorService
) { ) {
super(); super();
...@@ -99,22 +86,18 @@ export class WorkingFilesPicker extends QuickOpenHandler { ...@@ -99,22 +86,18 @@ export class WorkingFilesPicker extends QuickOpenHandler {
} }
public getResults(searchValue: string): TPromise<QuickOpenModel> { public getResults(searchValue: string): TPromise<QuickOpenModel> {
searchValue = searchValue.trim(); const stacks = this.editorService.getStacksModel();
if (!stacks.activeGroup) {
return TPromise.as(null);
}
searchValue = searchValue.trim();
const normalizedSearchValueLowercase = strings.stripWildcards(searchValue).toLowerCase(); const normalizedSearchValueLowercase = strings.stripWildcards(searchValue).toLowerCase();
return TPromise.as(new QuickOpenModel(this.textFileService.getWorkingFilesModel().getEntries() return TPromise.as(new QuickOpenModel(stacks.activeGroup.getEditors(true)
// Convert working files to quick open entries // Convert to quick open entries
.map(e => { .map(e => this.instantiationService.createInstance(EditorGroupPickerEntry, e))
let label = paths.basename(e.resource.fsPath);
let description = labels.getPathLabel(paths.dirname(e.resource.fsPath), this.contextService);
if (description === '.') {
description = null; // for untitled files
}
return this.instantiationService.createInstance(WorkingFilePickerEntry, label, description, e);
})
// Filter by search value // Filter by search value
.filter(e => { .filter(e => {
...@@ -122,7 +105,8 @@ export class WorkingFilesPicker extends QuickOpenHandler { ...@@ -122,7 +105,8 @@ export class WorkingFilesPicker extends QuickOpenHandler {
return true; return true;
} }
let targetToMatch = labels.getPathLabel(e.getResource(), this.contextService); let resource = e.getResource();
let targetToMatch = resource ? labels.getPathLabel(e.getResource(), this.contextService) : e.getLabel();
if (!scorer.matches(targetToMatch, normalizedSearchValueLowercase)) { if (!scorer.matches(targetToMatch, normalizedSearchValueLowercase)) {
return false; return false;
} }
...@@ -136,7 +120,7 @@ export class WorkingFilesPicker extends QuickOpenHandler { ...@@ -136,7 +120,7 @@ export class WorkingFilesPicker extends QuickOpenHandler {
// Sort by search value score or natural order if not searching // Sort by search value score or natural order if not searching
sort((e1, e2) => { sort((e1, e2) => {
if (!searchValue) { if (!searchValue) {
return WorkingFilesModel.compare(e1.getWorkingFilesEntry(), e2.getWorkingFilesEntry()); return 0;
} }
return QuickOpenEntry.compareByScore(e1, e2, searchValue, normalizedSearchValueLowercase, this.scorerCache); return QuickOpenEntry.compareByScore(e1, e2, searchValue, normalizedSearchValueLowercase, this.scorerCache);
...@@ -145,7 +129,7 @@ export class WorkingFilesPicker extends QuickOpenHandler { ...@@ -145,7 +129,7 @@ export class WorkingFilesPicker extends QuickOpenHandler {
// Apply group label // Apply group label
map((e, index) => { map((e, index) => {
if (index === 0) { if (index === 0) {
e.setGroupLabel(nls.localize('workingFilesGroupLabel', "working files")); e.setGroupLabel(nls.localize('groupLabel', "Group: {0}", stacks.activeGroup.label));
} }
return e; return e;
...@@ -154,10 +138,10 @@ export class WorkingFilesPicker extends QuickOpenHandler { ...@@ -154,10 +138,10 @@ export class WorkingFilesPicker extends QuickOpenHandler {
public getEmptyLabel(searchString: string): string { public getEmptyLabel(searchString: string): string {
if (searchString) { if (searchString) {
return nls.localize('noResultsFound', "No matching working files found"); return nls.localize('noResultsFound', "No matching opened editor found in group");
} }
return nls.localize('noWorkingFiles', "List of working files is currently empty"); return nls.localize('noOpenedEditors', "List of opened editors is currently empty");
} }
public getAutoFocus(searchValue: string): IAutoFocus { public getAutoFocus(searchValue: string): IAutoFocus {
...@@ -167,7 +151,15 @@ export class WorkingFilesPicker extends QuickOpenHandler { ...@@ -167,7 +151,15 @@ export class WorkingFilesPicker extends QuickOpenHandler {
}; };
} }
return super.getAutoFocus(searchValue); const stacks = this.editorService.getStacksModel();
if (!stacks.activeGroup) {
return super.getAutoFocus(searchValue);
}
return {
autoFocusFirstEntry: stacks.activeGroup.count === 1,
autoFocusSecondEntry: stacks.activeGroup.count > 1
};
} }
public onClose(canceled: boolean): void { public onClose(canceled: boolean): void {
......
...@@ -7,7 +7,6 @@ ...@@ -7,7 +7,6 @@
import 'vs/css!./media/sidebyside'; import 'vs/css!./media/sidebyside';
import nls = require('vs/nls'); import nls = require('vs/nls');
import {TPromise} from 'vs/base/common/winjs.base';
import {Registry} from 'vs/platform/platform'; import {Registry} from 'vs/platform/platform';
import {Scope, IActionBarRegistry, Extensions, prepareActions} from 'vs/workbench/browser/actionBarRegistry'; import {Scope, IActionBarRegistry, Extensions, prepareActions} from 'vs/workbench/browser/actionBarRegistry';
import {IAction, Action} from 'vs/base/common/actions'; import {IAction, Action} from 'vs/base/common/actions';
...@@ -34,7 +33,7 @@ import {IMessageService, Severity} from 'vs/platform/message/common/message'; ...@@ -34,7 +33,7 @@ import {IMessageService, Severity} from 'vs/platform/message/common/message';
import {ITelemetryService} from 'vs/platform/telemetry/common/telemetry'; import {ITelemetryService} from 'vs/platform/telemetry/common/telemetry';
import {IInstantiationService} from 'vs/platform/instantiation/common/instantiation'; import {IInstantiationService} from 'vs/platform/instantiation/common/instantiation';
import {IKeybindingService} from 'vs/platform/keybinding/common/keybindingService'; import {IKeybindingService} from 'vs/platform/keybinding/common/keybindingService';
import {CloseEditorsInGroupAction, CloseEditorsInOtherGroupsAction, CloseAllEditorsAction, MoveGroupLeftAction, MoveGroupRightAction, SplitEditorAction, CloseEditorAction} from 'vs/workbench/browser/parts/editor/editorActions'; import {ShowEditorsInGroupAction, CloseEditorsInGroupAction, CloseEditorsInOtherGroupsAction, CloseAllEditorsAction, MoveGroupLeftAction, MoveGroupRightAction, SplitEditorAction, CloseEditorAction} from 'vs/workbench/browser/parts/editor/editorActions';
export enum Rochade { export enum Rochade {
NONE, NONE,
...@@ -96,28 +95,6 @@ export interface ISideBySideEditorControl { ...@@ -96,28 +95,6 @@ export interface ISideBySideEditorControl {
dispose(): void; dispose(): void;
} }
class ShowGroupEditors extends Action {
public static ID = 'workbench.action.showGroupEditors';
public static LABEL = nls.localize('showGroupEditors', "Show Editors in Group");
constructor(id: string, label: string, @IWorkbenchEditorService private editorService: IWorkbenchEditorService) {
super(id, label, 'show-editors-action');
}
public setOverflowing(isOverflowing: boolean): void {
if (isOverflowing) {
this.class = 'show-group-editors-overflowing-action';
} else {
this.class = 'show-group-editors-action';
}
}
public run(position: Position): TPromise<any> {
return TPromise.as(false); // TODO@Ben
}
}
/** /**
* Helper class to manage multiple side by side editors for the editor part. * Helper class to manage multiple side by side editors for the editor part.
*/ */
...@@ -147,7 +124,7 @@ export class SideBySideEditorControl implements ISideBySideEditorControl, IVerti ...@@ -147,7 +124,7 @@ export class SideBySideEditorControl implements ISideBySideEditorControl, IVerti
private mapActionsToEditors: { [editorId: string]: IEditorActions; }[]; private mapActionsToEditors: { [editorId: string]: IEditorActions; }[];
private closeEditorActions: CloseEditorAction[]; private closeEditorActions: CloseEditorAction[];
private showEditorsOfGroup: ShowGroupEditors[]; private showEditorsOfGroup: ShowEditorsInGroupAction[];
private moveGroupLeftActions: MoveGroupLeftAction[]; private moveGroupLeftActions: MoveGroupLeftAction[];
private moveGroupRightActions: MoveGroupRightAction[]; private moveGroupRightActions: MoveGroupRightAction[];
private closeEditorsInGroupActions: CloseEditorsInGroupAction[]; private closeEditorsInGroupActions: CloseEditorsInGroupAction[];
...@@ -216,7 +193,7 @@ export class SideBySideEditorControl implements ISideBySideEditorControl, IVerti ...@@ -216,7 +193,7 @@ export class SideBySideEditorControl implements ISideBySideEditorControl, IVerti
this.closeEditorActions = POSITIONS.map((position) => this.instantiationService.createInstance(CloseEditorAction, CloseEditorAction.ID, CloseEditorAction.LABEL)); this.closeEditorActions = POSITIONS.map((position) => this.instantiationService.createInstance(CloseEditorAction, CloseEditorAction.ID, CloseEditorAction.LABEL));
// Show Editors // Show Editors
this.showEditorsOfGroup = POSITIONS.map((position) => this.instantiationService.createInstance(ShowGroupEditors, ShowGroupEditors.ID, ShowGroupEditors.LABEL)); this.showEditorsOfGroup = POSITIONS.map((position) => this.instantiationService.createInstance(ShowEditorsInGroupAction, ShowEditorsInGroupAction.ID, ShowEditorsInGroupAction.LABEL));
// Split // Split
this.splitEditorAction = this.instantiationService.createInstance(SplitEditorAction, SplitEditorAction.ID, SplitEditorAction.LABEL); this.splitEditorAction = this.instantiationService.createInstance(SplitEditorAction, SplitEditorAction.ID, SplitEditorAction.LABEL);
...@@ -1330,7 +1307,11 @@ export class SideBySideEditorControl implements ISideBySideEditorControl, IVerti ...@@ -1330,7 +1307,11 @@ export class SideBySideEditorControl implements ISideBySideEditorControl, IVerti
} }
const showEditorAction = this.showEditorsOfGroup[position]; const showEditorAction = this.showEditorsOfGroup[position];
showEditorAction.setOverflowing(isOverflowing); if (isOverflowing) {
showEditorAction.class = 'show-group-editors-overflowing-action';
} else {
showEditorAction.class = 'show-group-editors-action';
}
primaryActions.unshift(this.showEditorsOfGroup[position]); primaryActions.unshift(this.showEditorsOfGroup[position]);
// Secondary Actions // Secondary Actions
......
...@@ -431,7 +431,7 @@ export class QuickOpenController extends WorkbenchComponent implements IQuickOpe ...@@ -431,7 +431,7 @@ export class QuickOpenController extends WorkbenchComponent implements IQuickOpe
// Set input // Set input
if (!this.pickOpenWidget.isVisible()) { if (!this.pickOpenWidget.isVisible()) {
this.pickOpenWidget.show(model, autoFocus); this.pickOpenWidget.show(model, void 0, autoFocus);
} else { } else {
this.pickOpenWidget.setInput(model, autoFocus); this.pickOpenWidget.setInput(model, autoFocus);
} }
...@@ -544,7 +544,7 @@ export class QuickOpenController extends WorkbenchComponent implements IQuickOpe ...@@ -544,7 +544,7 @@ export class QuickOpenController extends WorkbenchComponent implements IQuickOpe
// Show quick open with prefix or editor history // Show quick open with prefix or editor history
if (!this.quickOpenWidget.isVisible() || quickNavigateConfiguration) { if (!this.quickOpenWidget.isVisible() || quickNavigateConfiguration) {
if (prefix) { if (prefix) {
this.quickOpenWidget.show(prefix); this.quickOpenWidget.show(prefix, quickNavigateConfiguration);
} else { } else {
let editorHistory = this.getEditorHistoryModelWithGroupLabel(); let editorHistory = this.getEditorHistoryModelWithGroupLabel();
if (editorHistory.getEntries().length < 2) { if (editorHistory.getEntries().length < 2) {
...@@ -559,7 +559,7 @@ export class QuickOpenController extends WorkbenchComponent implements IQuickOpe ...@@ -559,7 +559,7 @@ export class QuickOpenController extends WorkbenchComponent implements IQuickOpe
autoFocus = { autoFocusFirstEntry: visibleEditorCount === 0, autoFocusSecondEntry: visibleEditorCount !== 0 }; autoFocus = { autoFocusFirstEntry: visibleEditorCount === 0, autoFocusSecondEntry: visibleEditorCount !== 0 };
} }
this.quickOpenWidget.show(editorHistory, autoFocus, quickNavigateConfiguration); this.quickOpenWidget.show(editorHistory, quickNavigateConfiguration, autoFocus);
} }
} }
......
...@@ -12,13 +12,11 @@ import {ViewletRegistry, Extensions as ViewletExtensions, ViewletDescriptor, Tog ...@@ -12,13 +12,11 @@ import {ViewletRegistry, Extensions as ViewletExtensions, ViewletDescriptor, Tog
import nls = require('vs/nls'); import nls = require('vs/nls');
import {SyncActionDescriptor} from 'vs/platform/actions/common/actions'; import {SyncActionDescriptor} from 'vs/platform/actions/common/actions';
import {Registry} from 'vs/platform/platform'; import {Registry} from 'vs/platform/platform';
import {IQuickOpenService} from 'vs/workbench/services/quickopen/common/quickOpenService';
import {IConfigurationRegistry, Extensions as ConfigurationExtensions} from 'vs/platform/configuration/common/configurationRegistry'; import {IConfigurationRegistry, Extensions as ConfigurationExtensions} from 'vs/platform/configuration/common/configurationRegistry';
import {IWorkbenchActionRegistry, Extensions as ActionExtensions} from 'vs/workbench/common/actionRegistry'; import {IWorkbenchActionRegistry, Extensions as ActionExtensions} from 'vs/workbench/common/actionRegistry';
import {IWorkbenchContributionsRegistry, Extensions as WorkbenchExtensions} from 'vs/workbench/common/contributions'; import {IWorkbenchContributionsRegistry, Extensions as WorkbenchExtensions} from 'vs/workbench/common/contributions';
import {IEditorRegistry, Extensions as EditorExtensions, IEditorInputFactory} from 'vs/workbench/browser/parts/editor/baseEditor'; import {IEditorRegistry, Extensions as EditorExtensions, IEditorInputFactory} from 'vs/workbench/browser/parts/editor/baseEditor';
import {EditorInput, IFileEditorInput} from 'vs/workbench/common/editor'; import {EditorInput, IFileEditorInput} from 'vs/workbench/common/editor';
import {QuickOpenHandlerDescriptor, IQuickOpenRegistry, Extensions as QuickOpenExtensions, QuickOpenAction} from 'vs/workbench/browser/quickopen';
import {FileEditorDescriptor} from 'vs/workbench/parts/files/browser/files'; import {FileEditorDescriptor} from 'vs/workbench/parts/files/browser/files';
import {AutoSaveConfiguration, SUPPORTED_ENCODINGS} from 'vs/platform/files/common/files'; import {AutoSaveConfiguration, SUPPORTED_ENCODINGS} from 'vs/platform/files/common/files';
import {FILE_EDITOR_INPUT_ID, VIEWLET_ID} from 'vs/workbench/parts/files/common/files'; import {FILE_EDITOR_INPUT_ID, VIEWLET_ID} from 'vs/workbench/parts/files/common/files';
...@@ -256,37 +254,4 @@ configurationRegistry.registerConfiguration({ ...@@ -256,37 +254,4 @@ configurationRegistry.registerConfiguration({
'default': true 'default': true
} }
} }
}); });
\ No newline at end of file
// Register quick open handler for working files
const ALL_WORKING_FILES_PREFIX = '~';
class OpenWorkingFileByNameAction extends QuickOpenAction {
public static ID = 'workbench.files.action.workingFilesPicker';
public static LABEL = nls.localize('workingFilesPicker', "Open Working File by Name");
constructor(actionId: string, actionLabel: string, @IQuickOpenService quickOpenService: IQuickOpenService) {
super(actionId, actionLabel, ALL_WORKING_FILES_PREFIX, quickOpenService);
}
}
(<IQuickOpenRegistry>Registry.as(QuickOpenExtensions.Quickopen)).registerQuickOpenHandler(
new QuickOpenHandlerDescriptor(
'vs/workbench/parts/files/browser/workingFilesPicker',
'WorkingFilesPicker',
ALL_WORKING_FILES_PREFIX,
[
{
prefix: ALL_WORKING_FILES_PREFIX,
needsEditor: false,
description: nls.localize('openWorkingFile', "Open Working File By Name")
}
]
)
);
registry.registerWorkbenchAction(new SyncActionDescriptor(OpenWorkingFileByNameAction, OpenWorkingFileByNameAction.ID, OpenWorkingFileByNameAction.LABEL, {
primary: KeyMod.chord(KeyMod.CtrlCmd | KeyCode.KEY_K, KeyMod.CtrlCmd | KeyCode.KEY_P)
}), 'Files: Open Working File by Name', nls.localize('filesCategory', "Files"));
\ No newline at end of file
...@@ -26,14 +26,13 @@ define([ ...@@ -26,14 +26,13 @@ define([
// Workbench // Workbench
'vs/workbench/browser/actions/toggleSidebarVisibility', 'vs/workbench/browser/actions/toggleSidebarVisibility',
'vs/workbench/browser/actions/toggleSidebarPosition', 'vs/workbench/browser/actions/toggleSidebarPosition',
'vs/workbench/browser/actions/triggerQuickOpen',
'vs/workbench/browser/actions/openSettings', 'vs/workbench/browser/actions/openSettings',
'vs/workbench/browser/actions/configureLocale', 'vs/workbench/browser/actions/configureLocale',
'vs/workbench/parts/quickopen/browser/quickopen.contribution', 'vs/workbench/parts/quickopen/browser/quickopen.contribution',
'vs/workbench/browser/parts/editor/editorGroupPicker',
'vs/workbench/parts/files/browser/explorerViewlet', 'vs/workbench/parts/files/browser/explorerViewlet',
'vs/workbench/parts/files/browser/workingFilesPicker',
'vs/workbench/parts/files/browser/fileActions.contribution', 'vs/workbench/parts/files/browser/fileActions.contribution',
'vs/workbench/parts/files/browser/files.contribution', 'vs/workbench/parts/files/browser/files.contribution',
'vs/workbench/parts/files/electron-browser/files.electron.contribution', 'vs/workbench/parts/files/electron-browser/files.electron.contribution',
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册