在Lua中自动定义函数是否可能?

3

以下是我想定义的一些函数:

local function nmap(lhs, rhs, opts)
    keymap.set("n", lhs, rhs, opts)
end

local function imap(lhs, rhs, opts)
    keymap.set("i", lhs, rhs, opts)
end

local function vmap(lhs, rhs, opts)
    keymap.set("v", lhs, rhs, opts)
end

local function cmap(lhs, rhs, opts)
    keymap.set("c", lhs, rhs, opts)
end

local function omap(lhs, rhs, opts)
    keymap.set("o", lhs, rhs, opts)
end

然而这很重复。有没有更有效的方法来定义这些函数?每个函数中唯一不同的是一个字母(n、i、v、c、o)。我能否使用for循环来自动定义每个函数?

1个回答

3

你可以使用_G(全局环境表)来实现这一点。

local letters = {'n', 'i', 'v', 'c', 'o'}

for _, c in ipairs(letters) do
    _G[c..'map'] = function(...)
        keymap.set(c, ...)
    end
end

-- cmap(insert, arguments, here)

这其实在这个指南中也有说明。 请看The vim namespace章节。


只需小心不要覆盖任何重要变量(例如table或math库哈哈):)


还有,在任何Roblox Lua开发人员尝试之前,需要说明的是,这在Roblox脚本中不起作用,因为Roblox Lua是不同的。 - kingerman88
很遗憾,即使我一字不差地复制了你的解决方案,它对我仍然无效。它提示错误 "attempt to call global ...",意味着该函数不存在。这个解决方案在 Neovim 之外的常规 Lua 脚本中也不适用。 我现在使用的是 Neovim 的最新版本:0.7.2。 - Amarakon
糟糕,我的错,应该是for _, c in ipairs才能获取字符!@Amarakon现在试试 :) - kingerman88
谢谢,它起作用了。使用pairs而不是ipairs也可以。 - Amarakon
Roblox Lua 的哪个部分不同,会导致这里无法工作?_G 不可用吗? - Joseph Sible-Reinstate Monica
1
_G在Roblox Lua中并不指向全局环境。它只是一个在脚本之间共享的全局表格。(据我所知,这是出于安全原因)此外,Roblox还有另一个全局表shared,说实话有点尴尬lol @JosephSible-ReinstateMonica - kingerman88

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接