diff options
-rw-r--r-- | helix-term/src/application.rs | 38 | ||||
-rw-r--r-- | helix-view/src/prompt.rs | 13 |
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); } - _ => (), } } |