add page up/down faster scroll
This commit is contained in:
parent
306ee70381
commit
79e4364f5a
1 changed files with 41 additions and 28 deletions
|
@ -144,6 +144,8 @@ impl Editor {
|
||||||
| KeyCode::Up
|
| KeyCode::Up
|
||||||
| KeyCode::Down
|
| KeyCode::Down
|
||||||
| KeyCode::Home
|
| KeyCode::Home
|
||||||
|
| KeyCode::PageUp
|
||||||
|
| KeyCode::PageDown
|
||||||
| KeyCode::End = event.code
|
| KeyCode::End = event.code
|
||||||
{
|
{
|
||||||
if event.modifiers.contains(KeyModifiers::SHIFT) {
|
if event.modifiers.contains(KeyModifiers::SHIFT) {
|
||||||
|
@ -151,11 +153,14 @@ impl Editor {
|
||||||
} else {
|
} else {
|
||||||
self.marker = None;
|
self.marker = None;
|
||||||
}
|
}
|
||||||
|
let height = terminal::size().unwrap().1 as usize;
|
||||||
match event.code {
|
match event.code {
|
||||||
KeyCode::Left => self.move_left(),
|
KeyCode::Left => self.move_left(),
|
||||||
KeyCode::Right => self.move_right(),
|
KeyCode::Right => self.move_right(),
|
||||||
KeyCode::Up => self.move_up(),
|
KeyCode::Up => self.move_up(1),
|
||||||
KeyCode::Down => self.move_down(),
|
KeyCode::Down => self.move_down(1),
|
||||||
|
KeyCode::PageUp => self.move_up(height),
|
||||||
|
KeyCode::PageDown => self.move_down(height),
|
||||||
KeyCode::Home => self.move_home(),
|
KeyCode::Home => self.move_home(),
|
||||||
KeyCode::End => self.move_end(),
|
KeyCode::End => self.move_end(),
|
||||||
_ => (),
|
_ => (),
|
||||||
|
@ -234,6 +239,7 @@ impl Editor {
|
||||||
self.cursor.line -= 1;
|
self.cursor.line -= 1;
|
||||||
self.cursor.column = self.current_line().len();
|
self.cursor.column = self.current_line().len();
|
||||||
}
|
}
|
||||||
|
self.scroll_to_cursor()
|
||||||
}
|
}
|
||||||
|
|
||||||
fn move_right(&mut self) {
|
fn move_right(&mut self) {
|
||||||
|
@ -243,36 +249,43 @@ impl Editor {
|
||||||
self.cursor.line += 1;
|
self.cursor.line += 1;
|
||||||
self.cursor.column = 0;
|
self.cursor.column = 0;
|
||||||
}
|
}
|
||||||
|
self.scroll_to_cursor()
|
||||||
}
|
}
|
||||||
|
|
||||||
fn move_up(&mut self) {
|
fn move_up(&mut self, lines: usize) {
|
||||||
if self.cursor.line > 0 {
|
|
||||||
let physical_column = self.text
|
let physical_column = self.text
|
||||||
[self.current_line().start..(self.current_line().start + self.cursor.column)]
|
[self.current_line().start..(self.current_line().start + self.cursor.column)]
|
||||||
.chars()
|
.chars()
|
||||||
.count();
|
.count();
|
||||||
self.cursor.line -= 1;
|
self.cursor.line = self.cursor.line.saturating_sub(lines);
|
||||||
self.cursor.column = physical_column.min(self.current_line().len());
|
self.cursor.column = physical_column.min(self.current_line().len());
|
||||||
self.ensure_char_boundary();
|
self.ensure_char_boundary();
|
||||||
if self.cursor.line < self.scroll {
|
self.scroll_to_cursor();
|
||||||
self.scroll -= 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn move_down(&mut self) {
|
fn move_down(&mut self, lines: usize) {
|
||||||
if self.cursor.line < self.lines.len() - 1 {
|
|
||||||
let physical_column = self.text
|
let physical_column = self.text
|
||||||
[self.current_line().start..(self.current_line().start + self.cursor.column)]
|
[self.current_line().start..(self.current_line().start + self.cursor.column)]
|
||||||
.chars()
|
.chars()
|
||||||
.count();
|
.count();
|
||||||
self.cursor.line += 1;
|
self.cursor.line = (self.cursor.line + lines).min(self.lines.len() - 1);
|
||||||
self.cursor.column = physical_column.min(self.current_line().len());
|
self.cursor.column = physical_column.min(self.current_line().len());
|
||||||
self.ensure_char_boundary();
|
self.ensure_char_boundary();
|
||||||
if self.cursor.line > (self.scroll + terminal::size().unwrap().1 as usize - 2) {
|
self.scroll_to_cursor();
|
||||||
self.scroll += 1;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn scroll_to_cursor(&mut self) {
|
||||||
|
// while self.cursor.line < self.scroll {
|
||||||
|
// self.scroll -= 1;
|
||||||
|
// }
|
||||||
|
// while self.cursor.line > (self.scroll + terminal::size().unwrap().1 as usize - 2) {
|
||||||
|
// self.scroll += 1;
|
||||||
|
// }
|
||||||
|
self.scroll = self.scroll.min(self.cursor.line);
|
||||||
|
let height = terminal::size().unwrap().1 as usize - 2;
|
||||||
|
self.scroll = self
|
||||||
|
.scroll
|
||||||
|
.max(self.scroll + self.cursor.line.saturating_sub(self.scroll + height));
|
||||||
}
|
}
|
||||||
|
|
||||||
fn move_home(&mut self) {
|
fn move_home(&mut self) {
|
||||||
|
|
Loading…
Reference in a new issue