diff --git a/src/vs/platform/externalTerminal/node/externalTerminalService.ts b/src/vs/platform/externalTerminal/node/externalTerminalService.ts index 3dcc1c49d0a..71dbac899b3 100644 --- a/src/vs/platform/externalTerminal/node/externalTerminalService.ts +++ b/src/vs/platform/externalTerminal/node/externalTerminalService.ts @@ -4,6 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import * as cp from 'child_process'; +import { memoize } from 'vs/base/common/decorators'; import { FileAccess } from 'vs/base/common/network'; import * as path from 'vs/base/common/path'; import * as env from 'vs/base/common/platform'; @@ -66,14 +67,15 @@ export class WindowsExternalTerminalService extends ExternalTerminalService impl return new Promise((c, e) => { const env = getSanitizedEnvironment(process); - const child = spawner.spawn(command, cmdArgs, { cwd, env }); + const child = spawner.spawn(command, cmdArgs, { cwd, env, detached: true }); child.on('error', e); child.on('exit', () => c()); }); } - public runInTerminal(title: string, dir: string, args: string[], envVars: ITerminalEnvironment, settings: IExternalTerminalSettings): Promise { + public async runInTerminal(title: string, dir: string, args: string[], envVars: ITerminalEnvironment, settings: IExternalTerminalSettings): Promise { const exec = 'windowsExec' in settings && settings.windowsExec ? settings.windowsExec : WindowsExternalTerminalService.getDefaultTerminalWindows(); + const wt = await WindowsExternalTerminalService.getWtExePath(); return new Promise((resolve, reject) => { @@ -101,6 +103,11 @@ export class WindowsExternalTerminalService extends ExternalTerminalService impl // inside it spawnExec = exec; cmdArgs = ['-d', '.', WindowsExternalTerminalService.CMD, '/c', command]; + } else if (wt) { + // prefer to use the window terminal to spawn if it's available instead + // of start, since that allows ctrl+c handling (#81322) + spawnExec = wt; + cmdArgs = ['-d', dir, exec, '/c', command]; } else { spawnExec = WindowsExternalTerminalService.CMD; cmdArgs = ['/c', 'start', title, '/wait', exec, '/c', command]; @@ -123,6 +130,16 @@ export class WindowsExternalTerminalService extends ExternalTerminalService impl } return WindowsExternalTerminalService._DEFAULT_TERMINAL_WINDOWS; } + + @memoize + private static async getWtExePath() { + try { + const wtPath = await processes.win32.findExecutable('wt'); + return await pfs.Promises.exists(wtPath) ? wtPath : undefined; + } catch { + return undefined; + } + } } export class MacExternalTerminalService extends ExternalTerminalService implements IExternalTerminalService {