diff --git a/crates/vim/src/command.rs b/crates/vim/src/command.rs index c49aec2c10aa042ec200106d83d5eb49a1e49143..9c3cc5311af471dea1deeff841c5503fb90b470d 100644 --- a/crates/vim/src/command.rs +++ b/crates/vim/src/command.rs @@ -201,6 +201,34 @@ pub fn command_interceptor(mut query: &str, cx: &AppContext) -> Option ( + "tabonly", + workspace::CloseInactiveItems { + save_intent: Some(SaveIntent::Close), + } + .boxed_clone(), + ), + "tabo!" | "tabon!" | "tabonl!" | "tabonly!" => ( + "tabonly!", + workspace::CloseInactiveItems { + save_intent: Some(SaveIntent::Skip), + } + .boxed_clone(), + ), + "on" | "onl" | "only" => ( + "only", + workspace::CloseInactiveTabsAndPanes { + save_intent: Some(SaveIntent::Close), + } + .boxed_clone(), + ), + "on!" | "onl!" | "only!" => ( + "only!", + workspace::CloseInactiveTabsAndPanes { + save_intent: Some(SaveIntent::Skip), + } + .boxed_clone(), + ), // quickfix / loclist (merged together for now) "cl" | "cli" | "clis" | "clist" => ( diff --git a/crates/workspace/src/pane.rs b/crates/workspace/src/pane.rs index e460a3639667b2f68f76ef1e4dfbf4c9959b2666..65315aec02ac1091f2475c065bba7f79711d8e6a 100644 --- a/crates/workspace/src/pane.rs +++ b/crates/workspace/src/pane.rs @@ -66,6 +66,12 @@ pub struct CloseActiveItem { pub save_intent: Option, } +#[derive(Clone, PartialEq, Debug, Deserialize, Default)] +#[serde(rename_all = "camelCase")] +pub struct CloseInactiveItems { + pub save_intent: Option, +} + #[derive(Clone, PartialEq, Debug, Deserialize, Default)] #[serde(rename_all = "camelCase")] pub struct CloseAllItems { @@ -83,6 +89,7 @@ impl_actions!( [ CloseAllItems, CloseActiveItem, + CloseInactiveItems, ActivateItem, RevealInProjectPanel ] @@ -94,7 +101,6 @@ actions!( ActivatePrevItem, ActivateNextItem, ActivateLastItem, - CloseInactiveItems, CloseCleanItems, CloseItemsToTheLeft, CloseItemsToTheRight, @@ -767,7 +773,7 @@ impl Pane { pub fn close_inactive_items( &mut self, - _: &CloseInactiveItems, + action: &CloseInactiveItems, cx: &mut ViewContext, ) -> Option>> { if self.items.is_empty() { @@ -775,9 +781,11 @@ impl Pane { } let active_item_id = self.items[self.active_item_index].item_id(); - Some(self.close_items(cx, SaveIntent::Close, move |item_id| { - item_id != active_item_id - })) + Some(self.close_items( + cx, + action.save_intent.unwrap_or(SaveIntent::Close), + move |item_id| item_id != active_item_id, + )) } pub fn close_clean_items( @@ -1397,7 +1405,7 @@ impl Pane { ) .entry( "Close Others", - Some(Box::new(CloseInactiveItems)), + Some(Box::new(CloseInactiveItems { save_intent: None })), cx.handler_for(&pane, move |pane, cx| { pane.close_items(cx, SaveIntent::Close, |id| id != item_id) .detach_and_log_err(cx); @@ -2432,7 +2440,7 @@ mod tests { set_labeled_items(&pane, ["A", "B", "C*", "D", "E"], cx); pane.update(cx, |pane, cx| { - pane.close_inactive_items(&CloseInactiveItems, cx) + pane.close_inactive_items(&CloseInactiveItems { save_intent: None }, cx) }) .unwrap() .await diff --git a/crates/workspace/src/workspace.rs b/crates/workspace/src/workspace.rs index 2a937d9d3369e611c0b0bb138d1141ad56177e19..f4ae96a05b5a438cde9d162a9132b36d3832f80c 100644 --- a/crates/workspace/src/workspace.rs +++ b/crates/workspace/src/workspace.rs @@ -103,7 +103,6 @@ actions!( NewFile, NewWindow, CloseWindow, - CloseInactiveTabsAndPanes, AddFolderToProject, Unfollow, SaveAs, @@ -161,6 +160,12 @@ pub struct CloseAllItemsAndPanes { pub save_intent: Option, } +#[derive(Clone, PartialEq, Debug, Deserialize, Default)] +#[serde(rename_all = "camelCase")] +pub struct CloseInactiveTabsAndPanes { + pub save_intent: Option, +} + #[derive(Clone, Deserialize, PartialEq)] pub struct SendKeystrokes(pub String); @@ -170,6 +175,7 @@ impl_actions!( ActivatePane, ActivatePaneInDirection, CloseAllItemsAndPanes, + CloseInactiveTabsAndPanes, NewFileInDirection, OpenTerminal, Save, @@ -1620,10 +1626,10 @@ impl Workspace { pub fn close_inactive_items_and_panes( &mut self, - _: &CloseInactiveTabsAndPanes, + action: &CloseInactiveTabsAndPanes, cx: &mut ViewContext, ) { - self.close_all_internal(true, SaveIntent::Close, cx) + self.close_all_internal(true, action.save_intent.unwrap_or(SaveIntent::Close), cx) .map(|task| task.detach_and_log_err(cx)); } @@ -1648,7 +1654,7 @@ impl Workspace { if retain_active_pane { if let Some(current_pane_close) = current_pane.update(cx, |pane, cx| { - pane.close_inactive_items(&CloseInactiveItems, cx) + pane.close_inactive_items(&CloseInactiveItems { save_intent: None }, cx) }) { tasks.push(current_pane_close); };