Add preview-top and preview-bottom actions

This commit is contained in:
Junegunn Choi 2020-12-31 12:54:58 +09:00
parent 7136cfc68b
commit 151252e33a
No known key found for this signature in database
GPG Key ID: 254BC280FEF9C627
4 changed files with 28 additions and 9 deletions

View File

@ -26,6 +26,7 @@ CHANGELOG
- Added `last` action to move the cursor to the last match
- The opposite action `top` is renamed to `first`, but `top` is still
recognized as a synonym for backward compatibility
- Added `preview-top` and `preview-bottom` actions
- Extended support for alt key chords: alt with any case-sensitive single character
```sh
fzf --bind alt-,:first,alt-.:last

View File

@ -805,6 +805,8 @@ A key or an event can be bound to one or more of the following actions.
\fBpreview-page-up\fR
\fBpreview-half-page-down\fR
\fBpreview-half-page-up\fR
\fBpreview-bottom\fR
\fBpreview-top\fR
\fBprevious-history\fR (\fIctrl-p\fR on \fB--history\fR)
\fBprint-query\fR (print query and exit)
\fBrefresh-preview\fR

View File

@ -907,6 +907,10 @@ func parseKeymap(keymap map[tui.Event][]action, str string) {
appendAction(actTogglePreviewWrap)
case "toggle-sort":
appendAction(actToggleSort)
case "preview-top":
appendAction(actPreviewTop)
case "preview-bottom":
appendAction(actPreviewBottom)
case "preview-up":
appendAction(actPreviewUp)
case "preview-down":

View File

@ -253,6 +253,8 @@ const (
actTogglePreview
actTogglePreviewWrap
actPreview
actPreviewTop
actPreviewBottom
actPreviewUp
actPreviewDown
actPreviewPageUp
@ -2143,12 +2145,11 @@ func (t *Terminal) Loop() {
}
return false
}
scrollPreview := func(amount int) {
scrollPreviewTo := func(newOffset int) {
if !t.previewer.scrollable {
return
}
t.previewer.following = false
newOffset := t.previewer.offset + amount
numLines := len(t.previewer.lines)
if t.previewOpts.cycle {
newOffset = (newOffset + numLines) % numLines
@ -2159,6 +2160,9 @@ func (t *Terminal) Loop() {
req(reqPreviewRefresh)
}
}
scrollPreviewBy := func(amount int) {
scrollPreviewTo(t.previewer.offset + amount)
}
for key, ret := range t.expect {
if keyMatch(key, event) {
t.pressed = ret
@ -2211,29 +2215,37 @@ func (t *Terminal) Loop() {
case actToggleSort:
t.sort = !t.sort
changed = true
case actPreviewTop:
if t.hasPreviewWindow() {
scrollPreviewTo(0)
}
case actPreviewBottom:
if t.hasPreviewWindow() {
scrollPreviewTo(len(t.previewer.lines) - t.pwindow.Height())
}
case actPreviewUp:
if t.hasPreviewWindow() {
scrollPreview(-1)
scrollPreviewBy(-1)
}
case actPreviewDown:
if t.hasPreviewWindow() {
scrollPreview(1)
scrollPreviewBy(1)
}
case actPreviewPageUp:
if t.hasPreviewWindow() {
scrollPreview(-t.pwindow.Height())
scrollPreviewBy(-t.pwindow.Height())
}
case actPreviewPageDown:
if t.hasPreviewWindow() {
scrollPreview(t.pwindow.Height())
scrollPreviewBy(t.pwindow.Height())
}
case actPreviewHalfPageUp:
if t.hasPreviewWindow() {
scrollPreview(-t.pwindow.Height() / 2)
scrollPreviewBy(-t.pwindow.Height() / 2)
}
case actPreviewHalfPageDown:
if t.hasPreviewWindow() {
scrollPreview(t.pwindow.Height() / 2)
scrollPreviewBy(t.pwindow.Height() / 2)
}
case actBeginningOfLine:
t.cx = 0
@ -2474,7 +2486,7 @@ func (t *Terminal) Loop() {
t.vmove(me.S, true)
req(reqList)
} else if t.hasPreviewWindow() && t.pwindow.Enclose(my, mx) {
scrollPreview(-me.S)
scrollPreviewBy(-me.S)
}
} else if t.window.Enclose(my, mx) {
mx -= t.window.Left()