diff --git a/client/config.toml b/client/config.toml index 2923e8c..6b668fa 100644 --- a/client/config.toml +++ b/client/config.toml @@ -7,6 +7,7 @@ force_quit = [":q!", "ctrl+shift+q"] save_and_quit = [":wq", "ctrl+shift+s"] enter_command_mode = [":", "shift+;"] +exit_command_mode = ["ctrl+g", "5"] # MODE SPECIFIC # READ ONLY MODE @@ -26,7 +27,7 @@ move_word_end_prev = ["ge"] move_line_start = ["0"] move_line_end = ["$"] move_first_line = ["gg"] -move_last_line = ["ctrl+g"] +move_last_line = ["x"] # EDIT MODE exit_edit_mode = ["esc", "ctrl+e"] diff --git a/client/src/config/config.rs b/client/src/config/config.rs index e118708..d7d1bb3 100644 --- a/client/src/config/config.rs +++ b/client/src/config/config.rs @@ -176,6 +176,22 @@ impl Config { } } + pub fn is_enter_command_mode(&self, key: KeyCode, modifiers: KeyModifiers) -> bool { + if let Some(bindings) = self.keybindings.get("enter_command_mode") { + bindings.iter().any(|b| Self::matches_keybinding(b, key, modifiers)) + } else { + false + } + } + + pub fn is_exit_command_mode(&self, key: KeyCode, modifiers: KeyModifiers) -> bool { + if let Some(bindings) = self.keybindings.get("exit_command_mode") { + bindings.iter().any(|b| Self::matches_keybinding(b, key, modifiers)) + } else { + false + } + } + pub fn has_key_for_action(&self, action: &str, key_char: char) -> bool { if let Some(bindings) = self.keybindings.get(action) { for binding in bindings { diff --git a/client/src/modes/handlers/event.rs b/client/src/modes/handlers/event.rs index c2a34fa..70f704d 100644 --- a/client/src/modes/handlers/event.rs +++ b/client/src/modes/handlers/event.rs @@ -83,6 +83,14 @@ impl EventHandler { current_position: &mut u64, total_count: u64, ) -> Result<(bool, String), Box> { + // Check for exit_command_mode binding first + if config.is_exit_command_mode(key.code, key.modifiers) { + self.command_mode = false; + self.command_input.clear(); + return Ok((false, String::new())); + } + + // Existing command mode handling let (should_exit, message, exit_command_mode) = command_mode::handle_command_event( key, config, @@ -114,7 +122,7 @@ impl EventHandler { form_state: &mut FormState, ) -> Result> { // Enter command mode - if !self.is_edit_mode && key.code == KeyCode::Char(':') { + if !self.is_edit_mode && config.is_enter_command_mode(key.code, key.modifiers) { self.command_mode = true; self.command_input.clear(); self.command_message.clear();