completes NU_LIB_DIRS with directory modules

this checks if `search dir + it + mod.nu` exists and adds that to the
completion items if so.
i renamed the outter `it` to `search_dir` to avoid it being shadowed by
the innermost one and avoid defining a binding with the same name.
This commit is contained in:
amtoine 2023-12-14 18:29:09 +01:00
parent 48f29b6332
commit 402acde5c0
No known key found for this signature in database
GPG key ID: 37AAE9B486CFF1AB

View file

@ -5,7 +5,7 @@ use nu_protocol::{
};
use reedline::Suggestion;
use std::{
path::{is_separator, MAIN_SEPARATOR as SEP, MAIN_SEPARATOR_STR},
path::{is_separator, MAIN_SEPARATOR as SEP, MAIN_SEPARATOR_STR, Path},
sync::Arc,
};
@ -91,17 +91,22 @@ impl Completer for DotNuCompletion {
// and transform them into suggestions
let output: Vec<Suggestion> = search_dirs
.into_iter()
.flat_map(|it| {
file_path_completion(span, &partial, &it, options)
.flat_map(|search_dir| {
let completions = file_path_completion(span, &partial, &search_dir, options);
completions
.into_iter()
.filter(|it| {
.filter(move |it| {
// Different base dir, so we list the .nu files or folders
if !is_current_folder {
it.1.ends_with(".nu") || it.1.ends_with(SEP)
} else {
// Lib dirs, so we filter only the .nu files
// Lib dirs, so we filter only the .nu files or directory modules
if it.1.ends_with(SEP) {
Path::new(&search_dir).join(&it.1).join("mod.nu").exists()
} else {
it.1.ends_with(".nu")
}
}
})
.map(move |x| Suggestion {
value: x.1,