X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=cmd%2Fmicro%2Fautocomplete.go;h=3ecc3f16569bf300612b95561e0cf6f3dffd7552;hb=61baa73d70750fc3cb235a2a806a64709605542b;hp=ad22bbb6e7725a912c22191ce02540e365d12ddd;hpb=2e3ee22aca2cb8f8bdf7d28984a4c0c0f32e75be;p=micro.git diff --git a/cmd/micro/autocomplete.go b/cmd/micro/autocomplete.go index ad22bbb6..3ecc3f16 100644 --- a/cmd/micro/autocomplete.go +++ b/cmd/micro/autocomplete.go @@ -4,10 +4,10 @@ import ( "io/ioutil" "os" "strings" - - "github.com/mitchellh/go-homedir" ) +var pluginCompletions []func(string) []string + // This file is meant (for now) for autocompletion in command mode, not // while coding. This helps micro autocomplete commands and then filenames // for example with `vsplit filename`. @@ -16,19 +16,18 @@ import ( func FileComplete(input string) (string, []string) { var sep string = string(os.PathSeparator) dirs := strings.Split(input, sep) + var files []os.FileInfo var err error if len(dirs) > 1 { - home, _ := homedir.Dir() + directories := strings.Join(dirs[:len(dirs)-1], sep) + sep - directories := strings.Join(dirs[:len(dirs)-1], sep) - if strings.HasPrefix(directories, "~") { - directories = strings.Replace(directories, "~", home, 1) - } + directories = ReplaceHome(directories) files, err = ioutil.ReadDir(directories) } else { files, err = ioutil.ReadDir(".") } + var suggestions []string if err != nil { return "", suggestions @@ -79,9 +78,9 @@ func CommandComplete(input string) (string, []string) { func HelpComplete(input string) (string, []string) { var suggestions []string - for _, topic := range helpFiles { + for _, file := range ListRuntimeFiles(RTHelp) { + topic := file.Name() if strings.HasPrefix(topic, input) { - suggestions = append(suggestions, topic) } } @@ -93,6 +92,25 @@ func HelpComplete(input string) (string, []string) { return chosen, suggestions } +// ColorschemeComplete tab-completes names of colorschemes. +func ColorschemeComplete(input string) (string, []string) { + var suggestions []string + files := ListRuntimeFiles(RTColorscheme) + + for _, f := range files { + if strings.HasPrefix(f.Name(), input) { + suggestions = append(suggestions, f.Name()) + } + } + + var chosen string + if len(suggestions) == 1 { + chosen = suggestions[0] + } + + return chosen, suggestions +} + func contains(s []string, e string) bool { for _, a := range s { if a == e { @@ -123,3 +141,109 @@ func OptionComplete(input string) (string, []string) { } return chosen, suggestions } + +// OptionValueComplete completes values for various options +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") + } + case "sucmd": + if strings.HasPrefix("sudo", input) { + suggestions = append(suggestions, "sudo") + } + if strings.HasPrefix("doas", input) { + suggestions = append(suggestions, "doas") + } + } + } + + 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)) + return Completion(-len(pluginCompletions)) +} + +// PluginComplete autocompletes from plugin function +func PluginComplete(complete Completion, input string) (chosen string, suggestions []string) { + idx := int(-complete) - 1 + + if len(pluginCompletions) <= idx { + return "", nil + } + suggestions = pluginCompletions[idx](input) + + if len(suggestions) == 1 { + chosen = suggestions[0] + } + return +} + +// PluginCmdComplete completes with possible choices for the `> plugin` command +func PluginCmdComplete(input string) (chosen string, suggestions []string) { + for _, cmd := range []string{"install", "remove", "search", "update", "list"} { + if strings.HasPrefix(cmd, input) { + suggestions = append(suggestions, cmd) + } + } + + if len(suggestions) == 1 { + chosen = suggestions[0] + } + return chosen, suggestions +} + +// PluginnameComplete completes with the names of loaded plugins +func PluginNameComplete(input string) (chosen string, suggestions []string) { + for _, pp := range GetAllPluginPackages() { + if strings.HasPrefix(pp.Name, input) { + suggestions = append(suggestions, pp.Name) + } + } + + if len(suggestions) == 1 { + chosen = suggestions[0] + } + return chosen, suggestions +}