Skip to content

Commit 9e4a4c9

Browse files
authored
Merge pull request #18 from chojs23/feat/half-scroll
Feat: Add ctrl+d,u for scroll half page
2 parents 1b53cff + 82fb8c1 commit 9e4a4c9

File tree

3 files changed

+53
-0
lines changed

3 files changed

+53
-0
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -234,6 +234,7 @@ Keybindings are vim-like by default.
234234
- gg / G: jump to top / bottom
235235
- zz: recenter on selected hunk start
236236
- j / k / up / down: vertical scroll
237+
- ctrl+u / ctrl+d: half-page up / down
237238
- H / L / left / right: horizontal scroll
238239

239240
### Selection and apply

internal/tui/tui.go

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@ const (
2828
keyQuit = "q"
2929
keyCtrlC = "ctrl+c"
3030
keyCtrlS = "ctrl+s"
31+
keyCtrlD = "ctrl+d"
32+
keyCtrlU = "ctrl+u"
3133
keyNextConflict = "n"
3234
keyPrevConflict = "p"
3335
keySelectOurs = "h"
@@ -71,6 +73,7 @@ var resolverKeyHelp = []keyHelpEntry{
7173
{key: "gg/G", description: "top/bottom"},
7274
{key: "zz", description: "recenter hunk"},
7375
{key: "j/k/up/down", description: "scroll"},
76+
{key: "ctrl+u/ctrl+d", description: "half-page"},
7477
{key: "H/L/left/right", description: "scroll"},
7578
{key: "h", description: "ours"},
7679
{key: "l", description: "theirs"},
@@ -99,6 +102,8 @@ var resolverKeyActions = map[string]keyAction{
99102
keyScrollDown: (*model).handleScrollDown,
100103
keyScrollUp: (*model).handleScrollUp,
101104
keyArrowLeft: (*model).handleScrollLeft,
105+
keyCtrlU: (*model).handleHalfPageUp,
106+
keyCtrlD: (*model).handleHalfPageDown,
102107
keyArrowRight: (*model).handleScrollRight,
103108
keyArrowDown: (*model).handleScrollDown,
104109
keyArrowUp: (*model).handleScrollUp,
@@ -873,6 +878,16 @@ func (m *model) handleScrollUp() (tea.Cmd, error) {
873878
return nil, nil
874879
}
875880

881+
func (m *model) handleHalfPageDown() (tea.Cmd, error) {
882+
m.scrollVertical(m.halfPageScrollDelta())
883+
return nil, nil
884+
}
885+
886+
func (m *model) handleHalfPageUp() (tea.Cmd, error) {
887+
m.scrollVertical(-m.halfPageScrollDelta())
888+
return nil, nil
889+
}
890+
876891
func (m *model) handleApplyOurs() (tea.Cmd, error) {
877892
if err := m.applyResolution(markers.ResolutionOurs); err != nil {
878893
return nil, fmt.Errorf("failed to apply ours: %w", err)
@@ -1114,6 +1129,15 @@ func (m *model) scrollHorizontal(delta int) {
11141129
apply(&m.viewportTheirs)
11151130
}
11161131

1132+
func (m *model) halfPageScrollDelta() int {
1133+
height := max(m.viewportOurs.Height, m.viewportResult.Height)
1134+
delta := height / 2
1135+
if delta < 1 {
1136+
return 1
1137+
}
1138+
return delta
1139+
}
1140+
11171141
func (m *model) scrollVertical(delta int) {
11181142
apply := func(viewportModel *viewport.Model) {
11191143
if delta < 0 {

internal/tui/tui_test.go

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -981,6 +981,34 @@ func TestUpdateVerticalScrollKeys(t *testing.T) {
981981
}
982982
}
983983

984+
func TestUpdateHalfPageScrollKeys(t *testing.T) {
985+
lines := strings.Join([]string{"one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten", "eleven", "twelve"}, "\n")
986+
m := model{
987+
viewportOurs: viewport.New(8, 6),
988+
viewportResult: viewport.New(8, 6),
989+
viewportTheirs: viewport.New(8, 6),
990+
}
991+
for _, viewportModel := range []*viewport.Model{&m.viewportOurs, &m.viewportResult, &m.viewportTheirs} {
992+
viewportModel.SetContent(lines)
993+
}
994+
995+
updated, _ := m.Update(tea.KeyMsg{Type: tea.KeyCtrlD})
996+
result := updated.(model)
997+
for _, viewportModel := range []*viewport.Model{&result.viewportOurs, &result.viewportResult, &result.viewportTheirs} {
998+
if viewportModel.YOffset != 3 {
999+
t.Fatalf("YOffset = %d, want 3 after ctrl+d", viewportModel.YOffset)
1000+
}
1001+
}
1002+
1003+
updated, _ = result.Update(tea.KeyMsg{Type: tea.KeyCtrlU})
1004+
result = updated.(model)
1005+
for _, viewportModel := range []*viewport.Model{&result.viewportOurs, &result.viewportResult, &result.viewportTheirs} {
1006+
if viewportModel.YOffset != 0 {
1007+
t.Fatalf("YOffset = %d, want 0 after ctrl+u", viewportModel.YOffset)
1008+
}
1009+
}
1010+
}
1011+
9841012
func TestUpdateWriteKey(t *testing.T) {
9851013
tmpDir := t.TempDir()
9861014
mergedPath := filepath.Join(tmpDir, "merged.txt")

0 commit comments

Comments
 (0)