]> git.lizzy.rs Git - micro.git/blobdiff - cmd/micro/autocomplete.go
Merge pull request #1125 from nabeelomer/master
[micro.git] / cmd / micro / autocomplete.go
index 849042520ac3fa5570e4f7fbaa115e0f29358517..3ecc3f16569bf300612b95561e0cf6f3dffd7552 100644 (file)
@@ -4,8 +4,6 @@ import (
        "io/ioutil"
        "os"
        "strings"
-
-       "github.com/mitchellh/go-homedir"
 )
 
 var pluginCompletions []func(string) []string
@@ -18,19 +16,18 @@ var pluginCompletions []func(string) []string
 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
@@ -81,7 +78,8 @@ func CommandComplete(input string) (string, []string) {
 func HelpComplete(input string) (string, []string) {
        var suggestions []string
 
-       for topic, _ := range helpPages {
+       for _, file := range ListRuntimeFiles(RTHelp) {
+               topic := file.Name()
                if strings.HasPrefix(topic, input) {
                        suggestions = append(suggestions, topic)
                }
@@ -94,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 {
@@ -125,7 +142,64 @@ func OptionComplete(input string) (string, []string) {
        return chosen, suggestions
 }
 
-// MakeCompletion registeres a function from a plugin for autocomplete commands
+// 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))
@@ -145,3 +219,31 @@ func PluginComplete(complete Completion, input string) (chosen string, suggestio
        }
        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
+}