From 5a7ddb83302ea9f5323fe5a52574e4978c959af9 Mon Sep 17 00:00:00 2001 From: Zachary Yedidia Date: Sat, 23 Sep 2017 20:47:19 -0400 Subject: [PATCH] Add autocompletion for option values Closes #555 --- cmd/micro/autocomplete.go | 49 +++++++++++++++++++++++++++++++++++++++ cmd/micro/command.go | 2 +- cmd/micro/messenger.go | 5 ++++ 3 files changed, 55 insertions(+), 1 deletion(-) diff --git a/cmd/micro/autocomplete.go b/cmd/micro/autocomplete.go index 8cf96e29..9fba8f53 100644 --- a/cmd/micro/autocomplete.go +++ b/cmd/micro/autocomplete.go @@ -148,6 +148,55 @@ func OptionComplete(input string) (string, []string) { return chosen, suggestions } +func OptionValueComplete(inputOpt, input string) (string, []string) { + inputOpt = strings.TrimSpace(inputOpt) + var suggestions []string + localSettings := DefaultLocalSettings() + var optionVal interface{} + for k, option := range globalSettings { + if k == inputOpt { + optionVal = option + } + } + for k, option := range localSettings { + if k == inputOpt { + optionVal = option + } + } + + switch optionVal.(type) { + case bool: + if strings.HasPrefix("on", input) { + suggestions = append(suggestions, "on") + } else if strings.HasPrefix("true", input) { + suggestions = append(suggestions, "true") + } + if strings.HasPrefix("off", input) { + suggestions = append(suggestions, "off") + } else if strings.HasPrefix("false", input) { + suggestions = append(suggestions, "false") + } + case string: + switch inputOpt { + case "colorscheme": + _, suggestions = ColorschemeComplete(input) + case "fileformat": + if strings.HasPrefix("unix", input) { + suggestions = append(suggestions, "unix") + } + if strings.HasPrefix("dos", input) { + suggestions = append(suggestions, "dos") + } + } + } + + var chosen string + if len(suggestions) == 1 { + chosen = suggestions[0] + } + return chosen, suggestions +} + // MakeCompletion registers a function from a plugin for autocomplete commands func MakeCompletion(function string) Completion { pluginCompletions = append(pluginCompletions, LuaFunctionComplete(function)) diff --git a/cmd/micro/command.go b/cmd/micro/command.go index 926e69ac..0947cd77 100644 --- a/cmd/micro/command.go +++ b/cmd/micro/command.go @@ -90,7 +90,7 @@ func MakeCommand(name, function string, completions ...Completion) { // DefaultCommands returns a map containing micro's default commands func DefaultCommands() map[string]StrCommand { return map[string]StrCommand{ - "set": {"Set", []Completion{OptionCompletion, NoCompletion}}, + "set": {"Set", []Completion{OptionCompletion, OptionValueCompletion}}, "setlocal": {"SetLocal", []Completion{OptionCompletion, NoCompletion}}, "show": {"Show", []Completion{OptionCompletion, NoCompletion}}, "bind": {"Bind", []Completion{NoCompletion}}, diff --git a/cmd/micro/messenger.go b/cmd/micro/messenger.go index 5715be84..e9f72e1e 100644 --- a/cmd/micro/messenger.go +++ b/cmd/micro/messenger.go @@ -231,6 +231,7 @@ const ( OptionCompletion PluginCmdCompletion PluginNameCompletion + OptionValueCompletion ) // Prompt sends the user a message and waits for a response to be typed in @@ -296,6 +297,10 @@ func (m *Messenger) Prompt(prompt, placeholder, historyType string, completionTy chosen, suggestions = HelpComplete(currentArg) } else if completionType == OptionCompletion { chosen, suggestions = OptionComplete(currentArg) + } else if completionType == OptionValueCompletion { + if currentArgNum-1 > 0 { + chosen, suggestions = OptionValueComplete(args[currentArgNum-1], currentArg) + } } else if completionType == PluginCmdCompletion { chosen, suggestions = PluginCmdComplete(currentArg) } else if completionType == PluginNameCompletion {