From 2a0961701c4cabecc53d134ed1782e5612e64580 Mon Sep 17 00:00:00 2001 From: Gregory Mullen Date: Thu, 27 Jun 2019 10:33:11 -0700 Subject: Implement basic tab completion support Tab completion currently only works on commands. Contextual completion will be added in the future. --- widgets/aerc.go | 6 +++++- widgets/dirlist.go | 4 ++++ widgets/exline.go | 24 +++++++++++++++++------- 3 files changed, 26 insertions(+), 8 deletions(-) (limited to 'widgets') diff --git a/widgets/aerc.go b/widgets/aerc.go index 8aa1e2c..ade56d1 100644 --- a/widgets/aerc.go +++ b/widgets/aerc.go @@ -14,6 +14,7 @@ import ( type Aerc struct { accounts map[string]*AccountView cmd func(cmd string) error + complete func(cmd string) []string conf *config.AercConfig focused libui.Interactive grid *libui.Grid @@ -26,7 +27,7 @@ type Aerc struct { } func NewAerc(conf *config.AercConfig, logger *log.Logger, - cmd func(cmd string) error) *Aerc { + cmd func(cmd string) error, complete func(cmd string) []string) *Aerc { tabs := libui.NewTabs() @@ -49,6 +50,7 @@ func NewAerc(conf *config.AercConfig, logger *log.Logger, accounts: make(map[string]*AccountView), conf: conf, cmd: cmd, + complete: complete, grid: grid, logger: logger, statusbar: statusbar, @@ -289,6 +291,8 @@ func (aerc *Aerc) BeginExCommand() { }, func() { aerc.statusbar.Pop() aerc.focus(previous) + }, func(cmd string) []string { + return aerc.complete(cmd) }) aerc.statusbar.Push(exline) aerc.focus(exline) diff --git a/widgets/dirlist.go b/widgets/dirlist.go index 2b4773a..71cf79d 100644 --- a/widgets/dirlist.go +++ b/widgets/dirlist.go @@ -40,6 +40,10 @@ func NewDirectoryList(acctConf *config.AccountConfig, uiConf *config.UIConfig, return dirlist } +func (dirlist *DirectoryList) List() []string { + return dirlist.dirs +} + func (dirlist *DirectoryList) UpdateList(done func(dirs []string)) { var dirs []string dirlist.worker.PostAction( diff --git a/widgets/exline.go b/widgets/exline.go index ff18d13..e984ee1 100644 --- a/widgets/exline.go +++ b/widgets/exline.go @@ -8,17 +8,21 @@ import ( type ExLine struct { ui.Invalidatable - cancel func() - commit func(cmd string) - input *ui.TextInput + cancel func() + commit func(cmd string) + tabcomplete func(cmd string) []string + input *ui.TextInput } -func NewExLine(commit func(cmd string), cancel func()) *ExLine { +func NewExLine(commit func(cmd string), cancel func(), + tabcomplete func(cmd string) []string) *ExLine { + input := ui.NewTextInput("").Prompt(":") exline := &ExLine{ - cancel: cancel, - commit: commit, - input: input, + cancel: cancel, + commit: commit, + tabcomplete: tabcomplete, + input: input, } input.OnInvalidate(func(d ui.Drawable) { exline.Invalidate() @@ -48,6 +52,12 @@ func (ex *ExLine) Event(event tcell.Event) bool { case tcell.KeyEsc, tcell.KeyCtrlC: ex.input.Focus(false) ex.cancel() + case tcell.KeyTab: + complete := ex.tabcomplete(ex.input.StringLeft()) + if len(complete) == 1 { + ex.input.Set(complete[0] + " " + ex.input.StringRight()) + } + ex.Invalidate() default: return ex.input.Event(event) } -- cgit v1.2.3