diff options
| author | Junegunn Choi <junegunn.c@gmail.com> | 2024-10-30 16:52:42 +0900 |
|---|---|---|
| committer | Junegunn Choi <junegunn.c@gmail.com> | 2024-10-30 16:52:42 +0900 |
| commit | 82ebcd9209eca6c60e0b069438e79ddea00ed437 (patch) | |
| tree | f3b64f8fd6375553fd82f3dfb9a492fea46bcb64 | |
| parent | ff1687744db737c935db0f8e4d29373db9f84d8c (diff) | |
| download | fzf-82ebcd9209eca6c60e0b069438e79ddea00ed437.tar.gz | |
Fix (half-)page-up/down in the presence of multi-line items
Fix #4069
| -rw-r--r-- | src/terminal.go | 37 |
1 files changed, 26 insertions, 11 deletions
diff --git a/src/terminal.go b/src/terminal.go index 4ee72d84..ac75b4c3 100644 --- a/src/terminal.go +++ b/src/terminal.go @@ -4410,17 +4410,32 @@ func (t *Terminal) Loop() error { suffix := copySlice(t.input[t.cx:]) t.input = append(append(t.input[:t.cx], t.yanked...), suffix...) t.cx += len(t.yanked) - case actPageUp: - t.vmove(t.maxItems()-1, false) - req(reqList) - case actPageDown: - t.vmove(-(t.maxItems() - 1), false) - req(reqList) - case actHalfPageUp: - t.vmove(t.maxItems()/2, false) - req(reqList) - case actHalfPageDown: - t.vmove(-(t.maxItems() / 2), false) + case actPageUp, actPageDown, actHalfPageUp, actHalfPageDown: + maxItems := t.maxItems() + linesToMove := maxItems - 1 + if a.t == actHalfPageUp || a.t == actHalfPageDown { + linesToMove = maxItems / 2 + } + + direction := -1 + if a.t == actPageUp || a.t == actHalfPageUp { + direction = 1 + } + + for linesToMove > 0 { + currentItem := t.currentItem() + if currentItem == nil { + break + } + + itemLines, _ := t.numItemLines(currentItem, maxItems) + linesToMove -= itemLines + cy := t.cy + t.vmove(direction, false) + if cy == t.cy { + break + } + } req(reqList) case actOffsetUp, actOffsetDown: diff := 1 |
