Print selected items in the order they are selected
This commit is contained in:
parent
0a83705d21
commit
5c0dc79ffa
@ -30,7 +30,7 @@ type Terminal struct {
|
|||||||
progress int
|
progress int
|
||||||
reading bool
|
reading bool
|
||||||
merger *Merger
|
merger *Merger
|
||||||
selected map[*string]*string
|
selected map[*string]selectedItem
|
||||||
reqBox *util.EventBox
|
reqBox *util.EventBox
|
||||||
eventBox *util.EventBox
|
eventBox *util.EventBox
|
||||||
mutex sync.Mutex
|
mutex sync.Mutex
|
||||||
@ -38,6 +38,25 @@ type Terminal struct {
|
|||||||
suppress bool
|
suppress bool
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type selectedItem struct {
|
||||||
|
at time.Time
|
||||||
|
text *string
|
||||||
|
}
|
||||||
|
|
||||||
|
type ByTimeOrder []selectedItem
|
||||||
|
|
||||||
|
func (a ByTimeOrder) Len() int {
|
||||||
|
return len(a)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (a ByTimeOrder) Swap(i, j int) {
|
||||||
|
a[i], a[j] = a[j], a[i]
|
||||||
|
}
|
||||||
|
|
||||||
|
func (a ByTimeOrder) Less(i, j int) bool {
|
||||||
|
return a[i].at.Before(a[j].at)
|
||||||
|
}
|
||||||
|
|
||||||
var _spinner = []string{`-`, `\`, `|`, `/`, `-`, `\`, `|`, `/`}
|
var _spinner = []string{`-`, `\`, `|`, `/`, `-`, `\`, `|`, `/`}
|
||||||
|
|
||||||
const (
|
const (
|
||||||
@ -70,7 +89,7 @@ func NewTerminal(opts *Options, eventBox *util.EventBox) *Terminal {
|
|||||||
multi: opts.Multi,
|
multi: opts.Multi,
|
||||||
printQuery: opts.PrintQuery,
|
printQuery: opts.PrintQuery,
|
||||||
merger: EmptyMerger,
|
merger: EmptyMerger,
|
||||||
selected: make(map[*string]*string),
|
selected: make(map[*string]selectedItem),
|
||||||
reqBox: util.NewEventBox(),
|
reqBox: util.NewEventBox(),
|
||||||
eventBox: eventBox,
|
eventBox: eventBox,
|
||||||
mutex: sync.Mutex{},
|
mutex: sync.Mutex{},
|
||||||
@ -139,12 +158,13 @@ func (t *Terminal) output() {
|
|||||||
fmt.Println(t.merger.Get(t.listIndex(t.cy)).AsString())
|
fmt.Println(t.merger.Get(t.listIndex(t.cy)).AsString())
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
for ptr, orig := range t.selected {
|
sels := make([]selectedItem, 0, len(t.selected))
|
||||||
if orig != nil {
|
for _, sel := range t.selected {
|
||||||
fmt.Println(*orig)
|
sels = append(sels, sel)
|
||||||
} else {
|
|
||||||
fmt.Println(*ptr)
|
|
||||||
}
|
}
|
||||||
|
sort.Sort(ByTimeOrder(sels))
|
||||||
|
for _, sel := range sels {
|
||||||
|
fmt.Println(*sel.text)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -444,7 +464,13 @@ func (t *Terminal) Loop() {
|
|||||||
if idx < t.merger.Length() {
|
if idx < t.merger.Length() {
|
||||||
item := t.merger.Get(idx)
|
item := t.merger.Get(idx)
|
||||||
if _, found := t.selected[item.text]; !found {
|
if _, found := t.selected[item.text]; !found {
|
||||||
t.selected[item.text] = item.origText
|
var strptr *string
|
||||||
|
if item.origText != nil {
|
||||||
|
strptr = item.origText
|
||||||
|
} else {
|
||||||
|
strptr = item.text
|
||||||
|
}
|
||||||
|
t.selected[item.text] = selectedItem{time.Now(), strptr}
|
||||||
} else {
|
} else {
|
||||||
delete(t.selected, item.text)
|
delete(t.selected, item.text)
|
||||||
}
|
}
|
||||||
|
@ -189,5 +189,18 @@ class TestGoFZF < MiniTest::Unit::TestCase
|
|||||||
tmux.until { |lines| lines.last !~ /^>/ }
|
tmux.until { |lines| lines.last !~ /^>/ }
|
||||||
tmux.close
|
tmux.close
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def test_fzf_multi_order
|
||||||
|
tmux.send_keys "seq 1 10 | fzf --multi > #{tempname}", :Enter
|
||||||
|
tmux.until { |lines| lines.last =~ /^>/ }
|
||||||
|
|
||||||
|
tmux.send_keys :Tab, :Up, :Up, :Tab, :Tab, :Tab, # 3, 2
|
||||||
|
'C-K', 'C-K', 'C-K', 'C-K', :BTab, :BTab, # 5, 6
|
||||||
|
:PgUp, 'C-J', :Down, :Tab, :Tab # 8, 7
|
||||||
|
tmux.until { |lines| lines[-2].include? '(6)' }
|
||||||
|
tmux.send_keys "C-M"
|
||||||
|
assert_equal %w[3 2 5 6 8 7], File.read(tempname).split($/)
|
||||||
|
tmux.close
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user