mirror of
https://github.com/RGBCube/nu_scripts
synced 2025-08-01 06:37:46 +00:00

Noticed an issue in `conda.nu`. It modified `$env.PATH` from list of string to a string, without **expanding** it. It may be a problem if I have a path which is relative: ```nushell $env.PATH = ($env.PATH | split row (char esep) | prepend '~/.cargo/bin') ``` After activating an env, it's impossible to find executables in `~/.cargo/bin`. So this pr is going to make sure the path is expanded while converting. For more context: https://github.com/nushell/nushell/pull/14615?notification_referrer_id=NT_kwDOAVOaGrQxMzkwODcxMjU3NjoyMjI1NjE1NA#issuecomment-2552696978
159 lines
4.1 KiB
Text
159 lines
4.1 KiB
Text
# Activate conda environment
|
|
export def --env activate [
|
|
env_name?: string@'nu-complete conda envs' # name of the environment
|
|
] {
|
|
let conda_info = (conda info --envs --json | from json)
|
|
|
|
let env_name = if $env_name == null {
|
|
"base"
|
|
} else {
|
|
$env_name
|
|
}
|
|
|
|
let env_dir = if $env_name != "base" {
|
|
if ($env_name | path exists) and (($env_name | path expand) in $conda_info.envs ) {
|
|
($env_name | path expand)
|
|
} else {
|
|
((check-if-env-exists $env_name $conda_info) | into string)
|
|
}
|
|
} else {
|
|
$conda_info.root_prefix
|
|
}
|
|
|
|
let old_path = (system-path | str join (char esep))
|
|
|
|
let new_path = if (windows?) {
|
|
conda-create-path-windows $env_dir
|
|
} else {
|
|
conda-create-path-unix $env_dir
|
|
}
|
|
|
|
let virtual_prompt = $'[($env_name)] '
|
|
|
|
let new_env = ({
|
|
CONDA_DEFAULT_ENV: $env_name
|
|
CONDA_PREFIX: $env_dir
|
|
CONDA_PROMPT_MODIFIER: $virtual_prompt
|
|
CONDA_SHLVL: "1"
|
|
CONDA_OLD_PATH: $old_path
|
|
} | merge $new_path)
|
|
|
|
let new_env = if not (has-env CONDA_NO_PROMPT) {
|
|
let old_prompt_command = if (has-env CONDA_OLD_PROMPT_COMMAND) {
|
|
$env.CONDA_OLD_PROMPT_COMMAND
|
|
} else {
|
|
if (has-env 'PROMPT_COMMAND') {
|
|
$env.PROMPT_COMMAND
|
|
} else {
|
|
''
|
|
}
|
|
}
|
|
|
|
|
|
let new_prompt = if (has-env 'PROMPT_COMMAND') {
|
|
if 'closure' in ($old_prompt_command | describe) {
|
|
{|| $'($virtual_prompt)(do $old_prompt_command)' }
|
|
} else {
|
|
{|| $'($virtual_prompt)($old_prompt_command)' }
|
|
}
|
|
} else {
|
|
{|| $'($virtual_prompt)' }
|
|
}
|
|
|
|
$new_env | merge {
|
|
CONDA_OLD_PROMPT_COMMAND: $old_prompt_command
|
|
PROMPT_COMMAND: $new_prompt
|
|
}
|
|
} else {
|
|
$new_env | merge { CONDA_OLD_PROMPT_COMMAND: null }
|
|
}
|
|
|
|
|
|
load-env $new_env
|
|
}
|
|
|
|
# Deactivate currently active conda environment
|
|
export def --env deactivate [] {
|
|
let path_name = if "PATH" in $env { "PATH" } else { "Path" }
|
|
$env.$path_name = $env.CONDA_OLD_PATH
|
|
|
|
hide-env CONDA_PROMPT_MODIFIER
|
|
hide-env CONDA_PREFIX
|
|
hide-env CONDA_SHLVL
|
|
hide-env CONDA_DEFAULT_ENV
|
|
hide-env CONDA_OLD_PATH
|
|
|
|
$env.PROMPT_COMMAND = (
|
|
if $env.CONDA_OLD_PROMPT_COMMAND == null {
|
|
$env.PROMPT_COMMAND
|
|
} else {
|
|
$env.CONDA_OLD_PROMPT_COMMAND
|
|
}
|
|
)
|
|
hide-env CONDA_OLD_PROMPT_COMMAND
|
|
}
|
|
|
|
def check-if-env-exists [ env_name: string, conda_info: record ] {
|
|
let env_dirs = (
|
|
$conda_info.envs_dirs |
|
|
each { || path join $env_name }
|
|
)
|
|
|
|
let en = ($env_dirs | each {|en| $conda_info.envs | where $it == $en } | where ($it | length) == 1 | flatten)
|
|
if ($en | length) > 1 {
|
|
error make --unspanned {msg: $"You have environments in multiple locations: ($en)"}
|
|
}
|
|
if ($en | length) == 0 {
|
|
error make --unspanned {msg: $"Could not find given environment: ($env_name)"}
|
|
}
|
|
$en.0
|
|
}
|
|
|
|
def 'nu-complete conda envs' [] {
|
|
conda info --envs
|
|
| lines
|
|
| where not ($it | str starts-with '#')
|
|
| where not ($it | is-empty)
|
|
| each {|entry| $entry | split row ' ' | get 0 }
|
|
}
|
|
|
|
def conda-create-path-windows [env_dir: path] {
|
|
# Conda on Windows needs a few additional Path elements
|
|
let env_path = [
|
|
$env_dir
|
|
([$env_dir "Scripts"] | path join)
|
|
([$env_dir "Library" "mingw-w64"] | path join)
|
|
([$env_dir "Library" "bin"] | path join)
|
|
([$env_dir "Library" "usr" "bin"] | path join)
|
|
]
|
|
|
|
let new_path = ([$env_path (system-path)]
|
|
| flatten
|
|
| str join (char esep))
|
|
|
|
{ Path: $new_path }
|
|
}
|
|
|
|
def conda-create-path-unix [env_dir: path] {
|
|
let env_path = [
|
|
([$env_dir "bin"] | path join)
|
|
]
|
|
|
|
let new_path = ([$env_path (system-path)]
|
|
| flatten
|
|
| str join (char esep))
|
|
|
|
{ PATH: $new_path }
|
|
}
|
|
|
|
def windows? [] {
|
|
($nu.os-info.name | str downcase) == "windows"
|
|
}
|
|
|
|
def system-path [] {
|
|
if "PATH" in $env { $env.PATH } else { $env.Path } | path expand -n
|
|
}
|
|
|
|
def has-env [name: string] {
|
|
$name in $env
|
|
}
|