on master help sign in
added prompt close
commit06502e5a2e18eeb0e6c4828b6cda0d4ba81cdbab authorJan Hrastnik <jan.hrastnik2@gmail.com> dateMon 19 Oct 2020, 19:39 (6 years ago) parentae8ff96
2 files changed+40−11
helix-term/src/application.rs+32−6 helix-view/src/prompt.rs+8−5
helix-term/src/application.rs+32−6
@@ -235,7 +235,14 @@ impl Renderer {
235235 .set_string(1, self.size.1 - 2, mode, self.text_color);
236236 }
237237
238− pub fn render_prompt(&mut self, prompt: &Prompt) {
238+ pub fn render_prompt(&mut self, view: &View, prompt: &Prompt) {
239+ // completion
240+ if prompt.completion.is_some() {
241+ self.surface.set_style(
242+ Rect::new(0, self.size.1 - 6, self.size.0, 4),
243+ view.theme.get("ui.statusline"),
244+ );
245+ }
239246 // render buffer text
240247 self.surface
241248 .set_string(1, self.size.1 - 1, &prompt.prompt, self.text_color);
@@ -309,10 +316,13 @@ impl Application {
309316
310317 if let Some(view) = &mut self.editor.view {
311318 self.terminal.render_view(view, viewport);
312− }
313−
314− if let Some(prompt) = &self.prompt {
315− self.terminal.render_prompt(prompt);
319+ if let Some(prompt) = &self.prompt {
320+ if prompt.should_close {
321+ self.prompt = None;
322+ } else {
323+ self.terminal.render_prompt(view, prompt);
324+ }
325+ }
316326 }
317327
318328 self.terminal.draw();
@@ -383,7 +393,23 @@ impl Application {
383393 {
384394 let prompt = Prompt::new(
385395 ":".to_owned(),
386− |_input: &str| None, // completion
396+ |_input: &str| {
397+ let placeholder_list = vec![
398+ String::from("aaa"),
399+ String::from("bbb"),
400+ String::from("ccc"),
401+ ];
402+ let mut matches = vec![];
403+ for command in placeholder_list {
404+ if command.contains(_input) {
405+ matches.push(command);
406+ }
407+ }
408+ if matches.len() != 0 {
409+ return Some(matches);
410+ }
411+ None
412+ }, // completion
387413 |editor: &mut Editor, input: &str| match input {
388414 "q" => editor.should_close = true,
389415 _ => (),
helix-view/src/prompt.rs+8−5
@@ -6,20 +6,24 @@ pub struct Prompt {
66 pub prompt: String,
77 pub line: String,
88 pub cursor: usize,
9− completion_fn: Box<dyn FnMut(&str) -> Option<Vec<&str>>>,
9+ pub completion: Option<Vec<String>>,
10+ pub should_close: bool,
11+ completion_fn: Box<dyn FnMut(&str) -> Option<Vec<String>>>,
1012 callback_fn: Box<dyn FnMut(&mut Editor, &str)>,
1113}
1214
1315impl Prompt {
1416 pub fn new(
1517 prompt: String,
16− completion_fn: impl FnMut(&str) -> Option<Vec<&str>> + 'static,
18+ completion_fn: impl FnMut(&str) -> Option<Vec<String>> + 'static,
1719 callback_fn: impl FnMut(&mut Editor, &str) + 'static,
1820 ) -> Prompt {
1921 Prompt {
2022 prompt,
2123 line: String::new(),
2224 cursor: 0,
25+ completion: None,
26+ should_close: false,
2327 completion_fn: Box::new(completion_fn),
2428 callback_fn: Box::new(callback_fn),
2529 }
@@ -65,7 +69,7 @@ impl Prompt {
6569 } => self.insert_char(c),
6670 KeyEvent {
6771 code: KeyCode::Esc, ..
68− } => unimplemented!("Exit prompt!"),
72+ } => self.should_close = true,
6973 KeyEvent {
7074 code: KeyCode::Right,
7175 ..
@@ -93,9 +97,8 @@ impl Prompt {
9397 KeyEvent {
9498 code: KeyCode::Tab, ..
9599 } => {
96− let _completion = (self.completion_fn)(&self.line);
100+ self.completion = (self.completion_fn)(&self.line);
97101 }
98−
99102 _ => (),
100103 }
101104 }