finally a working space
This commit is contained in:
@@ -50,7 +50,7 @@ move_down = ["j", "Down"]
|
||||
move_line_end = ["$"]
|
||||
move_word_next = ["w"]
|
||||
next_field = ["Tab"]
|
||||
# move_word_prev = ["b"]
|
||||
move_word_prev = ["b"]
|
||||
move_word_end = ["e"]
|
||||
move_last_line = ["shift+g"]
|
||||
move_word_end_prev = ["ge"]
|
||||
|
||||
@@ -26,6 +26,7 @@ use crate::buffer::state::AppView;
|
||||
use crate::state::app::state::AppState;
|
||||
use crate::tui::terminal::{EventReader, TerminalCore};
|
||||
use crate::ui::handlers::render::render_ui;
|
||||
use crate::input::leader::leader_has_any_start;
|
||||
use crate::pages::login;
|
||||
use crate::pages::register;
|
||||
use crate::pages::login::LoginResult;
|
||||
@@ -237,24 +238,46 @@ pub async fn run_ui() -> Result<()> {
|
||||
};
|
||||
|
||||
if inside_canvas {
|
||||
if let Page::Form(path) = &router.current {
|
||||
if let Some(editor) = app_state.editor_for_path(path) {
|
||||
match editor.handle_key_event(*key_event) {
|
||||
KeyEventOutcome::Consumed(Some(msg)) => {
|
||||
event_handler.command_message = msg;
|
||||
needs_redraw = true;
|
||||
continue;
|
||||
}
|
||||
KeyEventOutcome::Consumed(None) => {
|
||||
needs_redraw = true;
|
||||
continue;
|
||||
}
|
||||
KeyEventOutcome::Pending => {
|
||||
needs_redraw = true;
|
||||
continue;
|
||||
}
|
||||
KeyEventOutcome::NotMatched => {
|
||||
// fall through to client-level handling
|
||||
// Do NOT forward to canvas while a leader is active or about to start.
|
||||
// This prevents the canvas from stealing the second/third key (b/d/r).
|
||||
let leader_in_progress = event_handler.input_engine.has_active_sequence();
|
||||
let is_space = matches!(key_event.code, crossterm_event::KeyCode::Char(' '));
|
||||
let can_start_leader = leader_has_any_start(&config);
|
||||
let form_in_edit_mode = match &router.current {
|
||||
Page::Form(path) => app_state
|
||||
.editor_for_path_ref(path)
|
||||
.map(|e| e.mode() == canvas::AppMode::Edit)
|
||||
.unwrap_or(false),
|
||||
_ => false,
|
||||
};
|
||||
|
||||
let defer_to_engine_for_leader = leader_in_progress
|
||||
|| (is_space && can_start_leader && !form_in_edit_mode);
|
||||
|
||||
if defer_to_engine_for_leader {
|
||||
info!(
|
||||
"Skipping canvas pre-handle: leader sequence active or starting"
|
||||
);
|
||||
} else {
|
||||
if let Page::Form(path) = &router.current {
|
||||
if let Some(editor) = app_state.editor_for_path(path) {
|
||||
match editor.handle_key_event(*key_event) {
|
||||
KeyEventOutcome::Consumed(Some(msg)) => {
|
||||
event_handler.command_message = msg;
|
||||
needs_redraw = true;
|
||||
continue;
|
||||
}
|
||||
KeyEventOutcome::Consumed(None) => {
|
||||
needs_redraw = true;
|
||||
continue;
|
||||
}
|
||||
KeyEventOutcome::Pending => {
|
||||
needs_redraw = true;
|
||||
continue;
|
||||
}
|
||||
KeyEventOutcome::NotMatched => {
|
||||
// fall through to client-level handling
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user