如何在Lua解释器中创建新命令

时间:2017-01-29 00:46:18

标签: lua

编辑:我在ubuntu上

所以在lua解释器中,您显然可以调用内置函数,如

  

>使用functionName(functionArgs)

我想创建一个新的函数,每当我输入时,lua解释器就会识别它。

有没有办法可以将我的函数添加到lua解释器中的本机识别函数列表中,这样我就不必在我写入的文件上调用dofile(),然后从那里运行它。

TLDR 我希望能够输入

  

> myNewFunction(functionArgs)

在lua翻译中随时让翻译自动知道我在说什么功能。

如果这是不可能的,那么我至少可以在任何目录中运行dofile(myFile),而lua解释器总能找到包含我的函数的特定文件吗?

感谢您的帮助!

1 个答案:

答案 0 :(得分:7)

要查看的是LUA_INIT(或LUA_INIT_5_3,...)环境变量:

  

在没有选项-E的情况下调用时,解释器在运行任何参数之前检查环境变量LUA_INIT_5_3(如果未定义版本化名称,则为LUA_INIT)。如果变量内容的格式为@filename,则lua执行该文件。否则,lua会执行字符串本身    - https://www.lua.org/manual/5.3/manual.html#7

如果你有一个固定的功能列表,你可以简单地创建一个文件(例如${HOME}/.lua_init.lua,在Windows上可能会尝试%APPDATA%\something%USERPROFILE%\something。)然后,将你的功能放在那里文件并设置指向该文件的LUA_INIT个环境变量之一,在文件路径前加上' @'。 unixoid OSen的小例子:

$ cd        # just to ensure that we are in ${HOME}
$ echo "function ping( )  print 'pong'  end" >> .lua_init.lua
$ echo 'export LUA_INIT="@${HOME}/.lua_init.lua"' >> .profile
$ source .profile
$ lua
Lua 5.3.3  Copyright (C) 1994-2016 Lua.org, PUC-Rio
> ping()
pong

(对于Windows,请参阅下面的Egor Skriptunoff的评论。)

如果你想从当前目录自动加载东西,那就更难了。一种简单的方法是设置上述内容,然后添加例如。

-- autoload '.autoload.lua' in current directory if present
if io.open( ".autoload.lua" ) then -- exists, run it
    -- use pcall so we don't brick the interpreter if the
    -- file contains an error but can continue anyway
    local ok, err = pcall( dofile, ".autoload.lua" )
    if not ok then  print( "AUTOLOAD ERROR: ", err )  end
end
-- GAPING SECURITY HOLE WARNING: automatically running a file
-- with the right name in any folder could run untrusted code.
-- If you actually use this, add a whitelist of known-good
-- project directories or at the very least blacklist your
-- downloads folder, /tmp, and whatever else might end up
-- containing a file with the right name but not written by you.

进入LUA_INIT文件。然后,要自动加载项目/目录特定的函数,根据需要创建.autoload.lua dofile个或require个文件,定义函数,...

Fancier解决方案(每个文件夹不需要额外的文件)将更难做,但您可以运行任意Lua代码来构建您需要的任何内容。