x/X
This commit is contained in:
+41
-1
@@ -1,4 +1,4 @@
|
|||||||
use std::cmp::min;
|
use std::{cmp::min, mem::swap};
|
||||||
|
|
||||||
use crate::{BYTES_PER_LINE, app::{App, Mode, PartialAction}};
|
use crate::{BYTES_PER_LINE, app::{App, Mode, PartialAction}};
|
||||||
|
|
||||||
@@ -37,6 +37,9 @@ pub enum Action {
|
|||||||
MovePreviousWordStart,
|
MovePreviousWordStart,
|
||||||
|
|
||||||
CollapseSelection,
|
CollapseSelection,
|
||||||
|
|
||||||
|
ExtendLineBelow,
|
||||||
|
ExtendLineAbove,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl App {
|
impl App {
|
||||||
@@ -75,6 +78,9 @@ impl App {
|
|||||||
Action::MovePreviousWordStart => self.move_previous_word_start(),
|
Action::MovePreviousWordStart => self.move_previous_word_start(),
|
||||||
|
|
||||||
Action::CollapseSelection => self.collapse_selection(),
|
Action::CollapseSelection => self.collapse_selection(),
|
||||||
|
|
||||||
|
Action::ExtendLineBelow => self.extend_line_below(),
|
||||||
|
Action::ExtendLineAbove => self.extend_line_above(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -233,6 +239,40 @@ impl App {
|
|||||||
const fn collapse_selection(&mut self) {
|
const fn collapse_selection(&mut self) {
|
||||||
self.cursor.collapse();
|
self.cursor.collapse();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn extend_line_below(&mut self) {
|
||||||
|
if self.cursor.tail > self.cursor.head {
|
||||||
|
swap(&mut self.cursor.head, &mut self.cursor.tail);
|
||||||
|
}
|
||||||
|
|
||||||
|
if self.cursor.tail.is_multiple_of(BYTES_PER_LINE) &&
|
||||||
|
self.cursor.head % BYTES_PER_LINE == BYTES_PER_LINE - 1
|
||||||
|
{
|
||||||
|
self.cursor.head = min(
|
||||||
|
self.cursor.head + BYTES_PER_LINE,
|
||||||
|
self.contents.len() - 1
|
||||||
|
)
|
||||||
|
} else {
|
||||||
|
self.cursor.tail -= self.cursor.tail % BYTES_PER_LINE;
|
||||||
|
self.cursor.head += BYTES_PER_LINE - 1 - (self.cursor.head % BYTES_PER_LINE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn extend_line_above(&mut self) {
|
||||||
|
if self.cursor.head > self.cursor.tail {
|
||||||
|
swap(&mut self.cursor.head, &mut self.cursor.tail);
|
||||||
|
}
|
||||||
|
|
||||||
|
if self.cursor.head.is_multiple_of(BYTES_PER_LINE) &&
|
||||||
|
(self.cursor.tail % BYTES_PER_LINE == BYTES_PER_LINE - 1 ||
|
||||||
|
self.cursor.tail == self.contents.len() - 1)
|
||||||
|
{
|
||||||
|
self.cursor.head = self.cursor.head.saturating_sub(BYTES_PER_LINE);
|
||||||
|
} else {
|
||||||
|
self.cursor.head -= self.cursor.head % BYTES_PER_LINE;
|
||||||
|
self.cursor.tail += BYTES_PER_LINE - 1 - (self.cursor.tail % BYTES_PER_LINE);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// helpers
|
// helpers
|
||||||
|
|||||||
@@ -128,6 +128,9 @@ impl Default for Config {
|
|||||||
("b".try_into().unwrap(), Action::MovePreviousWordStart),
|
("b".try_into().unwrap(), Action::MovePreviousWordStart),
|
||||||
|
|
||||||
(";".try_into().unwrap(), Action::CollapseSelection),
|
(";".try_into().unwrap(), Action::CollapseSelection),
|
||||||
|
|
||||||
|
("x".try_into().unwrap(), Action::ExtendLineBelow),
|
||||||
|
("X".try_into().unwrap(), Action::ExtendLineAbove),
|
||||||
].into()),
|
].into()),
|
||||||
(Some(PartialAction::Goto), [
|
(Some(PartialAction::Goto), [
|
||||||
("j".try_into().unwrap(), Action::GotoLineStart),
|
("j".try_into().unwrap(), Action::GotoLineStart),
|
||||||
@@ -165,6 +168,9 @@ impl Default for Config {
|
|||||||
// ("b".try_into().unwrap(), Action::ExtendPreviousWordStart),
|
// ("b".try_into().unwrap(), Action::ExtendPreviousWordStart),
|
||||||
|
|
||||||
(";".try_into().unwrap(), Action::CollapseSelection),
|
(";".try_into().unwrap(), Action::CollapseSelection),
|
||||||
|
|
||||||
|
("x".try_into().unwrap(), Action::ExtendLineBelow),
|
||||||
|
("X".try_into().unwrap(), Action::ExtendLineAbove),
|
||||||
].into())
|
].into())
|
||||||
].into())
|
].into())
|
||||||
].into()
|
].into()
|
||||||
|
|||||||
@@ -17,7 +17,6 @@ const CHUNKS_PER_LINE: usize = BYTES_PER_LINE / BYTES_PER_CHUNK;
|
|||||||
|
|
||||||
// TODO:
|
// TODO:
|
||||||
// - undo/redo
|
// - undo/redo
|
||||||
// - x/X
|
|
||||||
// - modes
|
// - modes
|
||||||
// - select
|
// - select
|
||||||
// - insert
|
// - insert
|
||||||
|
|||||||
Reference in New Issue
Block a user