diff --git a/src/env/browser/execPath.ts b/src/env/browser/execPath.ts new file mode 100644 index 0000000000000..46b198620bb8d --- /dev/null +++ b/src/env/browser/execPath.ts @@ -0,0 +1,3 @@ +export function getExecPath(): string { + throw new Error('Cannot get exec path from webview context'); +} diff --git a/src/env/node/execPath.ts b/src/env/node/execPath.ts new file mode 100644 index 0000000000000..7caadba1822f6 --- /dev/null +++ b/src/env/node/execPath.ts @@ -0,0 +1,32 @@ +import { resolve } from 'path'; +import { env } from 'vscode'; +import { getPlatform } from './platform'; + +export function getExecPath(): string { + if (env.appHost !== 'desktop') { + throw new Error('Cannot get exec path for not desktop runtime'); + } + switch (getPlatform()) { + case 'windows': + // tested with vscode portable (from zip) https://code.visualstudio.com/docs/editor/portable#_enable-portable-mode + return resolve(env.appRoot, '../../bin/code').replace(/\\/g, '/'); + case 'linux': + return resolve(env.appRoot, '../../bin/code'); + case 'macOS': + return resolve(env.appRoot, 'bin/code'); + default: + break; + } + switch (env.appName) { + case 'Visual Studio Code - Insiders': + return 'code-insiders'; + case 'Visual Studio Code - Exploration': + return 'code-exploration'; + case 'VSCodium': + return 'codium'; + case 'Cursor': + return 'cursor'; + default: + return 'code'; + } +} diff --git a/src/env/node/platform.ts b/src/env/node/platform.ts index daec4e98ee097..65659f9bfb9de 100644 --- a/src/env/node/platform.ts +++ b/src/env/node/platform.ts @@ -9,7 +9,7 @@ export const isLinux = platform === 'linux'; export const isMac = platform === 'darwin'; export const isWindows = platform === 'win32'; -export function getPlatform(): string { +export function getPlatform(): 'windows' | 'macOS' | 'linux' | 'web' | 'unknown' { if (isWindows) return 'windows'; if (isMac) return 'macOS'; if (isLinux) return 'linux'; diff --git a/src/system/-webview/vscode.ts b/src/system/-webview/vscode.ts index 3dfc26e13f7e0..1a8325a3dfb49 100644 --- a/src/system/-webview/vscode.ts +++ b/src/system/-webview/vscode.ts @@ -8,6 +8,7 @@ import type { WorkspaceFolder, } from 'vscode'; import { version as codeVersion, ColorThemeKind, env, Uri, ViewColumn, window, workspace } from 'vscode'; +import { getExecPath } from '@env/execPath'; import type { IconPath } from '../../@types/vscode.iconpath'; import { imageMimetypes, Schemes, trackableSchemes } from '../../constants'; import type { Container } from '../../container'; @@ -71,25 +72,8 @@ export function findOrOpenEditors(uris: Uri[], options?: TextDocumentShowOptions } export function getEditorCommand(): string { - let editor; - switch (env.appName) { - case 'Visual Studio Code - Insiders': - editor = 'code-insiders --wait --reuse-window'; - break; - case 'Visual Studio Code - Exploration': - editor = 'code-exploration --wait --reuse-window'; - break; - case 'VSCodium': - editor = 'codium --wait --reuse-window'; - break; - case 'Cursor': - editor = 'cursor --wait --reuse-window'; - break; - default: - editor = 'code --wait --reuse-window'; - break; - } - return editor; + const escapedExecPath = getExecPath().replace(/([ ()])/gm, '\\$1'); + return `${escapedExecPath} --wait --reuse-window`; } export function getEditorIfActive(document: TextDocument): TextEditor | undefined {