diff --git a/docs/config/README.md b/docs/config/README.md index 868482c3..03ce67f7 100644 --- a/docs/config/README.md +++ b/docs/config/README.md @@ -289,15 +289,21 @@ prefix = "underwent " ## Conda The `conda` module shows the current conda environment, if `$CONDA_DEFAULT_ENV` is set. -Note: This does not suppress conda's own prompt modifier, you may want to run `conda config --set changeps1 False` + +::: tip + +This does not suppress conda's own prompt modifier, you may want to run `conda config --set changeps1 False`. + +::: ### Options -| Variable | Default | Description | -| ---------- | -------------- | -------------------------------------------- | -| `symbol` | `"C "` | The symbol used before the environment name. | -| `style` | `"bold green"` | The style for the module. | -| `disabled` | `false` | Disables the `conda` module. | +| Variable | Default | Description | +| ------------------- | -------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `truncation_length` | `1` | The number of directories the environment path should be truncated to, if the environment was created via `conda create -p [path]`. `0` means no truncation. Also see the [`directory`](#directory) module. | +| `symbol` | `"C "` | The symbol used before the environment name. | +| `style` | `"bold green"` | The style for the module. | +| `disabled` | `false` | Disables the `conda` module. | ### Example diff --git a/src/configs/conda.rs b/src/configs/conda.rs index 7ce64468..8e3f75a2 100644 --- a/src/configs/conda.rs +++ b/src/configs/conda.rs @@ -5,6 +5,7 @@ use starship_module_config_derive::ModuleConfig; #[derive(Clone, ModuleConfig)] pub struct CondaConfig<'a> { + pub truncation_length: usize, pub symbol: SegmentConfig<'a>, pub environment: SegmentConfig<'a>, pub style: Style, @@ -14,6 +15,7 @@ pub struct CondaConfig<'a> { impl<'a> RootModuleConfig<'a> for CondaConfig<'a> { fn new() -> Self { CondaConfig { + truncation_length: 1, symbol: SegmentConfig { value: "C ", style: None, diff --git a/src/modules/conda.rs b/src/modules/conda.rs index 49a641a7..13c57874 100644 --- a/src/modules/conda.rs +++ b/src/modules/conda.rs @@ -2,6 +2,7 @@ use std::env; use super::{Context, Module}; +use super::utils::directory::truncate; use crate::config::RootModuleConfig; use crate::configs::conda::CondaConfig; @@ -18,6 +19,8 @@ pub fn module<'a>(context: &'a Context) -> Option> { let mut module = context.new_module("conda"); let config = CondaConfig::try_load(module.config); + let conda_env = truncate(conda_env, config.truncation_length); + module.set_style(config.style); module.create_segment("symbol", &config.symbol); diff --git a/src/modules/directory.rs b/src/modules/directory.rs index a221515e..61484c17 100644 --- a/src/modules/directory.rs +++ b/src/modules/directory.rs @@ -4,6 +4,7 @@ use unicode_segmentation::UnicodeSegmentation; use super::{Context, Module}; +use super::utils::directory::truncate; use crate::config::{RootModuleConfig, SegmentConfig}; use crate::configs::directory::DirectoryConfig; @@ -137,30 +138,6 @@ const fn replace_c_dir(path: String) -> String { path } -/// Truncate a path to only have a set number of path components -/// -/// Will truncate a path to only show the last `length` components in a path. -/// If a length of `0` is provided, the path will not be truncated. -fn truncate(dir_string: String, length: usize) -> String { - if length == 0 { - return dir_string; - } - - let mut components = dir_string.split('/').collect::>(); - - // If the first element is "" then there was a leading "/" and we should remove it so we can check the actual count of components - if components[0] == "" { - components.remove(0); - } - - if components.len() <= length { - return dir_string; - } - - let truncated_components = &components[components.len() - length..]; - truncated_components.join("/") -} - /// Takes part before contracted path and replaces it with fish style path /// /// Will take the first letter of each directory before the contracted path and @@ -258,48 +235,6 @@ mod tests { assert_eq!(output, "/c"); } - #[test] - fn truncate_smaller_path_than_provided_length() { - let path = "~/starship"; - let output = truncate(path.to_string(), 3); - assert_eq!(output, "~/starship") - } - - #[test] - fn truncate_same_path_as_provided_length() { - let path = "~/starship/engines"; - let output = truncate(path.to_string(), 3); - assert_eq!(output, "~/starship/engines") - } - - #[test] - fn truncate_slightly_larger_path_than_provided_length() { - let path = "~/starship/engines/booster"; - let output = truncate(path.to_string(), 3); - assert_eq!(output, "starship/engines/booster") - } - - #[test] - fn truncate_larger_path_than_provided_length() { - let path = "~/starship/engines/booster/rocket"; - let output = truncate(path.to_string(), 3); - assert_eq!(output, "engines/booster/rocket") - } - - #[test] - fn truncate_same_path_as_provided_length_from_root() { - let path = "/starship/engines/booster"; - let output = truncate(path.to_string(), 3); - assert_eq!(output, "/starship/engines/booster"); - } - - #[test] - fn truncate_larger_path_than_provided_length_from_root() { - let path = "/starship/engines/booster/rocket"; - let output = truncate(path.to_string(), 3); - assert_eq!(output, "engines/booster/rocket"); - } - #[test] fn fish_style_with_user_home_contracted_path() { let path = "~/starship/engines/booster/rocket"; diff --git a/src/modules/utils/directory.rs b/src/modules/utils/directory.rs new file mode 100644 index 00000000..7c266d06 --- /dev/null +++ b/src/modules/utils/directory.rs @@ -0,0 +1,70 @@ +/// Truncate a path to only have a set number of path components +/// +/// Will truncate a path to only show the last `length` components in a path. +/// If a length of `0` is provided, the path will not be truncated. +pub fn truncate(dir_string: String, length: usize) -> String { + if length == 0 { + return dir_string; + } + + let mut components = dir_string.split('/').collect::>(); + + // If the first element is "" then there was a leading "/" and we should remove it so we can check the actual count of components + if components[0] == "" { + components.remove(0); + } + + if components.len() <= length { + return dir_string; + } + + let truncated_components = &components[components.len() - length..]; + truncated_components.join("/") +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn truncate_smaller_path_than_provided_length() { + let path = "~/starship"; + let output = truncate(path.to_string(), 3); + assert_eq!(output, "~/starship") + } + + #[test] + fn truncate_same_path_as_provided_length() { + let path = "~/starship/engines"; + let output = truncate(path.to_string(), 3); + assert_eq!(output, "~/starship/engines") + } + + #[test] + fn truncate_slightly_larger_path_than_provided_length() { + let path = "~/starship/engines/booster"; + let output = truncate(path.to_string(), 3); + assert_eq!(output, "starship/engines/booster") + } + + #[test] + fn truncate_larger_path_than_provided_length() { + let path = "~/starship/engines/booster/rocket"; + let output = truncate(path.to_string(), 3); + assert_eq!(output, "engines/booster/rocket") + } + + #[test] + fn truncate_same_path_as_provided_length_from_root() { + let path = "/starship/engines/booster"; + let output = truncate(path.to_string(), 3); + assert_eq!(output, "/starship/engines/booster"); + } + + #[test] + fn truncate_larger_path_than_provided_length_from_root() { + let path = "/starship/engines/booster/rocket"; + let output = truncate(path.to_string(), 3); + assert_eq!(output, "engines/booster/rocket"); + } +} diff --git a/src/modules/utils/mod.rs b/src/modules/utils/mod.rs index 9e69310b..6838fb19 100644 --- a/src/modules/utils/mod.rs +++ b/src/modules/utils/mod.rs @@ -1 +1,2 @@ +pub mod directory; pub mod java_version_parser; diff --git a/tests/testsuite/conda.rs b/tests/testsuite/conda.rs index 4b48727b..f7c2e71c 100644 --- a/tests/testsuite/conda.rs +++ b/tests/testsuite/conda.rs @@ -30,3 +30,14 @@ fn env_set() -> io::Result<()> { assert_eq!(expected, actual); Ok(()) } + +#[test] +fn truncate() -> io::Result<()> { + let output = common::render_module("conda").env_clear().env("CONDA_DEFAULT_ENV", "/some/really/long/and/really/annoying/path/that/shouldnt/be/displayed/fully/conda/my_env").output()?; + + let expected = format!("via {} ", Color::Green.bold().paint("C my_env")); + let actual = String::from_utf8(output.stdout).unwrap(); + + assert_eq!(expected, actual); + Ok(()) +}