aboutsummaryrefslogtreecommitdiff
path: root/helix-term
diff options
context:
space:
mode:
Diffstat (limited to 'helix-term')
-rw-r--r--helix-term/src/editor.rs38
1 files changed, 37 insertions, 1 deletions
diff --git a/helix-term/src/editor.rs b/helix-term/src/editor.rs
index e1288e07..397ce8df 100644
--- a/helix-term/src/editor.rs
+++ b/helix-term/src/editor.rs
@@ -277,7 +277,17 @@ impl Editor {
// Handle key events
let mut event = reader.next().await;
match event {
- // TODO: handle resize events
+ Some(Ok(Event::Resize(width, height))) => {
+ self.size = (width, height);
+ let area = Rect::new(0, 0, width, height);
+ self.surface = Surface::empty(area);
+ self.cache = Surface::empty(area);
+
+ // TODO: simplistic ensure cursor in view for now
+ self.ensure_cursor_in_view();
+
+ self.render();
+ }
Some(Ok(Event::Key(KeyEvent {
code: KeyCode::Char('q'),
..
@@ -310,6 +320,9 @@ impl Editor {
} => helix_core::commands::insert_char(state, '\n'),
_ => (), // skip
}
+ // TODO: simplistic ensure cursor in view for now
+ self.ensure_cursor_in_view();
+
self.render();
}
Mode::Normal => {
@@ -318,6 +331,9 @@ impl Editor {
// TODO: handle count other than 1
command(state, 1);
+ // TODO: simplistic ensure cursor in view for now
+ self.ensure_cursor_in_view();
+
self.render();
}
}
@@ -333,6 +349,26 @@ impl Editor {
}
}
+ fn ensure_cursor_in_view(&mut self) {
+ if let Some(state) = &mut self.state {
+ let cursor = state.selection().cursor();
+ let line = state.doc().char_to_line(cursor) as u16;
+ let document_end = self.first_line + self.size.1.saturating_sub(1) - 1;
+
+ let padding = 5u16;
+
+ // TODO: side scroll
+
+ if line > document_end.saturating_sub(padding) {
+ // scroll down
+ self.first_line += line - (document_end.saturating_sub(padding));
+ } else if line < self.first_line + padding {
+ // scroll up
+ self.first_line = line.saturating_sub(padding);
+ }
+ }
+ }
+
pub async fn run(&mut self) -> Result<(), Error> {
enable_raw_mode()?;