Add error popup when external editor fails
This commit is contained in:
parent
4c7ac31699
commit
9aac9f6fdd
10 changed files with 95 additions and 90 deletions
|
|
@ -1,3 +1,4 @@
|
|||
use std::io;
|
||||
use std::sync::Arc;
|
||||
|
||||
use parking_lot::FairMutex;
|
||||
|
|
@ -10,7 +11,7 @@ pub fn prompt(
|
|||
terminal: &mut Terminal,
|
||||
crossterm_lock: &Arc<FairMutex<()>>,
|
||||
initial_text: &str,
|
||||
) -> Option<String> {
|
||||
) -> io::Result<String> {
|
||||
let content = {
|
||||
let _guard = crossterm_lock.lock();
|
||||
terminal.suspend().expect("could not suspend");
|
||||
|
|
@ -19,38 +20,23 @@ pub fn prompt(
|
|||
content
|
||||
};
|
||||
|
||||
// TODO Don't swipe this error under the rug
|
||||
let content = content.ok()?;
|
||||
|
||||
if content.trim().is_empty() {
|
||||
None
|
||||
} else {
|
||||
Some(content)
|
||||
}
|
||||
content
|
||||
}
|
||||
|
||||
// TODO List key binding util functions
|
||||
|
||||
pub fn list_editor_key_bindings(
|
||||
fn list_editor_editing_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");
|
||||
}
|
||||
|
||||
// Editing
|
||||
bindings.binding("ctrl+h, backspace", "delete before cursor");
|
||||
bindings.binding("ctrl+d, delete", "delete after cursor");
|
||||
bindings.binding("ctrl+l", "clear editor contents");
|
||||
if can_edit_externally {
|
||||
bindings.binding("ctrl+x", "edit in external editor");
|
||||
}
|
||||
}
|
||||
|
||||
bindings.empty();
|
||||
|
||||
// Cursor movement
|
||||
fn list_editor_cursor_movement_key_bindings(bindings: &mut KeyBindingsList) {
|
||||
bindings.binding("ctrl+b, ←", "move cursor left");
|
||||
bindings.binding("ctrl+f, →", "move cursor right");
|
||||
bindings.binding("alt+b, ctrl+←", "move cursor left a word");
|
||||
|
|
@ -60,13 +46,20 @@ pub fn list_editor_key_bindings(
|
|||
bindings.binding("↑/↓", "move cursor up/down");
|
||||
}
|
||||
|
||||
pub fn list_editor_key_bindings(
|
||||
bindings: &mut KeyBindingsList,
|
||||
char_filter: impl Fn(char) -> bool,
|
||||
) {
|
||||
list_editor_editing_key_bindings(bindings, char_filter);
|
||||
bindings.empty();
|
||||
list_editor_cursor_movement_key_bindings(bindings);
|
||||
}
|
||||
|
||||
pub fn handle_editor_input_event(
|
||||
editor: &EditorState,
|
||||
terminal: &mut Terminal,
|
||||
crossterm_lock: &Arc<FairMutex<()>>,
|
||||
event: &InputEvent,
|
||||
char_filter: impl Fn(char) -> bool,
|
||||
can_edit_externally: bool,
|
||||
) -> bool {
|
||||
match event {
|
||||
// Enter with *any* modifier pressed - if ctrl and shift don't
|
||||
|
|
@ -94,7 +87,6 @@ pub fn handle_editor_input_event(
|
|||
key!(Ctrl + 'h') | key!(Backspace) => editor.backspace(terminal.frame()),
|
||||
key!(Ctrl + 'd') | key!(Delete) => editor.delete(),
|
||||
key!(Ctrl + 'l') => editor.clear(),
|
||||
key!(Ctrl + 'x') if can_edit_externally => editor.edit_externally(terminal, crossterm_lock),
|
||||
// TODO Key bindings to delete words
|
||||
|
||||
// Cursor movement
|
||||
|
|
@ -112,3 +104,33 @@ pub fn handle_editor_input_event(
|
|||
|
||||
true
|
||||
}
|
||||
|
||||
pub fn list_editor_key_bindings_allowing_external_editing(
|
||||
bindings: &mut KeyBindingsList,
|
||||
char_filter: impl Fn(char) -> bool,
|
||||
) {
|
||||
list_editor_editing_key_bindings(bindings, char_filter);
|
||||
bindings.binding("ctrl+x", "edit in external editor");
|
||||
bindings.empty();
|
||||
list_editor_cursor_movement_key_bindings(bindings);
|
||||
}
|
||||
|
||||
pub fn handle_editor_input_event_allowing_external_editing(
|
||||
editor: &EditorState,
|
||||
terminal: &mut Terminal,
|
||||
crossterm_lock: &Arc<FairMutex<()>>,
|
||||
event: &InputEvent,
|
||||
char_filter: impl Fn(char) -> bool,
|
||||
) -> io::Result<bool> {
|
||||
if let key!(Ctrl + 'x') = event {
|
||||
editor.edit_externally(terminal, crossterm_lock)?;
|
||||
Ok(true)
|
||||
} else {
|
||||
Ok(handle_editor_input_event(
|
||||
editor,
|
||||
terminal,
|
||||
event,
|
||||
char_filter,
|
||||
))
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue