about summary refs log tree commit diff stats
path: root/widgets/exline.go
diff options
context:
space:
mode:
authorGregory Mullen <greg@cmdline.org>2019-06-27 10:33:11 -0700
committerDrew DeVault <sir@cmpwn.com>2019-06-29 14:24:19 -0400
commit2a0961701c4cabecc53d134ed1782e5612e64580 (patch)
tree57952ac82fb7104113ca7fc0e25dc3d225f77ea7 /widgets/exline.go
parent177651bddab145c8a56cdfeb0d57b5fd95a6d0e2 (diff)
downloadaerc-2a0961701c4cabecc53d134ed1782e5612e64580.tar.gz
Implement basic tab completion support
Tab completion currently only works on commands. Contextual completion
will be added in the future.
Diffstat (limited to 'widgets/exline.go')
-rw-r--r--widgets/exline.go24
1 files changed, 17 insertions, 7 deletions
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)
 		}