summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJunegunn Choi <junegunn.c@gmail.com>2015-06-16 23:14:57 +0900
committerJunegunn Choi <junegunn.c@gmail.com>2015-06-16 23:16:34 +0900
commitfe4e452d68435aa5e288b5e6364862a5fc6551c0 (patch)
tree2e9fb520c1afe5bc0327a6a4a34d4b1a187c6474
parentd54a4fa223fa38415f272e7e937ccebefd39a388 (diff)
Add --cycle option for cyclic scrolling
Close #266
-rw-r--r--src/options.go7
-rw-r--r--src/terminal.go20
-rw-r--r--test/test_go.rb19
3 files changed, 43 insertions, 3 deletions
diff --git a/src/options.go b/src/options.go
index 425b19ef..31a5c17a 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 d17ade1c..f2131959 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 5c814d07..1108afe3 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