From fe4e452d68435aa5e288b5e6364862a5fc6551c0 Mon Sep 17 00:00:00 2001 From: Junegunn Choi Date: Tue, 16 Jun 2015 23:14:57 +0900 Subject: [PATCH] Add --cycle option for cyclic scrolling Close #266 --- src/options.go | 7 +++++++ src/terminal.go | 20 +++++++++++++++++--- test/test_go.rb | 19 +++++++++++++++++++ 3 files changed, 43 insertions(+), 3 deletions(-) diff --git a/src/options.go b/src/options.go index 425b19e..31a5c17 100644 --- a/src/options.go +++ b/src/options.go @@ -37,6 +37,7 @@ const usage = `usage: fzf [options] --color=COLSPEC Base scheme (dark|light|16|bw) and/or custom colors --black Use black background --reverse Reverse orientation + --cycle Enable cyclic scroll --no-hscroll Disable horizontal scroll --inline-info Display finder info inline with the query --prompt=STR Input prompt (default: '> ') @@ -107,6 +108,7 @@ type Options struct { Theme *curses.ColorTheme Black bool Reverse bool + Cycle bool Hscroll bool InlineInfo bool Prompt string @@ -148,6 +150,7 @@ func defaultOptions() *Options { Theme: defaultTheme(), Black: false, Reverse: false, + Cycle: false, Hscroll: true, InlineInfo: false, Prompt: "> ", @@ -637,6 +640,10 @@ func parseOptions(opts *Options, allArgs []string) { opts.Reverse = true case "--no-reverse": opts.Reverse = false + case "--cycle": + opts.Cycle = true + case "--no-cycle": + opts.Cycle = false case "--hscroll": opts.Hscroll = true case "--no-hscroll": diff --git a/src/terminal.go b/src/terminal.go index d17ade1..f213195 100644 --- a/src/terminal.go +++ b/src/terminal.go @@ -39,6 +39,7 @@ type Terminal struct { pressed int printQuery bool history *History + cycle bool count int progress int reading bool @@ -195,6 +196,7 @@ func NewTerminal(opts *Options, eventBox *util.EventBox) *Terminal { pressed: 0, printQuery: opts.PrintQuery, history: opts.History, + cycle: opts.Cycle, merger: EmptyMerger, selected: make(map[uint32]selectedItem), reqBox: util.NewEventBox(), @@ -945,10 +947,22 @@ func (t *Terminal) constrain() { func (t *Terminal) vmove(o int) { if t.reverse { - t.vset(t.cy - o) - } else { - t.vset(t.cy + o) + o *= -1 } + dest := t.cy + o + if t.cycle { + max := t.merger.Length() - 1 + if dest > max { + if t.cy == max { + dest = 0 + } + } else if dest < 0 { + if t.cy == 0 { + dest = max + } + } + } + t.vset(dest) } func (t *Terminal) vset(o int) bool { diff --git a/test/test_go.rb b/test/test_go.rb index 5c814d0..1108afe 100644 --- a/test/test_go.rb +++ b/test/test_go.rb @@ -615,6 +615,25 @@ class TestGoFZF < TestBase File.unlink output rescue nil end + def test_cycle + tmux.send_keys "seq 8 | #{fzf :cycle}", :Enter + tmux.until { |lines| lines[-2].include? '8/8' } + tmux.send_keys :Down + tmux.until { |lines| lines[-10].start_with? '>' } + tmux.send_keys :Down + tmux.until { |lines| lines[-9].start_with? '>' } + tmux.send_keys :PgUp + tmux.until { |lines| lines[-10].start_with? '>' } + tmux.send_keys :PgUp + tmux.until { |lines| lines[-3].start_with? '>' } + tmux.send_keys :Up + tmux.until { |lines| lines[-4].start_with? '>' } + tmux.send_keys :PgDn + tmux.until { |lines| lines[-3].start_with? '>' } + tmux.send_keys :PgDn + tmux.until { |lines| lines[-10].start_with? '>' } + end + private def writelines path, lines File.unlink path while File.exists? path