mirror of
https://github.com/Microsoft/vscode
synced 2024-08-27 13:00:58 +00:00
parent
03d2d9cebf
commit
11d693fddf
|
@ -9,6 +9,7 @@ import { Codicon } from 'vs/base/common/codicons';
|
|||
import { KeyCode, KeyMod } from 'vs/base/common/keyCodes';
|
||||
import { Schemas } from 'vs/base/common/network';
|
||||
import { isLinux, isWindows } from 'vs/base/common/platform';
|
||||
import { IDisposable } from 'vs/base/common/lifecycle';
|
||||
import { withNullAsUndefined } from 'vs/base/common/types';
|
||||
import { URI } from 'vs/base/common/uri';
|
||||
import { ICodeEditorService } from 'vs/editor/browser/services/codeEditorService';
|
||||
|
@ -131,109 +132,8 @@ export function registerTerminalActions() {
|
|||
}
|
||||
});
|
||||
|
||||
registerAction2(class extends Action2 {
|
||||
constructor() {
|
||||
super({
|
||||
id: TerminalCommandId.NewWithProfile,
|
||||
title: { value: localize('workbench.action.terminal.newWithProfile', "Create New Integrated Terminal (With Profile)"), original: 'Create New Integrated Terminal (With Profile)' },
|
||||
f1: true,
|
||||
category,
|
||||
precondition: TerminalContextKeys.processSupported,
|
||||
description: {
|
||||
description: 'workbench.action.terminal.newWithProfile',
|
||||
args: [{
|
||||
name: 'args',
|
||||
schema: {
|
||||
type: 'object',
|
||||
required: ['profileName'],
|
||||
properties: {
|
||||
profileName: {
|
||||
description: localize('workbench.action.terminal.newWithProfile.profileName', "The name of the profile to create"),
|
||||
type: 'string',
|
||||
minLength: 1
|
||||
}
|
||||
}
|
||||
}
|
||||
}]
|
||||
},
|
||||
});
|
||||
}
|
||||
async run(accessor: ServicesAccessor, eventOrOptionsOrProfile: MouseEvent | ICreateTerminalOptions | ITerminalProfile | { profileName: string } | undefined, profile?: ITerminalProfile) {
|
||||
const terminalService = accessor.get(ITerminalService);
|
||||
const terminalGroupService = accessor.get(ITerminalGroupService);
|
||||
const workspaceContextService = accessor.get(IWorkspaceContextService);
|
||||
const commandService = accessor.get(ICommandService);
|
||||
|
||||
let event: MouseEvent | PointerEvent | KeyboardEvent | undefined;
|
||||
let options: ICreateTerminalOptions | undefined;
|
||||
if (typeof eventOrOptionsOrProfile === 'object' && eventOrOptionsOrProfile && ('profileName' in eventOrOptionsOrProfile || 'title' in eventOrOptionsOrProfile)) {
|
||||
const config = terminalService.allProfiles?.find(profile => {
|
||||
if (profile) {
|
||||
if ('title' in profile) {
|
||||
return profile.title === eventOrOptionsOrProfile.profileName;
|
||||
} else if ('profileName' in profile) {
|
||||
return profile.profileName === eventOrOptionsOrProfile.profileName;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
});
|
||||
if (!config) {
|
||||
throw new Error(`Could not find terminal profile "${eventOrOptionsOrProfile.profileName}"`);
|
||||
}
|
||||
options = { config };
|
||||
} else if (eventOrOptionsOrProfile instanceof MouseEvent || eventOrOptionsOrProfile instanceof PointerEvent || eventOrOptionsOrProfile instanceof KeyboardEvent) {
|
||||
event = eventOrOptionsOrProfile;
|
||||
options = profile ? { config: profile } : undefined;
|
||||
} else {
|
||||
options = convertOptionsOrProfileToOptions(eventOrOptionsOrProfile);
|
||||
}
|
||||
|
||||
const folders = workspaceContextService.getWorkspace().folders;
|
||||
if (event && (event.altKey || event.ctrlKey)) {
|
||||
const activeInstance = terminalService.activeInstance;
|
||||
if (activeInstance) {
|
||||
const cwd = await getCwdForSplit(terminalService.configHelper, activeInstance);
|
||||
await terminalService.splitInstance(activeInstance, options?.config, cwd);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (terminalService.isProcessSupportRegistered) {
|
||||
let instance: ITerminalInstance | undefined;
|
||||
let cwd: string | URI | undefined;
|
||||
if (folders.length > 1) {
|
||||
// multi-root workspace, create root picker
|
||||
const options: IPickOptions<IQuickPickItem> = {
|
||||
placeHolder: localize('workbench.action.terminal.newWorkspacePlaceholder', "Select current working directory for new terminal")
|
||||
};
|
||||
const workspace = await commandService.executeCommand(PICK_WORKSPACE_FOLDER_COMMAND_ID, [options]);
|
||||
if (!workspace) {
|
||||
// Don't create the instance if the workspace picker was canceled
|
||||
return;
|
||||
}
|
||||
cwd = workspace.uri;
|
||||
}
|
||||
|
||||
if (options) {
|
||||
instance = await terminalService.createTerminal(options);
|
||||
} else {
|
||||
instance = await terminalService.showProfileQuickPick('createInstance', cwd);
|
||||
}
|
||||
|
||||
if (instance) {
|
||||
terminalService.setActiveInstance(instance);
|
||||
if (instance.target === TerminalLocation.Editor) {
|
||||
await instance.focusWhenReady(true);
|
||||
} else {
|
||||
await terminalGroupService.showPanel(true);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
});
|
||||
// Register new with profile command
|
||||
refreshTerminalActions([]);
|
||||
|
||||
registerAction2(class extends Action2 {
|
||||
constructor() {
|
||||
|
@ -2069,10 +1969,13 @@ function convertOptionsOrProfileToOptions(optionsOrProfile?: ICreateTerminalOpti
|
|||
return optionsOrProfile;
|
||||
}
|
||||
|
||||
let newWithProfileAction: IDisposable;
|
||||
|
||||
export function refreshTerminalActions(detectedProfiles: ITerminalProfile[]) {
|
||||
const profileEnum = createProfileSchemaEnums(detectedProfiles);
|
||||
const category: ILocalizedString = { value: TERMINAL_ACTION_CATEGORY, original: 'Terminal' };
|
||||
registerAction2(class extends Action2 {
|
||||
newWithProfileAction?.dispose();
|
||||
newWithProfileAction = registerAction2(class extends Action2 {
|
||||
constructor() {
|
||||
super({
|
||||
id: TerminalCommandId.NewWithProfile,
|
||||
|
|
Loading…
Reference in a new issue