Move editor key handling to one place
This commit is contained in:
parent
f48a4a6416
commit
bfbdec4396
6 changed files with 120 additions and 59 deletions
|
|
@ -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
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue