summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJunegunn Choi <junegunn.c@gmail.com>2020-10-06 10:05:57 +0900
committerJunegunn Choi <junegunn.c@gmail.com>2020-10-06 10:05:57 +0900
commit3cc8a74a91e90c2f53704f53b1d8793799542259 (patch)
tree3405fe91fee33c9f1d83c3094fe28bccacb1d670 /src
parentc0aa5a438f2484c9f931d1258e2eeb5ddc5927ad (diff)
downloadfzf-3cc8a74a91e90c2f53704f53b1d8793799542259.tar.gz
Add --preview-window option for cyclic scrolling
Close #2182
Diffstat (limited to 'src')
-rw-r--r--src/options.go11
-rw-r--r--src/terminal.go11
2 files changed, 15 insertions, 7 deletions
diff --git a/src/options.go b/src/options.go
index 7d19bfa2..de4e5913 100644
--- a/src/options.go
+++ b/src/options.go
@@ -80,7 +80,8 @@ const usage = `usage: fzf [options]
Preview
--preview=COMMAND Command to preview highlighted line ({})
--preview-window=OPT Preview window layout (default: right:50%)
- [up|down|left|right][:SIZE[%]][:wrap][:hidden][:+SCROLL[-OFFSET]]
+ [up|down|left|right][:SIZE[%]][:wrap][:cycle][:hidden]
+ [:+SCROLL[-OFFSET]]
[:rounded|sharp|noborder]
Scripting
@@ -163,6 +164,7 @@ type previewOpts struct {
scroll string
hidden bool
wrap bool
+ cycle bool
border tui.BorderShape
}
@@ -262,7 +264,7 @@ func defaultOptions() *Options {
ToggleSort: false,
Expect: make(map[int]string),
Keymap: make(map[int][]action),
- Preview: previewOpts{"", posRight, sizeSpec{50, true}, "", false, false, tui.BorderRounded},
+ Preview: previewOpts{"", posRight, sizeSpec{50, true}, "", false, false, false, tui.BorderRounded},
PrintQuery: false,
ReadZero: false,
Printer: func(str string) { fmt.Println(str) },
@@ -997,6 +999,7 @@ func parsePreviewWindow(opts *previewOpts, input string) {
opts.size = sizeSpec{50, true}
opts.hidden = false
opts.wrap = false
+ opts.cycle = false
tokens := strings.Split(input, ":")
sizeRegex := regexp.MustCompile("^[0-9]+%?$")
@@ -1008,6 +1011,8 @@ func parsePreviewWindow(opts *previewOpts, input string) {
opts.hidden = true
case "wrap":
opts.wrap = true
+ case "cycle":
+ opts.cycle = true
case "up", "top":
opts.position = posUp
case "down", "bottom":
@@ -1281,7 +1286,7 @@ func parseOptions(opts *Options, allArgs []string) {
opts.Preview.command = ""
case "--preview-window":
parsePreviewWindow(&opts.Preview,
- nextString(allArgs, &i, "preview window layout required: [up|down|left|right][:SIZE[%]][:rounded|sharp|noborder][:wrap][:hidden][:+SCROLL[-OFFSET]]"))
+ nextString(allArgs, &i, "preview window layout required: [up|down|left|right][:SIZE[%]][:rounded|sharp|noborder][:wrap][:cycle][:hidden][:+SCROLL[-OFFSET]]"))
case "--height":
opts.Height = parseHeight(nextString(allArgs, &i, "height required: HEIGHT[%]"))
case "--min-height":
diff --git a/src/terminal.go b/src/terminal.go
index 0fd917ac..d4947d04 100644
--- a/src/terminal.go
+++ b/src/terminal.go
@@ -1884,8 +1884,11 @@ func (t *Terminal) Loop() {
if !t.previewer.more {
return
}
- newOffset := util.Constrain(
- t.previewer.offset+amount, 0, t.previewer.lines-1)
+ newOffset := t.previewer.offset + amount
+ if t.preview.cycle {
+ newOffset = (newOffset + t.previewer.lines) % t.previewer.lines
+ }
+ newOffset = util.Constrain(newOffset, 0, t.previewer.lines-1)
if t.previewer.offset != newOffset {
t.previewer.offset = newOffset
req(reqPreviewRefresh)
@@ -1957,11 +1960,11 @@ func (t *Terminal) Loop() {
}
case actPreviewHalfPageUp:
if t.hasPreviewWindow() {
- scrollPreview(-t.pwindow.Height()/2)
+ scrollPreview(-t.pwindow.Height() / 2)
}
case actPreviewHalfPageDown:
if t.hasPreviewWindow() {
- scrollPreview(t.pwindow.Height()/2)
+ scrollPreview(t.pwindow.Height() / 2)
}
case actBeginningOfLine:
t.cx = 0