Added yank editor commands
continuous-integration/drone/push Build is passing Details

Yank, yank line, and paste were added to normal mode keybinds
This commit is contained in:
Joe Bellus 2022-10-17 15:11:29 -04:00
parent 3b6f7cdbf4
commit 5943876569
2 changed files with 58 additions and 2 deletions

View File

@ -35,6 +35,10 @@ In normal mode the cursor is a block and functional keybinds can be used for mov
| dd | Delete the current line |
| cw | Change word forward |
| cb | Change word backward |
| y | Yank selection |
| Y | Yank line |
| p | Paste line at cursor |
| P | Paste line below |
** Insert mode
In insert mode the cursor is a line and text can be edited. To return to normal mode use the ESC key.

View File

@ -38,6 +38,10 @@ mod keymap {
pub const SELECT_MODE: &str = "v";
pub const CHANGE_WORD_FORWARD: &str = "cw";
pub const CHANGE_WORD_BACKWARD: &str = "cb";
pub const YANK: &str = "y";
pub const YANK_LINE: &str = "Y";
pub const PASTE: &str = "p";
pub const PASTE_LINE: &str = "P";
#[derive(Debug, Default)]
pub struct KeyList {
@ -67,6 +71,10 @@ mod keymap {
SELECT_MODE,
CHANGE_WORD_FORWARD,
CHANGE_WORD_BACKWARD,
YANK,
YANK_LINE,
PASTE,
PASTE_LINE,
],
}
}
@ -153,7 +161,7 @@ impl AbacusEditor {
}
if data.mode == EditMode::Normal {
let char_rect = if data.content.len_chars() == 0 {
let char_rect = if data.cursor_pos == 0 {
let rects = layout.rects_for_range(0..1);
rects.first().cloned()
} else if data.current_char() == Some('\n')
@ -362,7 +370,9 @@ impl Widget<EditorData> for AbacusEditor {
data.word_scan_backward();
}
Some(keymap::SELECT_MODE) => {
data.selection_pos = Some(data.cursor_pos);
data.cursor_to_end_of_line();
data.start_selection();
data.cursor_to_start_of_line();
}
Some(keymap::CHANGE_WORD_FORWARD) => {
data.delete_word_forward();
@ -372,6 +382,48 @@ impl Widget<EditorData> for AbacusEditor {
data.delete_word_backward();
data.insert_mode();
}
Some(keymap::YANK) => {
if data.selection_pos.is_some() {
let mut cb: clipboard::ClipboardContext =
clipboard::ClipboardProvider::new().unwrap();
if let Some(slice) = data.content.get_slice(data.select_range())
{
let _ = cb.set_contents(slice.to_string());
}
}
data.deselect();
}
Some(keymap::YANK_LINE) => {
data.cursor_to_start_of_line();
data.start_selection();
data.cursor_to_end_of_line();
if data.selection_pos.is_some() {
let mut cb: clipboard::ClipboardContext =
clipboard::ClipboardProvider::new().unwrap();
if let Some(slice) = data.content.get_slice(data.select_range())
{
let _ = cb.set_contents(slice.to_string());
}
}
data.deselect();
}
Some(keymap::PASTE) => {
let mut cb: clipboard::ClipboardContext =
clipboard::ClipboardProvider::new().unwrap();
data.push_str(&cb.get_contents().unwrap_or_default());
ctx.request_layout();
}
Some(keymap::PASTE_LINE) => {
if data.selection_pos.is_some() {
data.delete_char_back();
}
let mut cb: clipboard::ClipboardContext =
clipboard::ClipboardProvider::new().unwrap();
data.cursor_to_end_of_line();
data.push_str("\n");
data.push_str(&cb.get_contents().unwrap_or_default());
ctx.request_layout();
}
_ => {}
}
}