]> git.lizzy.rs Git - micro.git/blobdiff - cmd/micro/autocomplete.go
Fix: mouse clicking with softwrap
[micro.git] / cmd / micro / autocomplete.go
index 26c32d0f62ceb4b4857de6eed1bb25a11f7f6e66..47aeca7344821599c1eeec04dceec401aa3bcb44 100644 (file)
@@ -8,19 +8,24 @@ import (
        "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`.
 
 // FileComplete autocompletes filenames
 func FileComplete(input string) (string, []string) {
-       dirs := strings.Split(input, "/")
+       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], "/")
+               directories := strings.Join(dirs[:len(dirs)-1], sep) + sep
+
                if strings.HasPrefix(directories, "~") {
                        directories = strings.Replace(directories, "~", home, 1)
                }
@@ -28,6 +33,7 @@ func FileComplete(input string) (string, []string) {
        } else {
                files, err = ioutil.ReadDir(".")
        }
+
        var suggestions []string
        if err != nil {
                return "", suggestions
@@ -35,7 +41,7 @@ func FileComplete(input string) (string, []string) {
        for _, f := range files {
                name := f.Name()
                if f.IsDir() {
-                       name += "/"
+                       name += sep
                }
                if strings.HasPrefix(name, dirs[len(dirs)-1]) {
                        suggestions = append(suggestions, name)
@@ -45,13 +51,13 @@ func FileComplete(input string) (string, []string) {
        var chosen string
        if len(suggestions) == 1 {
                if len(dirs) > 1 {
-                       chosen = strings.Join(dirs[:len(dirs)-1], "/") + "/" + suggestions[0]
+                       chosen = strings.Join(dirs[:len(dirs)-1], sep) + sep + suggestions[0]
                } else {
                        chosen = suggestions[0]
                }
        } else {
                if len(dirs) > 1 {
-                       chosen = strings.Join(dirs[:len(dirs)-1], "/") + "/"
+                       chosen = strings.Join(dirs[:len(dirs)-1], sep) + sep
                }
        }
 
@@ -78,9 +84,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)
                }
        }
@@ -122,3 +128,50 @@ func OptionComplete(input string) (string, []string) {
        }
        return chosen, suggestions
 }
+
+// MakeCompletion registeres 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
+}
+
+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
+}
+
+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
+}