Add --cycle option for cyclic scrolling

Close #266
This commit is contained in:
Junegunn Choi 2015-06-16 23:14:57 +09:00
parent d54a4fa223
commit fe4e452d68
3 changed files with 43 additions and 3 deletions

View File

@ -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":

View File

@ -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 {

View File

@ -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