aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--helix-term/src/editor.rs27
-rw-r--r--helix-view/src/prompt.rs22
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),
_ => (),
}
}