From a8e0a4fdb04b37b17bc2ec4c2cc2c499bf20b1e7 Mon Sep 17 00:00:00 2001 From: alice pellerin Date: Tue, 17 Mar 2026 03:12:37 -0500 Subject: [PATCH] make up/down keep cursor screen position --- src/app/mod.rs | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/app/mod.rs b/src/app/mod.rs index 412d2f8..a3327f5 100644 --- a/src/app/mod.rs +++ b/src/app/mod.rs @@ -91,24 +91,33 @@ impl App { self.cursor.clamp(self.scroll_position, self.screen_size()); } - // TODO: for up/down, keep cursor at same relative position on screen (Mode::Normal, Event::Key(key_event), None) if key_event.modifiers.contains(KeyModifiers::CONTROL) && key_event.code == KeyCode::Char('d') => { + let head_offset = self.cursor.head - self.scroll_position; + let tail_offset = self.cursor.tail - self.scroll_position; + self.scroll_position = min( self.scroll_position + self.screen_size() / 2, self.contents.len() - (5 * BYTES_PER_LINE) ); - self.cursor.clamp(self.scroll_position, self.screen_size()); + + self.cursor.head = (self.scroll_position + head_offset).min(self.contents.len() - 1); + self.cursor.tail = (self.scroll_position + tail_offset).min(self.contents.len() - 1); } (Mode::Normal, Event::Key(key_event), None) if key_event.modifiers.contains(KeyModifiers::CONTROL) && key_event.code == KeyCode::Char('u') => { + let head_offset = self.cursor.head - self.scroll_position; + let tail_offset = self.cursor.tail - self.scroll_position; + self.scroll_position = self.scroll_position.saturating_sub( self.screen_size() / 2 ); - self.cursor.clamp(self.scroll_position, self.screen_size()); + + self.cursor.head = (self.scroll_position + head_offset).min(self.contents.len() - 1); + self.cursor.tail = (self.scroll_position + tail_offset).min(self.contents.len() - 1); } (Mode::Normal, Event::Key(key_event), None)