diff --git a/CHANGELOG.md b/CHANGELOG.md index 60a4710..fabba3f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -55,7 +55,15 @@ CHANGELOG --bind 'preview-scroll-down:preview-down+preview-down' \ --preview 'cat {}' ``` +- Added `offset-up` and `offset-down` actions + ```sh + # Scrolling will behave similarly to CTRL-E and CTRL-Y of vim + fzf --bind scroll-up:offset-up,scroll-down:offset-down \ + --bind ctrl-y:offset-up,ctrl-e:offset-down \ + --scroll-off=5 + ``` - Shell extensions + - Updated bash completion for fzf options - bash key bindings no longer requires perl; it will use awk or mawk instead if perl is not found - Basic context-aware completion for ssh command diff --git a/man/man1/fzf.1 b/man/man1/fzf.1 index 5ea0027..242db86 100644 --- a/man/man1/fzf.1 +++ b/man/man1/fzf.1 @@ -1157,6 +1157,8 @@ A key or an event can be bound to one or more of the following actions. \fBhalf-page-down\fR \fBhalf-page-up\fR \fBhide-preview\fR + \fBoffset-down\fR (similar to CTRL-E of Vim) + \fBoffset-up\fR (similar to CTRL-Y of Vim) \fBpos(...)\fR (move cursor to the numeric position; negative number to count from the end) \fBprev-history\fR (\fIctrl-p\fR on \fB--history\fR) \fBprev-selected\fR (move to the previous selected item) diff --git a/src/options.go b/src/options.go index 1c650a2..b4f74e9 100644 --- a/src/options.go +++ b/src/options.go @@ -1179,6 +1179,10 @@ func parseActionList(masked string, original string, prevActions []*action, putA appendAction(actTogglePreviewWrap) case "toggle-sort": appendAction(actToggleSort) + case "offset-up": + appendAction(actOffsetUp) + case "offset-down": + appendAction(actOffsetDown) case "preview-top": appendAction(actPreviewTop) case "preview-bottom": diff --git a/src/terminal.go b/src/terminal.go index 56e472c..ce25bb1 100644 --- a/src/terminal.go +++ b/src/terminal.go @@ -378,6 +378,8 @@ const ( actPosition actHalfPageUp actHalfPageDown + actOffsetUp + actOffsetDown actJump actJumpAccept actPrintQuery @@ -3404,6 +3406,19 @@ func (t *Terminal) Loop() { case actHalfPageDown: t.vmove(-(t.maxItems() / 2), false) req(reqList) + case actOffsetUp, actOffsetDown: + diff := 1 + if a.t == actOffsetDown { + diff = -1 + } + t.offset += diff + before := t.offset + t.constrain() + if before != t.offset { + t.offset = before + t.vmove(diff, false) + } + req(reqList) case actJump: t.jumping = jumpEnabled req(reqJump)