From ae765c71fd5391c1507b57fa6836994fd113468e Mon Sep 17 00:00:00 2001 From: pwygab <88221256+merelymyself@users.noreply.github.com> Date: Wed, 20 Jul 2022 01:39:50 +0800 Subject: [PATCH] add config option to limit external command completions (#6076) * add config option to limit external command completions * fmt * small change * change name in config * change name in config again --- .../src/completions/command_completions.rs | 26 ++++++++++--------- crates/nu-protocol/src/config.rs | 9 +++++++ docs/sample_config/default_config.nu | 1 + 3 files changed, 24 insertions(+), 12 deletions(-) diff --git a/crates/nu-cli/src/completions/command_completions.rs b/crates/nu-cli/src/completions/command_completions.rs index 891716663f..e1cdbfba52 100644 --- a/crates/nu-cli/src/completions/command_completions.rs +++ b/crates/nu-cli/src/completions/command_completions.rs @@ -43,19 +43,21 @@ impl CommandCompletion { if let Ok(mut contents) = std::fs::read_dir(path) { while let Some(Ok(item)) = contents.next() { - if !executables.contains( - &item - .path() - .file_name() - .map(|x| x.to_string_lossy().to_string()) - .unwrap_or_default(), - ) && matches!( - item.path() - .file_name() - .map(|x| match_algorithm + if self.engine_state.config.max_external_completion_results + > executables.len() as i64 + && !executables.contains( + &item + .path() + .file_name() + .map(|x| x.to_string_lossy().to_string()) + .unwrap_or_default(), + ) + && matches!( + item.path().file_name().map(|x| match_algorithm .matches_str(&x.to_string_lossy(), prefix)), - Some(true) - ) && is_executable::is_executable(&item.path()) + Some(true) + ) + && is_executable::is_executable(&item.path()) { if let Ok(name) = item.file_name().into_string() { executables.push(name); diff --git a/crates/nu-protocol/src/config.rs b/crates/nu-protocol/src/config.rs index dd76036404..03f104142a 100644 --- a/crates/nu-protocol/src/config.rs +++ b/crates/nu-protocol/src/config.rs @@ -59,6 +59,7 @@ pub struct Config { pub use_grid_icons: bool, pub footer_mode: FooterMode, pub float_precision: i64, + pub max_external_completion_results: i64, pub filesize_format: String, pub use_ansi_coloring: bool, pub quick_completions: bool, @@ -92,6 +93,7 @@ impl Default for Config { use_grid_icons: false, footer_mode: FooterMode::RowCount(25), float_precision: 4, + max_external_completion_results: 100, filesize_format: "auto".into(), use_ansi_coloring: true, quick_completions: true, @@ -249,6 +251,13 @@ impl Value { eprintln!("$config.partial_completions is not a bool") } } + "max_external_completion_results" => { + if let Ok(i) = value.as_integer() { + config.max_external_completion_results = i; + } else { + eprintln!("$config.max_external_completion_results is not an integer") + } + } "completion_algorithm" => { if let Ok(v) = value.as_string() { config.completion_algorithm = v.to_lowercase(); diff --git a/docs/sample_config/default_config.nu b/docs/sample_config/default_config.nu index 42276f22f9..e156b10f00 100644 --- a/docs/sample_config/default_config.nu +++ b/docs/sample_config/default_config.nu @@ -256,6 +256,7 @@ let-env config = { cd_with_abbreviations: false # set to true to allow you to do things like cd s/o/f and nushell expand it to cd some/other/folder case_sensitive_completions: false # set to true to enable case-sensitive completions enable_external_completion: true # set to false to prevent nushell looking into $env.PATH to find more suggestions, `false` recommended for WSL users as this look up my be very slow + max_external_completion_results: 100 # setting it lower can improve completion performance at the cost of omitting some options # A strategy of managing table view in case of limited space. table_trim: {