Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

IsWhitespace from util package not working #3297

Closed
dei-layborer opened this issue May 16, 2024 · 6 comments
Closed

IsWhitespace from util package not working #3297

dei-layborer opened this issue May 16, 2024 · 6 comments

Comments

@dei-layborer
Copy link

dei-layborer commented May 16, 2024

Description of the problem or steps to reproduce

I'm working on a plugin, and tried to use IsWhitespace(rune), defined in the util package. The relevant code follows:

local mutil = import("micro/util")

-- snip

function preRune(bp, r)
   
   -- snip

   -- NOTE: prevChar is defined earlier
   if mutil.IsWhitespace(prevChar) then
      -- snip
   end
end

When preRune is triggered, micro crashes with an error pointing to the if statement and the error message attempt to call a non-function object.

From what little I know of Lua, it seems like this means IsWhitespace isn't accessible?

Specifications

Commit hash: 225927b
OS: Linux (openSUSE tumbleweed, specifically)
Terminal: Konsole

@Andriamanitra
Copy link
Contributor

The "micro/util" you can import in Lua is not the same thing as the internal util package. The only functions it exposes are:

micro/cmd/micro/initlua.go

Lines 148 to 165 in 9176508

func luaImportMicroUtil() *lua.LTable {
pkg := ulua.L.NewTable()
ulua.L.SetField(pkg, "RuneAt", luar.New(ulua.L, util.LuaRuneAt))
ulua.L.SetField(pkg, "GetLeadingWhitespace", luar.New(ulua.L, util.LuaGetLeadingWhitespace))
ulua.L.SetField(pkg, "IsWordChar", luar.New(ulua.L, util.LuaIsWordChar))
ulua.L.SetField(pkg, "String", luar.New(ulua.L, util.String))
ulua.L.SetField(pkg, "Unzip", luar.New(ulua.L, util.Unzip))
ulua.L.SetField(pkg, "Version", luar.New(ulua.L, util.Version))
ulua.L.SetField(pkg, "SemVersion", luar.New(ulua.L, util.SemVersion))
ulua.L.SetField(pkg, "HttpRequest", luar.New(ulua.L, util.HttpRequest))
ulua.L.SetField(pkg, "CharacterCountInString", luar.New(ulua.L, util.CharacterCountInString))
ulua.L.SetField(pkg, "RuneStr", luar.New(ulua.L, func(r rune) string {
return string(r)
}))
return pkg
}

(also documented in help plugins)

@dei-layborer
Copy link
Author

I see. That being the case, it seems like this part of plugins.md is misleading:

This may seem like a small list of available functions but some of the objects returned by the functions have many methods. The Lua plugin may access any public methods of an object returned by any of the functions above. Unfortunately it is not possible to list all the available functions on this page. Please go to the internal documentation at https://pkg.go.dev/github.com/zyedidia/micro/v2/internal to see the full list of available methods. Note that only methods of types that are available to plugins via the functions above can be called from a plugin.

@Andriamanitra
Copy link
Contributor

The documentation is correct although I can see how it could be confusing if you don't read it carefully: import is not on the list of functions the documentation is referring to, and it just returns a regular Lua table with some functions in it. Those functions (import("micro/util").HttpRequest, import("micro").CurPane, etc.) return the (Go) objects the documentation is referring to. The (Go) objects are userdata on the Lua side, and you can indeed access any of their public methods.

@dei-layborer
Copy link
Author

I more meant that it says to go look at the internal documentation at that link "to see the full list of available methods," but not all of those methods are actually available.

@dmaluka
Copy link
Collaborator

dmaluka commented May 17, 2024

IsWhitespace() is not a method.

The documentation explicitly warns: "Note that only methods of types that are available to plugins via the functions above can be called from a plugin."

For example, one of those "functions above" is CurPane(), it returns a BufPane object, and all the methods of this object indeed can be invoked from Lua.

local bp = micro.CurPane()
bp:AddTab()

etc.

@dei-layborer
Copy link
Author

Again, this is not clear from the documentation for the reasons I stated above. But I won't belabor it at this point.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants