mirror of
https://github.com/zyedidia/micro.git
synced 2026-03-25 18:07:07 +09:00
allow plugins to register autocomplete functions
This commit is contained in:
@@ -8,6 +8,8 @@ import (
|
|||||||
"github.com/mitchellh/go-homedir"
|
"github.com/mitchellh/go-homedir"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
var pluginCompletions []func(string) []string
|
||||||
|
|
||||||
// This file is meant (for now) for autocompletion in command mode, not
|
// This file is meant (for now) for autocompletion in command mode, not
|
||||||
// while coding. This helps micro autocomplete commands and then filenames
|
// while coding. This helps micro autocomplete commands and then filenames
|
||||||
// for example with `vsplit filename`.
|
// for example with `vsplit filename`.
|
||||||
@@ -122,3 +124,24 @@ func OptionComplete(input string) (string, []string) {
|
|||||||
}
|
}
|
||||||
return chosen, suggestions
|
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
|
||||||
|
}
|
||||||
|
|||||||
@@ -222,6 +222,8 @@ func (m *Messenger) Prompt(prompt, historyType string, completionTypes ...Comple
|
|||||||
chosen, suggestions = HelpComplete(currentArg)
|
chosen, suggestions = HelpComplete(currentArg)
|
||||||
} else if completionType == OptionCompletion {
|
} else if completionType == OptionCompletion {
|
||||||
chosen, suggestions = OptionComplete(currentArg)
|
chosen, suggestions = OptionComplete(currentArg)
|
||||||
|
} else if completionType < NoCompletion {
|
||||||
|
chosen, suggestions = PluginComplete(completionType, currentArg)
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(suggestions) > 1 {
|
if len(suggestions) > 1 {
|
||||||
|
|||||||
@@ -294,6 +294,7 @@ func main() {
|
|||||||
L.SetGlobal("HandleCommand", luar.New(L, HandleCommand))
|
L.SetGlobal("HandleCommand", luar.New(L, HandleCommand))
|
||||||
L.SetGlobal("HandleShellCommand", luar.New(L, HandleShellCommand))
|
L.SetGlobal("HandleShellCommand", luar.New(L, HandleShellCommand))
|
||||||
L.SetGlobal("GetLeadingWhitespace", luar.New(L, GetLeadingWhitespace))
|
L.SetGlobal("GetLeadingWhitespace", luar.New(L, GetLeadingWhitespace))
|
||||||
|
L.SetGlobal("MakeCompletion", luar.New(L, MakeCompletion))
|
||||||
|
|
||||||
// Used for asynchronous jobs
|
// Used for asynchronous jobs
|
||||||
L.SetGlobal("JobStart", luar.New(L, JobStart))
|
L.SetGlobal("JobStart", luar.New(L, JobStart))
|
||||||
|
|||||||
@@ -85,6 +85,30 @@ func LuaFunctionCommand(function string) func([]string) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// LuaFunctionComplete returns a function which can be used for autocomplete in plugins
|
||||||
|
func LuaFunctionComplete(function string) func(string) []string {
|
||||||
|
return func(input string) (result []string) {
|
||||||
|
|
||||||
|
res, err := Call(function, input)
|
||||||
|
if err != nil {
|
||||||
|
TermMessage(err)
|
||||||
|
}
|
||||||
|
if tbl, ok := res.(*lua.LTable); !ok {
|
||||||
|
TermMessage(function, "should return a table of strings")
|
||||||
|
} else {
|
||||||
|
for i := 1; i <= tbl.Len(); i++ {
|
||||||
|
val := tbl.RawGetInt(i)
|
||||||
|
if v, ok := val.(lua.LString); !ok {
|
||||||
|
TermMessage(function, "should return a table of strings")
|
||||||
|
} else {
|
||||||
|
result = append(result, string(v))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func LuaFunctionJob(function string) func(string, ...string) {
|
func LuaFunctionJob(function string) func(string, ...string) {
|
||||||
return func(output string, args ...string) {
|
return func(output string, args ...string) {
|
||||||
_, err := Call(function, unpack(append([]string{output}, args...))...)
|
_, err := Call(function, unpack(append([]string{output}, args...))...)
|
||||||
|
|||||||
Reference in New Issue
Block a user