mirror of
https://github.com/peco/peco.git
synced 2026-09-10 07:16:29 -04:00
75 lines
1.5 KiB
Go
75 lines
1.5 KiB
Go
package peco
|
|
|
|
import "github.com/nsf/termbox-go"
|
|
|
|
type Input struct {
|
|
*Ctx
|
|
}
|
|
|
|
func (i *Input) Loop() {
|
|
i.AddWaitGroup()
|
|
defer i.ReleaseWaitGroup()
|
|
|
|
for {
|
|
select {
|
|
case <-i.LoopCh(): // can only fall here if we closed c.loopCh
|
|
return
|
|
default:
|
|
ev := termbox.PollEvent()
|
|
switch ev.Type {
|
|
case termbox.EventError:
|
|
//update = false
|
|
case termbox.EventResize:
|
|
i.DrawMatches(nil)
|
|
case termbox.EventKey:
|
|
i.handleKeyEvent(ev)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
func (i *Input) handleKeyEvent(ev termbox.Event) {
|
|
switch ev.Key {
|
|
case termbox.KeyEsc:
|
|
close(i.LoopCh())
|
|
case termbox.KeyEnter:
|
|
if len(i.current) == 1 {
|
|
i.result = i.current[0].line
|
|
} else if i.selectedLine > 0 && i.selectedLine < len(i.current) {
|
|
i.result = i.current[i.selectedLine-1].line
|
|
}
|
|
close(i.LoopCh())
|
|
case termbox.KeyArrowRight:
|
|
i.PagingCh() <- ToNextPage
|
|
i.DrawMatches(nil)
|
|
case termbox.KeyArrowLeft:
|
|
i.PagingCh() <- ToPrevPage
|
|
i.DrawMatches(nil)
|
|
case termbox.KeyArrowUp, termbox.KeyCtrlK:
|
|
i.PagingCh() <- ToPrevLine
|
|
i.DrawMatches(nil)
|
|
case termbox.KeyArrowDown, termbox.KeyCtrlJ:
|
|
i.PagingCh() <- ToNextLine
|
|
i.DrawMatches(nil)
|
|
case termbox.KeyBackspace, termbox.KeyBackspace2:
|
|
if len(i.query) > 0 {
|
|
i.query = i.query[:len(i.query)-1]
|
|
if len(i.query) > 0 {
|
|
i.ExecQuery(string(i.query))
|
|
} else {
|
|
i.current = nil
|
|
i.DrawMatches(nil)
|
|
}
|
|
}
|
|
default:
|
|
if ev.Key == termbox.KeySpace {
|
|
ev.Ch = ' '
|
|
}
|
|
|
|
if ev.Ch > 0 {
|
|
i.query = append(i.query, ev.Ch)
|
|
i.ExecQuery(string(i.query))
|
|
}
|
|
}
|
|
}
|