mirror of
https://github.com/microsoft/vscode.git
synced 2026-05-08 09:08:48 +01:00
get shell integration to work for zsh (#143305)
This commit is contained in:
@@ -76,7 +76,7 @@ const serverResources = [
|
||||
|
||||
// Terminal shell integration
|
||||
'out-build/vs/workbench/contrib/terminal/browser/media/shellIntegration-bash.sh',
|
||||
'out-build/vs/workbench/contrib/terminal/browser/media/shellIntegration-zsh.sh',
|
||||
'out-build/vs/workbench/contrib/terminal/browser/media/.zshrc',
|
||||
'out-build/vs/workbench/contrib/terminal/browser/media/shellIntegration.ps1',
|
||||
|
||||
'!**/test/**'
|
||||
|
||||
+4
-2
@@ -1,3 +1,5 @@
|
||||
autoload -Uz add-zsh-hook
|
||||
|
||||
IN_COMMAND_EXECUTION="1"
|
||||
prompt_start() {
|
||||
printf "\033]633;A\007"
|
||||
@@ -47,8 +49,8 @@ preexec() {
|
||||
IN_COMMAND_EXECUTION="1"
|
||||
command_output_start
|
||||
}
|
||||
precmd_functions+=($precmd_functions precmd)
|
||||
preexec_functions+=($preexec_functions preexec)
|
||||
add-zsh-hook precmd precmd
|
||||
add-zsh-hook preexec preexec
|
||||
|
||||
# Show the welcome message
|
||||
if [ -z "${VSCODE_SHELL_HIDE_WELCOME-}" ]; then
|
||||
@@ -273,6 +273,10 @@ export class TerminalProcessManager extends Disposable implements ITerminalProce
|
||||
shellLaunchConfig.env = shellLaunchConfig.env || {} as IProcessEnvironment;
|
||||
shellLaunchConfig.env['VSCODE_SHELL_LOGIN'] = '1';
|
||||
}
|
||||
if (env?.['ZDOTDIR']) {
|
||||
shellLaunchConfig.env = shellLaunchConfig.env || {} as IProcessEnvironment;
|
||||
shellLaunchConfig.env['ZDOTDIR'] = env['ZDOTDIR'].replace('${execInstallFolder}', remoteEnv.appRoot.fsPath);
|
||||
}
|
||||
|
||||
newProcess = await backend.createProcess(
|
||||
shellLaunchConfig,
|
||||
@@ -451,6 +455,13 @@ export class TerminalProcessManager extends Disposable implements ITerminalProce
|
||||
const shellIntegration = terminalEnvironment.injectShellIntegrationArgs(this._logService, this._configurationService, env, this._configHelper.config.shellIntegration?.enabled || false, shellLaunchConfig, OS);
|
||||
if (shellIntegration.enableShellIntegration) {
|
||||
shellLaunchConfig.args = shellIntegration.args;
|
||||
if (env?.['ZDOTDIR']) {
|
||||
shellLaunchConfig.env = shellLaunchConfig.env || {} as IProcessEnvironment;
|
||||
const activeWorkspaceRootUri = this._historyService.getLastActiveWorkspaceRoot(Schemas.file);
|
||||
const lastActiveWorkspaceRoot = activeWorkspaceRootUri ? withNullAsUndefined(this._workspaceContextService.getWorkspaceFolder(activeWorkspaceRootUri)) : undefined;
|
||||
const resolved = await this._configurationResolverService.resolveAsync(lastActiveWorkspaceRoot, env['ZDOTDIR']);
|
||||
env['ZDOTDIR'] = resolved;
|
||||
}
|
||||
// Always resolve the injected arguments on local processes
|
||||
await this._terminalProfileResolverService.resolveShellLaunchConfig(shellLaunchConfig, {
|
||||
remoteAuthority: undefined,
|
||||
|
||||
@@ -416,8 +416,8 @@ shellIntegrationArgs.set(ShellIntegrationExecutable.WindowsPwsh, ['-noexit', ' -
|
||||
shellIntegrationArgs.set(ShellIntegrationExecutable.WindowsPwshLogin, ['-l', '-noexit', ' -command', '. \"${execInstallFolder}\\out\\vs\\workbench\\contrib\\terminal\\browser\\media\\shellIntegration.ps1\"{0}']);
|
||||
shellIntegrationArgs.set(ShellIntegrationExecutable.Pwsh, ['-noexit', '-command', '. "${execInstallFolder}/out/vs/workbench/contrib/terminal/browser/media/shellIntegration.ps1"{0}']);
|
||||
shellIntegrationArgs.set(ShellIntegrationExecutable.PwshLogin, ['-l', '-noexit', '-command', '. "${execInstallFolder}/out/vs/workbench/contrib/terminal/browser/media/shellIntegration.ps1"']);
|
||||
shellIntegrationArgs.set(ShellIntegrationExecutable.Zsh, ['-c', '"${execInstallFolder}/out/vs/workbench/contrib/terminal/browser/media/shellIntegration-zsh.sh"; zsh -i']);
|
||||
shellIntegrationArgs.set(ShellIntegrationExecutable.ZshLogin, ['-c', '"${execInstallFolder}/out/vs/workbench/contrib/terminal/browser/media/shellIntegration-zsh.sh"; zsh -il']);
|
||||
shellIntegrationArgs.set(ShellIntegrationExecutable.Zsh, ['-i']);
|
||||
shellIntegrationArgs.set(ShellIntegrationExecutable.ZshLogin, ['-il']);
|
||||
shellIntegrationArgs.set(ShellIntegrationExecutable.Bash, ['--init-file', '${execInstallFolder}/out/vs/workbench/contrib/terminal/browser/media/shellIntegration-bash.sh']);
|
||||
const loginArgs = ['-login', '-l'];
|
||||
const pwshImpliedArgs = ['-nol', '-nologo'];
|
||||
@@ -491,7 +491,12 @@ export function injectShellIntegrationArgs(
|
||||
newArgs = shellIntegrationArgs.get(ShellIntegrationExecutable.Zsh);
|
||||
} else if (areZshBashLoginArgs(originalArgs)) {
|
||||
newArgs = shellIntegrationArgs.get(ShellIntegrationExecutable.ZshLogin);
|
||||
} else if (originalArgs === shellIntegrationArgs.get(ShellIntegrationExecutable.Zsh) || originalArgs === shellIntegrationArgs.get(ShellIntegrationExecutable.ZshLogin)) {
|
||||
newArgs = originalArgs;
|
||||
}
|
||||
// Set the ZDOTDIR to be the dir of the shell integration script so that it runs
|
||||
// as a .zshrc file and the autoload hook will work and set precmd and preexec correctly
|
||||
env['ZDOTDIR'] = '${execInstallFolder}/out/vs/workbench/contrib/terminal/browser/media';
|
||||
const showWelcome = configurationService.getValue(TerminalSettingId.ShellIntegrationShowWelcome);
|
||||
if (!showWelcome) {
|
||||
env['VSCODE_SHELL_HIDE_WELCOME'] = '1';
|
||||
|
||||
@@ -90,7 +90,10 @@ suite('Workbench - TerminalProcessManager', () => {
|
||||
await configurationService.setUserConfiguration('terminal', {
|
||||
integrated: {
|
||||
fontFamily: 'bar',
|
||||
enablePersistentSessions: true
|
||||
enablePersistentSessions: true,
|
||||
shellIntegration: {
|
||||
enabled: false
|
||||
}
|
||||
}
|
||||
});
|
||||
instantiationService.stub(IConfigurationService, configurationService);
|
||||
|
||||
Reference in New Issue
Block a user