Appropriately pick venv activation script (#33205)

when `terminal.detect_venv.activate_script` setting is default, pick the
appropriate activate script as per the `terminal.shell` settings
specified by the user. Previously when the activate_script setting is
default, zed always try to use the `activate` script, which only works
when the user shell is `bash or zsh`. But what if the user is using
`fish` shell in zed?

Release Notes:

- python: value of `activate_script` setting is now automatically
inferred based on the kind of shell the user is running with.

---------

Co-authored-by: Piotr Osiewicz <24362066+osiewicz@users.noreply.github.com>
This commit is contained in:
Ragul R 2025-07-16 18:22:37 +05:30 committed by GitHub
parent 312369c84f
commit c29c46d3b6
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 40 additions and 5 deletions

View file

@ -16,7 +16,7 @@ use std::{
use task::{DEFAULT_REMOTE_SHELL, Shell, ShellBuilder, SpawnInTerminal}; use task::{DEFAULT_REMOTE_SHELL, Shell, ShellBuilder, SpawnInTerminal};
use terminal::{ use terminal::{
TaskState, TaskStatus, Terminal, TerminalBuilder, TaskState, TaskStatus, Terminal, TerminalBuilder,
terminal_settings::{self, TerminalSettings, VenvSettings}, terminal_settings::{self, ActivateScript, TerminalSettings, VenvSettings},
}; };
use util::{ use util::{
ResultExt, ResultExt,
@ -256,8 +256,11 @@ impl Project {
let (spawn_task, shell) = match kind { let (spawn_task, shell) = match kind {
TerminalKind::Shell(_) => { TerminalKind::Shell(_) => {
if let Some(python_venv_directory) = &python_venv_directory { if let Some(python_venv_directory) = &python_venv_directory {
python_venv_activate_command = python_venv_activate_command = this.python_activate_command(
this.python_activate_command(python_venv_directory, &settings.detect_venv); python_venv_directory,
&settings.detect_venv,
&settings.shell,
);
} }
match ssh_details { match ssh_details {
@ -510,10 +513,27 @@ impl Project {
}) })
} }
fn activate_script_kind(shell: Option<&str>) -> ActivateScript {
let shell_env = std::env::var("SHELL").ok();
let shell_path = shell.or_else(|| shell_env.as_deref());
let shell = std::path::Path::new(shell_path.unwrap_or(""))
.file_name()
.and_then(|name| name.to_str())
.unwrap_or("");
match shell {
"fish" => ActivateScript::Fish,
"tcsh" => ActivateScript::Csh,
"nu" => ActivateScript::Nushell,
"powershell" | "pwsh" => ActivateScript::PowerShell,
_ => ActivateScript::Default,
}
}
fn python_activate_command( fn python_activate_command(
&self, &self,
venv_base_directory: &Path, venv_base_directory: &Path,
venv_settings: &VenvSettings, venv_settings: &VenvSettings,
shell: &Shell,
) -> Option<String> { ) -> Option<String> {
let venv_settings = venv_settings.as_option()?; let venv_settings = venv_settings.as_option()?;
let activate_keyword = match venv_settings.activate_script { let activate_keyword = match venv_settings.activate_script {
@ -526,7 +546,22 @@ impl Project {
terminal_settings::ActivateScript::Pyenv => "pyenv", terminal_settings::ActivateScript::Pyenv => "pyenv",
_ => "source", _ => "source",
}; };
let activate_script_name = match venv_settings.activate_script { let script_kind =
if venv_settings.activate_script == terminal_settings::ActivateScript::Default {
match shell {
Shell::Program(program) => Self::activate_script_kind(Some(program)),
Shell::WithArguments {
program,
args: _,
title_override: _,
} => Self::activate_script_kind(Some(program)),
Shell::System => Self::activate_script_kind(None),
}
} else {
venv_settings.activate_script
};
let activate_script_name = match script_kind {
terminal_settings::ActivateScript::Default terminal_settings::ActivateScript::Default
| terminal_settings::ActivateScript::Pyenv => "activate", | terminal_settings::ActivateScript::Pyenv => "activate",
terminal_settings::ActivateScript::Csh => "activate.csh", terminal_settings::ActivateScript::Csh => "activate.csh",

View file

@ -123,7 +123,7 @@ impl VenvSettings {
} }
} }
#[derive(Clone, Copy, Debug, Default, Serialize, Deserialize, JsonSchema)] #[derive(Clone, Copy, Debug, Default, PartialEq, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "snake_case")] #[serde(rename_all = "snake_case")]
pub enum ActivateScript { pub enum ActivateScript {
#[default] #[default]