Switch chosen completions

This commit is contained in:
c-bata 2017-07-15 22:55:11 +09:00
parent a832d3e7c6
commit 3ac086d7f0
2 changed files with 18 additions and 6 deletions

@ -17,6 +17,7 @@ type Prompt struct {
title string title string
executor Executor executor Executor
completer Completer completer Completer
chosen int
} }
func (p *Prompt) Run() { func (p *Prompt) Run() {
@ -41,14 +42,25 @@ func (p *Prompt) Run() {
res := p.executor(p.buf) res := p.executor(p.buf)
p.renderer.BreakLine(p.buf, res) p.renderer.BreakLine(p.buf, res)
p.buf = NewBuffer() p.buf = NewBuffer()
p.chosen = -1
} else if ac.Key == ControlC || ac.Key == ControlD { } else if ac.Key == ControlC || ac.Key == ControlD {
return return
} else if ac.Key == BackTab || ac.Key == Up {
p.chosen -= 1
} else if ac.Key == Tab || ac.Key == ControlI || ac.Key == Down {
p.chosen += 1
} else { } else {
InputHandler(ac, p.buf) InputHandler(ac, p.buf)
p.chosen = -1
} }
completions := p.completer(p.buf) completions := p.completer(p.buf)
p.renderer.Render(p.buf, completions) if p.chosen >= len(completions) {
p.chosen = -1
} else if p.chosen < -1 {
p.chosen = len(completions) - 1
}
p.renderer.Render(p.buf, completions, p.chosen)
case w := <-winSizeCh: case w := <-winSizeCh:
p.renderer.UpdateWinSize(w) p.renderer.UpdateWinSize(w)
case e := <-exitCh: case e := <-exitCh:
@ -130,5 +142,6 @@ func NewPrompt(executor Executor, completer Completer, maxCompletions uint8) *Pr
buf: NewBuffer(), buf: NewBuffer(),
executor: executor, executor: executor,
completer: completer, completer: completer,
chosen: -1,
} }
} }

@ -6,7 +6,6 @@ type Render struct {
out *VT100Writer out *VT100Writer
row uint16 row uint16
col uint16 // sigwinchで送られてくる列数を常に見ながら、prefixのlengthとbufferのcursor positionを比べて、completionの表示位置をずらす col uint16 // sigwinchで送られてくる列数を常に見ながら、prefixのlengthとbufferのcursor positionを比べて、completionの表示位置をずらす
chosen uint8 // the index number of a chosen completion
maxCompletions uint8 maxCompletions uint8
} }
@ -40,7 +39,7 @@ func (r *Render) UpdateWinSize(ws *WinSize) {
return return
} }
func (r *Render) RenderCompletion(words []string) { func (r *Render) RenderCompletion(words []string, chosen int) {
if len(words) == 0 { if len(words) == 0 {
return return
} }
@ -51,7 +50,7 @@ func (r *Render) RenderCompletion(words []string) {
r.out.SetColor("white", "teal") r.out.SetColor("white", "teal")
for i := 0; i < l; i++ { for i := 0; i < l; i++ {
r.out.CursorDown(1) r.out.CursorDown(1)
if i == int(r.chosen) { if i == chosen {
r.out.SetColor("white", "turquoise") r.out.SetColor("white", "turquoise")
} else { } else {
r.out.SetColor("black", "cyan") r.out.SetColor("black", "cyan")
@ -76,11 +75,11 @@ func (r *Render) Erase(buffer *Buffer) {
return return
} }
func (r *Render) Render(buffer *Buffer, completions []string) { func (r *Render) Render(buffer *Buffer, completions []string, chosen int) {
line := buffer.Document().CurrentLine() line := buffer.Document().CurrentLine()
r.out.WriteStr(line) r.out.WriteStr(line)
r.out.CursorBackward(len(line) - buffer.CursorPosition) r.out.CursorBackward(len(line) - buffer.CursorPosition)
r.RenderCompletion(completions) r.RenderCompletion(completions, chosen)
r.out.Flush() r.out.Flush()
} }