Add more vi commands

This commit is contained in:
Jeremy Soller 2022-11-21 15:49:12 -07:00
parent e6df88f698
commit 2342bf0eae
No known key found for this signature in database
GPG key ID: 87F211AF2BE4C2FE
4 changed files with 54 additions and 0 deletions

View file

@ -75,6 +75,13 @@ impl<'a> Edit<'a> for Editor<'a> {
self.select_opt
}
fn set_select_opt(&mut self, select_opt: Option<Cursor>) {
if self.select_opt != select_opt {
self.select_opt = select_opt;
self.buffer.set_redraw(true);
}
}
fn shape_as_needed(&mut self) {
if self.cursor_moved {
self.buffer.shape_until_cursor(self.cursor);

View file

@ -73,6 +73,9 @@ pub trait Edit<'a> {
/// Get the current selection position
fn select_opt(&self) -> Option<Cursor>;
/// Set the current selection position
fn set_select_opt(&mut self, select_opt: Option<Cursor>);
/// Shape lines until scroll, after adjusting scroll if the cursor moved
fn shape_as_needed(&mut self);

View file

@ -160,6 +160,10 @@ impl<'a> Edit<'a> for SyntaxEditor<'a> {
fn select_opt(&self) -> Option<Cursor> {
self.editor.select_opt()
}
fn set_select_opt(&mut self, select_opt: Option<Cursor>) {
self.editor.set_select_opt(select_opt);
}
fn shape_as_needed(&mut self) {
#[cfg(feature = "std")]

View file

@ -67,6 +67,10 @@ impl<'a> Edit<'a> for ViEditor<'a> {
self.editor.select_opt()
}
fn set_select_opt(&mut self, select_opt: Option<Cursor>) {
self.editor.set_select_opt(select_opt);
}
fn shape_as_needed(&mut self) {
self.editor.shape_as_needed()
}
@ -95,6 +99,23 @@ impl<'a> Edit<'a> for ViEditor<'a> {
self.editor.action(Action::End);
self.mode = Mode::Insert;
},
// Change mode
'c' => {
if self.editor.select_opt().is_some() {
self.editor.action(Action::Delete);
self.mode = Mode::Insert;
} else {
//TODO: change to next cursor movement
}
},
// Delete mode
'd' => {
if self.editor.select_opt().is_some() {
self.editor.action(Action::Delete);
} else {
//TODO: delete to next cursor movement
}
},
// Enter insert mode at cursor
'i' => {
self.mode = Mode::Insert;
@ -133,6 +154,25 @@ impl<'a> Edit<'a> for ViEditor<'a> {
//TODO: 'L' => self.editor.action(Action::ScreenLow),
// Middle of screen
//TODO: 'M' => self.editor.action(Action::ScreenMiddle),
// Enter visual mode
'v' => {
if self.editor.select_opt().is_some() {
self.editor.set_select_opt(None);
} else {
self.editor.set_select_opt(Some(self.editor.cursor()));
}
},
// Enter line visual mode
'V' => {
if self.editor.select_opt().is_some() {
self.editor.set_select_opt(None);
} else {
self.editor.action(Action::Home);
self.editor.set_select_opt(Some(self.editor.cursor()));
//TODO: set cursor_x_opt to max
self.editor.action(Action::End);
}
},
// Remove character at cursor
'x' => self.editor.action(Action::Delete),
// Remove character before cursor