Move editor key handling to one place

This commit is contained in:
Joscha 2022-08-06 23:38:47 +02:00
parent f48a4a6416
commit bfbdec4396
6 changed files with 120 additions and 59 deletions

View file

@ -1,8 +1,12 @@
use std::sync::Arc;
use crossterm::event::KeyCode;
use parking_lot::FairMutex;
use toss::terminal::Terminal;
use super::input::{key, KeyBindingsList, KeyEvent};
use super::widgets::editor::EditorState;
pub fn prompt(
terminal: &mut Terminal,
crossterm_lock: &Arc<FairMutex<()>>,
@ -25,3 +29,58 @@ pub fn prompt(
Some(content)
}
}
// TODO Support more of the emacs-y bindings, see bash as example
pub fn list_editor_key_bindings(
bindings: &mut KeyBindingsList,
char_filter: impl Fn(char) -> bool,
can_edit_externally: bool,
) {
if char_filter('\n') {
bindings.binding("enter+<any modifier>", "insert newline");
}
bindings.binding("backspace", "delete before cursor");
bindings.binding("delete", "delete after cursor");
bindings.binding("ctrl+l", "clear editor contents");
if can_edit_externally {
bindings.binding("ctrl+e", "edit in $EDITOR");
}
bindings.binding("arrow keys", "move cursor");
}
pub fn handle_editor_key_event(
editor: &EditorState,
terminal: &mut Terminal,
crossterm_lock: &Arc<FairMutex<()>>,
event: KeyEvent,
char_filter: impl Fn(char) -> bool,
can_edit_externally: bool,
) -> bool {
match event {
// Enter with *any* modifier pressed - if ctrl and shift don't
// work, maybe alt does
key!(Enter) => return false,
KeyEvent {
code: KeyCode::Enter,
..
} if char_filter('\n') => editor.insert_char(terminal.frame(), '\n'),
// Editing
key!(Char ch) if char_filter(ch) => editor.insert_char(terminal.frame(), ch),
key!(Backspace) => editor.backspace(terminal.frame()),
key!(Delete) => editor.delete(),
key!(Ctrl + 'l') => editor.clear(),
key!(Ctrl + 'e') if can_edit_externally => editor.edit_externally(terminal, crossterm_lock),
// Cursor movement
key!(Left) => editor.move_cursor_left(terminal.frame()),
key!(Right) => editor.move_cursor_right(terminal.frame()),
key!(Up) => editor.move_cursor_up(terminal.frame()),
key!(Down) => editor.move_cursor_down(terminal.frame()),
_ => return false,
}
true
}