2022-04-06 07:58:55 +00:00
|
|
|
use crate::completions::{Completer, CompletionOptions};
|
|
|
|
use nu_protocol::{
|
|
|
|
engine::{EngineState, StateWorkingSet},
|
|
|
|
Span,
|
|
|
|
};
|
|
|
|
use reedline::Suggestion;
|
2022-04-06 12:25:02 +00:00
|
|
|
use std::sync::Arc;
|
2022-04-06 07:58:55 +00:00
|
|
|
|
|
|
|
#[derive(Clone)]
|
|
|
|
pub struct VariableCompletion {
|
2022-04-06 12:25:02 +00:00
|
|
|
engine_state: Arc<EngineState>,
|
2022-04-06 07:58:55 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
impl VariableCompletion {
|
2022-04-06 12:25:02 +00:00
|
|
|
pub fn new(engine_state: Arc<EngineState>) -> Self {
|
2022-04-06 07:58:55 +00:00
|
|
|
Self { engine_state }
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl Completer for VariableCompletion {
|
|
|
|
fn fetch(
|
|
|
|
&mut self,
|
|
|
|
working_set: &StateWorkingSet,
|
|
|
|
prefix: Vec<u8>,
|
|
|
|
span: Span,
|
|
|
|
offset: usize,
|
|
|
|
_: usize,
|
|
|
|
) -> (Vec<Suggestion>, CompletionOptions) {
|
|
|
|
let mut output = vec![];
|
|
|
|
|
|
|
|
let builtins = ["$nu", "$in", "$config", "$env", "$nothing"];
|
|
|
|
|
|
|
|
for builtin in builtins {
|
|
|
|
if builtin.as_bytes().starts_with(&prefix) {
|
|
|
|
output.push(Suggestion {
|
|
|
|
value: builtin.to_string(),
|
|
|
|
description: None,
|
|
|
|
extra: None,
|
|
|
|
span: reedline::Span {
|
|
|
|
start: span.start - offset,
|
|
|
|
end: span.end - offset,
|
|
|
|
},
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
for scope in &working_set.delta.scope {
|
|
|
|
for v in &scope.vars {
|
|
|
|
if v.0.starts_with(&prefix) {
|
|
|
|
output.push(Suggestion {
|
|
|
|
value: String::from_utf8_lossy(v.0).to_string(),
|
|
|
|
description: None,
|
|
|
|
extra: None,
|
|
|
|
span: reedline::Span {
|
|
|
|
start: span.start - offset,
|
|
|
|
end: span.end - offset,
|
|
|
|
},
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
for scope in &self.engine_state.scope {
|
|
|
|
for v in &scope.vars {
|
|
|
|
if v.0.starts_with(&prefix) {
|
|
|
|
output.push(Suggestion {
|
|
|
|
value: String::from_utf8_lossy(v.0).to_string(),
|
|
|
|
description: None,
|
|
|
|
extra: None,
|
|
|
|
span: reedline::Span {
|
|
|
|
start: span.start - offset,
|
|
|
|
end: span.end - offset,
|
|
|
|
},
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
output.dedup();
|
|
|
|
|
|
|
|
(output, CompletionOptions::default())
|
|
|
|
}
|
|
|
|
}
|