diff options
-rw-r--r-- | helix-term/src/editor.rs | 27 | ||||
-rw-r--r-- | helix-view/src/prompt.rs | 22 |
2 files changed, 31 insertions, 18 deletions
diff --git a/helix-term/src/editor.rs b/helix-term/src/editor.rs index 78456654..bdcb9ae0 100644 --- a/helix-term/src/editor.rs +++ b/helix-term/src/editor.rs @@ -36,7 +36,8 @@ pub struct Editor { size: (u16, u16), surface: Surface, cache: Surface, - prompt: Prompt, + prompt: Option<Prompt>, + should_close: bool, } impl Editor { @@ -46,7 +47,6 @@ impl Editor { let mut terminal = Terminal::new(backend)?; let size = terminal::size().unwrap(); let area = Rect::new(0, 0, size.0, size.1); - let prompt = Prompt::new(); let mut editor = Editor { terminal, @@ -55,7 +55,8 @@ impl Editor { surface: Surface::empty(area), cache: Surface::empty(area), // TODO; move to state - prompt, + prompt: None, + should_close: false, }; if let Some(file) = args.values_of_t::<PathBuf>("files").unwrap().pop() { @@ -65,6 +66,15 @@ impl Editor { Ok(editor) } + pub fn set_commands(self) { + let commands = |input: &str| match input { + "q" => self.should_close = true, + _ => (), + }; + let prompt = Prompt::new(|input| None, commands); + self.prompt = Some(prompt); + } + pub fn open(&mut self, path: PathBuf) -> Result<(), Error> { self.view = Some(View::open(path, self.size)?); Ok(()) @@ -304,10 +314,14 @@ impl Editor { let mut reader = EventStream::new(); let keymap = keymap::default(); + self.set_commands(); self.render(); loop { // Handle key events + if self.should_close { + break; + } let mut event = reader.next().await; match event { Some(Ok(Event::Resize(width, height))) => { @@ -324,13 +338,6 @@ impl Editor { self.render(); } - Some(Ok(Event::Key(KeyEvent { - code: KeyCode::Char('q'), - .. - }))) => { - break; - } - Some(Ok(Event::Key(event))) => { // TODO: sequences (`gg`) // TODO: handle count other than 1 diff --git a/helix-view/src/prompt.rs b/helix-view/src/prompt.rs index 3cb15f68..8cfb9fde 100644 --- a/helix-view/src/prompt.rs +++ b/helix-view/src/prompt.rs @@ -6,15 +6,21 @@ use std::string::String; pub struct Prompt { pub buffer: String, pub cursor_loc: usize, + completion_fn: Box<dyn FnMut(&str) -> Option<Vec<&str>>>, + callback_fn: Box<dyn Fn(&str)>, } impl Prompt { - pub fn new() -> Prompt { - let prompt = Prompt { + pub fn new( + completion_fn: impl FnMut(&str) -> Option<Vec<&str>> + 'static, + callback_fn: impl Fn(&str) + 'static, + ) -> Prompt { + Prompt { buffer: String::from(""), cursor_loc: 0, - }; - prompt + completion_fn: Box::new(completion_fn), + callback_fn: Box::new(callback_fn), + } } pub fn insert_char(&mut self, c: char) { @@ -49,10 +55,6 @@ impl Prompt { } } - pub fn success_fn() { - // TODO: - } - pub fn handle_input(&mut self, key_event: KeyEvent, view: &mut View) { match key_event { KeyEvent { @@ -82,6 +84,10 @@ impl Prompt { code: KeyCode::Backspace, .. } => self.delete_char_backwards(), + KeyEvent { + code: KeyCode::Enter, + .. + } => (self.callback_fn)(&self.buffer), _ => (), } } |