summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--helix-term/src/application.rs38
-rw-r--r--helix-view/src/prompt.rs13
2 files changed, 40 insertions, 11 deletions
diff --git a/helix-term/src/application.rs b/helix-term/src/application.rs
index 87d03c72..8972f082 100644
--- a/helix-term/src/application.rs
+++ b/helix-term/src/application.rs
@@ -235,7 +235,14 @@ impl Renderer {
.set_string(1, self.size.1 - 2, mode, self.text_color);
}
- pub fn render_prompt(&mut self, prompt: &Prompt) {
+ pub fn render_prompt(&mut self, view: &View, prompt: &Prompt) {
+ // completion
+ if prompt.completion.is_some() {
+ self.surface.set_style(
+ Rect::new(0, self.size.1 - 6, self.size.0, 4),
+ view.theme.get("ui.statusline"),
+ );
+ }
// render buffer text
self.surface
.set_string(1, self.size.1 - 1, &prompt.prompt, self.text_color);
@@ -309,10 +316,13 @@ impl Application {
if let Some(view) = &mut self.editor.view {
self.terminal.render_view(view, viewport);
- }
-
- if let Some(prompt) = &self.prompt {
- self.terminal.render_prompt(prompt);
+ if let Some(prompt) = &self.prompt {
+ if prompt.should_close {
+ self.prompt = None;
+ } else {
+ self.terminal.render_prompt(view, prompt);
+ }
+ }
}
self.terminal.draw();
@@ -383,7 +393,23 @@ impl Application {
{
let prompt = Prompt::new(
":".to_owned(),
- |_input: &str| None, // completion
+ |_input: &str| {
+ let placeholder_list = vec![
+ String::from("aaa"),
+ String::from("bbb"),
+ String::from("ccc"),
+ ];
+ let mut matches = vec![];
+ for command in placeholder_list {
+ if command.contains(_input) {
+ matches.push(command);
+ }
+ }
+ if matches.len() != 0 {
+ return Some(matches);
+ }
+ None
+ }, // completion
|editor: &mut Editor, input: &str| match input {
"q" => editor.should_close = true,
_ => (),
diff --git a/helix-view/src/prompt.rs b/helix-view/src/prompt.rs
index 729533c5..12f29942 100644
--- a/helix-view/src/prompt.rs
+++ b/helix-view/src/prompt.rs
@@ -6,20 +6,24 @@ pub struct Prompt {
pub prompt: String,
pub line: String,
pub cursor: usize,
- completion_fn: Box<dyn FnMut(&str) -> Option<Vec<&str>>>,
+ pub completion: Option<Vec<String>>,
+ pub should_close: bool,
+ completion_fn: Box<dyn FnMut(&str) -> Option<Vec<String>>>,
callback_fn: Box<dyn FnMut(&mut Editor, &str)>,
}
impl Prompt {
pub fn new(
prompt: String,
- completion_fn: impl FnMut(&str) -> Option<Vec<&str>> + 'static,
+ completion_fn: impl FnMut(&str) -> Option<Vec<String>> + 'static,
callback_fn: impl FnMut(&mut Editor, &str) + 'static,
) -> Prompt {
Prompt {
prompt,
line: String::new(),
cursor: 0,
+ completion: None,
+ should_close: false,
completion_fn: Box::new(completion_fn),
callback_fn: Box::new(callback_fn),
}
@@ -65,7 +69,7 @@ impl Prompt {
} => self.insert_char(c),
KeyEvent {
code: KeyCode::Esc, ..
- } => unimplemented!("Exit prompt!"),
+ } => self.should_close = true,
KeyEvent {
code: KeyCode::Right,
..
@@ -93,9 +97,8 @@ impl Prompt {
KeyEvent {
code: KeyCode::Tab, ..
} => {
- let _completion = (self.completion_fn)(&self.line);
+ self.completion = (self.completion_fn)(&self.line);
}
-
_ => (),
}
}