diff --git a/helix-term/src/application.rs b/helix-term/src/application.rs index 16e8a53d..2c0b34dc 100644 --- a/helix-term/src/application.rs +++ b/helix-term/src/application.rs @@ -239,7 +239,7 @@ impl Renderer { pub fn render_prompt(&mut self, view: &View, prompt: &Prompt) { // completion - if let Some(completion) = &prompt.completion { + if !prompt.completion.is_empty() { // TODO: find out better way of clearing individual lines of the screen for i in (3..7) { self.surface.set_string( @@ -255,10 +255,10 @@ impl Renderer { ); let mut row = 0; let mut col = 0; - let max_row: u16 = self.size.0 / BASE_WIDTH; + let max_col: u16 = self.size.0 / BASE_WIDTH; // TODO: this will crash if there are too many cols added // TODO: set char limit - for (i, command) in completion.iter().enumerate() { + for (i, command) in prompt.completion.iter().enumerate() { let color = if prompt.completion_selection_index.is_some() && i == prompt.completion_selection_index.unwrap() { @@ -267,18 +267,18 @@ impl Renderer { self.text_color }; self.surface.set_stringn( - 1 + row * BASE_WIDTH, - self.size.1 - 6 + col as u16, + 1 + col * BASE_WIDTH, + self.size.1 - 6 + row as u16, &command, BASE_WIDTH as usize - 1, color, ); - col += 1; - if col > 3 { - col = 0; - row += 1; + row += 1; + if row > 3 { + row = 0; + col += 1; } - if row > max_row { + if col > max_col { break; } } @@ -434,7 +434,6 @@ impl Application { let prompt = Prompt::new( ":".to_owned(), |_input: &str| { - let mut matches = vec![]; // TODO: i need this duplicate list right now to avoid borrow checker issues let command_list = vec![ String::from("q"), @@ -469,15 +468,10 @@ impl Application { String::from("ddd"), String::from("eee"), ]; - for command in command_list { - if command.contains(_input) { - matches.push(command); - } - } - if matches.len() != 0 { - return Some(matches); - } - None + command_list + .into_iter() + .filter(|command| command.contains(_input)) + .collect() }, // completion |editor: &mut Editor, input: &str| match input { "q" => editor.should_close = true, diff --git a/helix-view/src/commands.rs b/helix-view/src/commands.rs index 905f4e10..1d7737f0 100644 --- a/helix-view/src/commands.rs +++ b/helix-view/src/commands.rs @@ -309,6 +309,10 @@ pub fn append_mode(view: &mut View, _count: usize) { // TODO: I, A, o and O can share a lot of the primitives. +pub fn command_mode(_view: &mut View, _count: usize) { + unimplemented!() +} + // calculate line numbers for each selection range fn selection_lines(state: &State) -> Vec { let mut lines = state diff --git a/helix-view/src/keymap.rs b/helix-view/src/keymap.rs index f70b9deb..69e6cabb 100644 --- a/helix-view/src/keymap.rs +++ b/helix-view/src/keymap.rs @@ -163,6 +163,7 @@ pub fn default() -> Keymaps { vec![key!('p')] => commands::paste, vec![key!('>')] => commands::indent, vec![key!('<')] => commands::unindent, + vec![key!(':')] => commands::command_mode, vec![Key { code: KeyCode::Esc, modifiers: Modifiers::NONE diff --git a/helix-view/src/prompt.rs b/helix-view/src/prompt.rs index 749e54d2..8186b476 100644 --- a/helix-view/src/prompt.rs +++ b/helix-view/src/prompt.rs @@ -6,17 +6,17 @@ pub struct Prompt { pub prompt: String, pub line: String, pub cursor: usize, - pub completion: Option>, + pub completion: Vec, pub should_close: bool, pub completion_selection_index: Option, - completion_fn: Box Option>>, + completion_fn: Box Vec>, callback_fn: Box, } impl Prompt { pub fn new( prompt: String, - mut completion_fn: impl FnMut(&str) -> Option> + 'static, + mut completion_fn: impl FnMut(&str) -> Vec + 'static, callback_fn: impl FnMut(&mut Editor, &str) + 'static, ) -> Prompt { Prompt { @@ -68,11 +68,11 @@ impl Prompt { } pub fn change_completion_selection(&mut self) { - if self.completion.is_some() { + if !self.completion.is_empty() { self.completion_selection_index = self .completion_selection_index .map(|i| { - if i == self.completion.as_ref().unwrap().len() - 1 { + if i == self.completion.len() - 1 { 0 } else { i + 1 @@ -81,8 +81,6 @@ impl Prompt { .or(Some(0)); self.line = String::from( self.completion - .as_ref() - .unwrap() .get(self.completion_selection_index.unwrap()) .unwrap(), );