From db555077c4e975d9fd9ffd873d8253675ddbe2ea Mon Sep 17 00:00:00 2001 From: Alessandro Menezes Date: Mon, 4 Oct 2021 07:26:27 -0400 Subject: [PATCH 1/4] Add specific key bindings to stage / unstage items Feature requested by Issue #909. --- CHANGELOG.md | 1 + src/components/changes.rs | 7 ++++++- src/keys.rs | 4 ++++ vim_style_key_config.ron | 3 +++ 4 files changed, 14 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 023054bf5a..c8d02c2c95 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## Added - support rebasing branches with conflicts ([#895](https://github.com/extrawurst/gitui/issues/895)) +- specific key bindings to stage / unstage items [[@alessandroasm](https://github.com/alessandroasm)] ([#909](https://github.com/extrawurst/gitui/issues/909)) ## Fixed - appropriate error message when pulling deleted remote branch ([#911](https://github.com/extrawurst/gitui/issues/991)) diff --git a/src/components/changes.rs b/src/components/changes.rs index 86fa801362..ccdc3f8229 100644 --- a/src/components/changes.rs +++ b/src/components/changes.rs @@ -233,7 +233,12 @@ impl Component for ChangesComponent { if self.focused() { if let Event::Key(e) = ev { - return if e == self.key_config.enter { + let stage_or_reset_key = if self.is_working_dir { + self.key_config.stage_item + } else { + self.key_config.unstage_item + }; + return if e == stage_or_reset_key { try_or_popup!( self, "staging error:", diff --git a/src/keys.rs b/src/keys.rs index 0b6a78a39d..e8079334f9 100644 --- a/src/keys.rs +++ b/src/keys.rs @@ -88,6 +88,8 @@ pub struct KeyConfig { pub pull: KeyEvent, pub abort_merge: KeyEvent, pub undo_commit: KeyEvent, + pub stage_item: KeyEvent, + pub unstage_item: KeyEvent, } #[rustfmt::skip] @@ -161,6 +163,8 @@ impl Default for KeyConfig { abort_merge: KeyEvent { code: KeyCode::Char('A'), modifiers: KeyModifiers::SHIFT}, open_file_tree: KeyEvent { code: KeyCode::Char('F'), modifiers: KeyModifiers::SHIFT}, file_find: KeyEvent { code: KeyCode::Char('f'), modifiers: KeyModifiers::empty()}, + stage_item: KeyEvent { code: KeyCode::Enter, modifiers: KeyModifiers::empty()}, + unstage_item: KeyEvent { code: KeyCode::Enter, modifiers: KeyModifiers::empty()}, } } } diff --git a/vim_style_key_config.ron b/vim_style_key_config.ron index 1477ef5a50..2c73409452 100644 --- a/vim_style_key_config.ron +++ b/vim_style_key_config.ron @@ -100,6 +100,9 @@ open_file_tree: ( code: Char('F'), modifiers: ( bits: 1,),), file_find: ( code: Char('f'), modifiers: ( bits: 0,),), + stage_item: ( code: Enter, modifiers: ( bits: 0,),), + unstage_item: ( code: Enter, modifiers: ( bits: 0,),), + //removed in 0.11 //tab_toggle_reverse_windows: ( code: BackTab, modifiers: ( bits: 1,),), ) From 33fc886a1ec6cbdf6c8546b0b6ae28f379aa8c4a Mon Sep 17 00:00:00 2001 From: Alessandro Menezes Date: Tue, 5 Oct 2021 18:44:09 -0400 Subject: [PATCH 2/4] Updating Help popup with stage / unstage keys --- src/strings.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/strings.rs b/src/strings.rs index 0ed98e03cd..2b32883469 100644 --- a/src/strings.rs +++ b/src/strings.rs @@ -751,7 +751,7 @@ pub mod commands { CommandText::new( format!( "Stage [{}]", - key_config.get_hint(key_config.enter), + key_config.get_hint(key_config.stage_item), ), "stage currently selected file or entire path", CMD_GROUP_CHANGES, @@ -771,7 +771,7 @@ pub mod commands { CommandText::new( format!( "Unstage [{}]", - key_config.get_hint(key_config.enter), + key_config.get_hint(key_config.unstage_item), ), "unstage currently selected file or entire path", CMD_GROUP_CHANGES, From cffa6237c0d7e8c79013160e22b1e251f2ff9b5c Mon Sep 17 00:00:00 2001 From: Alessandro Menezes Date: Thu, 7 Oct 2021 07:27:14 -0400 Subject: [PATCH 3/4] Merging staging and unstaging into a single `stage_unstage_item` key --- src/components/changes.rs | 7 +------ src/keys.rs | 6 ++---- src/strings.rs | 4 ++-- vim_style_key_config.ron | 3 +-- 4 files changed, 6 insertions(+), 14 deletions(-) diff --git a/src/components/changes.rs b/src/components/changes.rs index ccdc3f8229..45f9a036b2 100644 --- a/src/components/changes.rs +++ b/src/components/changes.rs @@ -233,12 +233,7 @@ impl Component for ChangesComponent { if self.focused() { if let Event::Key(e) = ev { - let stage_or_reset_key = if self.is_working_dir { - self.key_config.stage_item - } else { - self.key_config.unstage_item - }; - return if e == stage_or_reset_key { + return if e == self.key_config.stage_unstage_item { try_or_popup!( self, "staging error:", diff --git a/src/keys.rs b/src/keys.rs index e8079334f9..8af7629105 100644 --- a/src/keys.rs +++ b/src/keys.rs @@ -88,8 +88,7 @@ pub struct KeyConfig { pub pull: KeyEvent, pub abort_merge: KeyEvent, pub undo_commit: KeyEvent, - pub stage_item: KeyEvent, - pub unstage_item: KeyEvent, + pub stage_unstage_item: KeyEvent, } #[rustfmt::skip] @@ -163,8 +162,7 @@ impl Default for KeyConfig { abort_merge: KeyEvent { code: KeyCode::Char('A'), modifiers: KeyModifiers::SHIFT}, open_file_tree: KeyEvent { code: KeyCode::Char('F'), modifiers: KeyModifiers::SHIFT}, file_find: KeyEvent { code: KeyCode::Char('f'), modifiers: KeyModifiers::empty()}, - stage_item: KeyEvent { code: KeyCode::Enter, modifiers: KeyModifiers::empty()}, - unstage_item: KeyEvent { code: KeyCode::Enter, modifiers: KeyModifiers::empty()}, + stage_unstage_item: KeyEvent { code: KeyCode::Enter, modifiers: KeyModifiers::empty()}, } } } diff --git a/src/strings.rs b/src/strings.rs index 2b32883469..5e0cc2ffa2 100644 --- a/src/strings.rs +++ b/src/strings.rs @@ -751,7 +751,7 @@ pub mod commands { CommandText::new( format!( "Stage [{}]", - key_config.get_hint(key_config.stage_item), + key_config.get_hint(key_config.stage_unstage_item), ), "stage currently selected file or entire path", CMD_GROUP_CHANGES, @@ -771,7 +771,7 @@ pub mod commands { CommandText::new( format!( "Unstage [{}]", - key_config.get_hint(key_config.unstage_item), + key_config.get_hint(key_config.stage_unstage_item), ), "unstage currently selected file or entire path", CMD_GROUP_CHANGES, diff --git a/vim_style_key_config.ron b/vim_style_key_config.ron index 2c73409452..7938cd8553 100644 --- a/vim_style_key_config.ron +++ b/vim_style_key_config.ron @@ -100,8 +100,7 @@ open_file_tree: ( code: Char('F'), modifiers: ( bits: 1,),), file_find: ( code: Char('f'), modifiers: ( bits: 0,),), - stage_item: ( code: Enter, modifiers: ( bits: 0,),), - unstage_item: ( code: Enter, modifiers: ( bits: 0,),), + stage_unstage_item: ( code: Enter, modifiers: ( bits: 0,),), //removed in 0.11 //tab_toggle_reverse_windows: ( code: BackTab, modifiers: ( bits: 1,),), From 604544154326b698b316b3bda0e33702c9aa03c7 Mon Sep 17 00:00:00 2001 From: Alessandro Menezes Date: Fri, 8 Oct 2021 07:12:42 -0400 Subject: [PATCH 4/4] Add/remove hunk now use the `stage_unstage_item` key --- src/components/diff.rs | 2 +- src/strings.rs | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/components/diff.rs b/src/components/diff.rs index 598c96ce7b..08bba56309 100644 --- a/src/components/diff.rs +++ b/src/components/diff.rs @@ -738,7 +738,7 @@ impl Component for DiffComponent { } else if e == self.key_config.page_down { self.move_selection(ScrollType::PageDown); Ok(EventState::Consumed) - } else if e == self.key_config.enter + } else if e == self.key_config.stage_unstage_item && !self.is_immutable { try_or_popup!( diff --git a/src/strings.rs b/src/strings.rs index 5e0cc2ffa2..b6a7e6148e 100644 --- a/src/strings.rs +++ b/src/strings.rs @@ -526,7 +526,7 @@ pub mod commands { CommandText::new( format!( "Add hunk [{}]", - key_config.get_hint(key_config.enter), + key_config.get_hint(key_config.stage_unstage_item), ), "adds selected hunk to stage", CMD_GROUP_DIFF, @@ -586,7 +586,7 @@ pub mod commands { CommandText::new( format!( "Remove hunk [{}]", - key_config.get_hint(key_config.enter), + key_config.get_hint(key_config.stage_unstage_item), ), "removes selected hunk from stage", CMD_GROUP_DIFF,