diff --git a/crates/project/src/terminals.rs b/crates/project/src/terminals.rs index b612d7b809..d3aec588ec 100644 --- a/crates/project/src/terminals.rs +++ b/crates/project/src/terminals.rs @@ -523,36 +523,47 @@ impl Project { }, terminal_settings::ActivateScript::Nushell => "overlay use", terminal_settings::ActivateScript::PowerShell => ".", + terminal_settings::ActivateScript::Pyenv => "pyenv", _ => "source", }; let activate_script_name = match venv_settings.activate_script { - terminal_settings::ActivateScript::Default => "activate", + terminal_settings::ActivateScript::Default + | terminal_settings::ActivateScript::Pyenv => "activate", terminal_settings::ActivateScript::Csh => "activate.csh", terminal_settings::ActivateScript::Fish => "activate.fish", terminal_settings::ActivateScript::Nushell => "activate.nu", terminal_settings::ActivateScript::PowerShell => "activate.ps1", }; - let path = venv_base_directory - .join(match std::env::consts::OS { - "windows" => "Scripts", - _ => "bin", - }) - .join(activate_script_name) - .to_string_lossy() - .to_string(); - let quoted = shlex::try_quote(&path).ok()?; + let line_ending = match std::env::consts::OS { "windows" => "\r", _ => "\n", }; - smol::block_on(self.fs.metadata(path.as_ref())) - .ok() - .flatten()?; - Some(format!( - "{} {} ; clear{}", - activate_keyword, quoted, line_ending - )) + if venv_settings.venv_name.is_empty() { + let path = venv_base_directory + .join(match std::env::consts::OS { + "windows" => "Scripts", + _ => "bin", + }) + .join(activate_script_name) + .to_string_lossy() + .to_string(); + let quoted = shlex::try_quote(&path).ok()?; + smol::block_on(self.fs.metadata(path.as_ref())) + .ok() + .flatten()?; + + Some(format!( + "{} {} ; clear{}", + activate_keyword, quoted, line_ending + )) + } else { + Some(format!( + "{activate_keyword} {activate_script_name} {name}; clear{line_ending}", + name = venv_settings.venv_name + )) + } } fn activate_python_virtual_environment( diff --git a/crates/terminal/src/terminal_settings.rs b/crates/terminal/src/terminal_settings.rs index 31c32dbdca..f5d7d5b306 100644 --- a/crates/terminal/src/terminal_settings.rs +++ b/crates/terminal/src/terminal_settings.rs @@ -95,12 +95,14 @@ pub enum VenvSettings { /// to the current working directory. We recommend overriding this /// in your project's settings, rather than globally. activate_script: Option, + venv_name: Option, directories: Option>, }, } pub struct VenvSettingsContent<'a> { pub activate_script: ActivateScript, + pub venv_name: &'a str, pub directories: &'a [PathBuf], } @@ -110,9 +112,11 @@ impl VenvSettings { VenvSettings::Off => None, VenvSettings::On { activate_script, + venv_name, directories, } => Some(VenvSettingsContent { activate_script: activate_script.unwrap_or(ActivateScript::Default), + venv_name: venv_name.as_deref().unwrap_or(""), directories: directories.as_deref().unwrap_or(&[]), }), } @@ -128,6 +132,7 @@ pub enum ActivateScript { Fish, Nushell, PowerShell, + Pyenv, } #[derive(Clone, Debug, Default, Serialize, Deserialize, JsonSchema)]