diff --git a/i18n/en/cosmic_term.ftl b/i18n/en/cosmic_term.ftl index b84449ac..6f8b9a8a 100644 --- a/i18n/en/cosmic_term.ftl +++ b/i18n/en/cosmic_term.ftl @@ -116,6 +116,7 @@ paste = Paste select-all = Select all find = Find clear-scrollback = Clear scrollback +clear-and-reset = Clear and reset ## Open open-link = Open Link diff --git a/src/main.rs b/src/main.rs index 4f4ed2f3..59e76666 100644 --- a/src/main.rs +++ b/src/main.rs @@ -244,6 +244,7 @@ pub struct Flags { pub enum Action { About, ClearScrollback, + ClearAndReset, ColorSchemes(ColorSchemeKind), Copy, CopyUrlByMenu, @@ -295,6 +296,7 @@ impl Action { match self { Self::About => Message::ToggleContextPage(ContextPage::About), Self::ClearScrollback => Message::ClearScrollback(entity_opt), + Self::ClearAndReset => Message::ClearAndReset(entity_opt), Self::ColorSchemes(color_scheme_kind) => { Message::ToggleContextPage(ContextPage::ColorSchemes(*color_scheme_kind)) } @@ -358,6 +360,7 @@ impl MenuAction for Action { pub enum Message { AppTheme(AppTheme), ClearScrollback(Option), + ClearAndReset(Option), ColorSchemeCollapse, ColorSchemeDelete(ColorSchemeKind, ColorSchemeId), ColorSchemeExpand(ColorSchemeKind, Option), @@ -1923,6 +1926,19 @@ impl Application for App { } } } + Message::ClearAndReset(entity_opt) => { + if let Some(tab_model) = self.pane_model.active() { + let entity = entity_opt.unwrap_or_else(|| tab_model.active()); + if let Some(terminal) = tab_model.data::>(entity) { + let terminal = terminal.lock().unwrap(); + + // Reset the terminal by executing the reset command + // This fully reinitializes the terminal state (more thorough than clear) + // It clears the screen AND resets terminal settings, escape sequences, etc. + terminal.input_scroll(b"reset\n"); + } + } + } Message::ColorSchemeCollapse => { self.color_scheme_expanded = None; } diff --git a/src/menu.rs b/src/menu.rs index 107de965..e955c1b1 100644 --- a/src/menu.rs +++ b/src/menu.rs @@ -83,6 +83,7 @@ pub fn context_menu<'a>( Element::from(menu_item(fl!("select-all"), Action::SelectAll)), Element::from(divider::horizontal::light()), Element::from(menu_item(fl!("clear-scrollback"), Action::ClearScrollback)), + Element::from(menu_item(fl!("clear-and-reset"), Action::ClearAndReset)), Element::from(divider::horizontal::light()), Element::from(menu_item( fl!("split-horizontal"), @@ -238,6 +239,7 @@ pub fn menu_bar<'a>( MenuItem::Button(fl!("select-all"), None, Action::SelectAll), MenuItem::Divider, MenuItem::Button(fl!("clear-scrollback"), None, Action::ClearScrollback), + MenuItem::Button(fl!("clear-and-reset"), None, Action::ClearAndReset), MenuItem::Divider, MenuItem::Button(fl!("find"), None, Action::Find), ], diff --git a/src/shortcuts.rs b/src/shortcuts.rs index 427ed192..f814e0af 100644 --- a/src/shortcuts.rs +++ b/src/shortcuts.rs @@ -58,6 +58,7 @@ impl Binding { pub enum KeyBindAction { Disable, ClearScrollback, + ClearAndReset, Copy, CopyOrSigint, Find, @@ -100,6 +101,7 @@ impl KeyBindAction { match self { Self::Disable => None, Self::ClearScrollback => Some(Action::ClearScrollback), + Self::ClearAndReset => Some(Action::ClearAndReset), Self::Copy => Some(Action::Copy), Self::CopyOrSigint => Some(Action::CopyOrSigint), Self::Find => Some(Action::Find), @@ -260,6 +262,7 @@ pub fn action_label(action: KeyBindAction) -> String { match action { KeyBindAction::Disable => fl!("disable"), KeyBindAction::ClearScrollback => fl!("clear-scrollback"), + KeyBindAction::ClearAndReset => fl!("clear-and-reset"), KeyBindAction::Copy => fl!("copy"), KeyBindAction::CopyOrSigint => fl!("copy-or-sigint"), KeyBindAction::Find => fl!("find"), @@ -362,7 +365,7 @@ pub fn shortcut_groups() -> Vec { KeyBindAction::ZoomReset, ], }); - let mut other_actions = vec![KeyBindAction::ClearScrollback]; + let mut other_actions = vec![KeyBindAction::ClearScrollback, KeyBindAction::ClearAndReset]; #[cfg(feature = "password_manager")] other_actions.push(KeyBindAction::PasswordManager); groups.push(ShortcutGroup { @@ -500,6 +503,9 @@ fn fallback_shortcuts() -> Shortcuts { // CTRL+Alt+L clears the scrollback. bind!([Ctrl, Alt], "L", ClearScrollback); + // CTRL+Alt+K clears both the visible screen and scrollback. + bind!([Ctrl, Alt], "K", ClearAndReset); + Shortcuts(shortcuts) }