Neovim中用string.gsub配置快捷键报错:期望table却得到数字
Neovim批量标签页快捷键配置报错解决
问题场景
在Neovim的keymaps.lua中尝试批量生成跳转到1-9标签页的快捷键,代码如下:
local keymap = vim.keymap -- keymaps -- go to tab [1-9] for i = 1, 9, 1 do keymap.set("n", string.gsub("<leader>@", "@", i), string.gsub("<cmd>BufferLineGoToBuffer @<CR>", "@", i)) end
预期生成的单条快捷键配置为:
keymap.set("n", "<leader>1", "<cmd>BufferLineGoToBuffer 1<CR>") ... keymap.set("n", "<leader>9", "<cmd>BufferLineGoToBuffer 9<CR>")
但运行时触发报错:
Error detected while processing /Users/diego/.config/nvim/init.lua: E5113: Error while calling lua chunk: vim/keymap.lua:0: opts: expected table, got number stack traceback: [C]: in function 'error' vim/shared.lua: in function 'validate' vim/keymap.lua: in function 'set' /Users/diego/.config/nvim/lua/diegoulloao/core/keymaps.lua:26: in main chunk [C]: in function 'require' /Users/diego/.config/nvim/lua/diegoulloao/bootstrap.lua:6: in main chunk [C]: in function 'require' /Users/diego/.config/nvim/init.lua:2: in main chunk
测试string.gsub代码时发现输出末尾带有额外数字1,示例:
<cmd>BufferLineGoToBuffer 1<CR> 1
报错原因
Lua的string.gsub函数默认返回两个值:替换后的字符串,以及替换操作发生的次数。这里每次只替换了一个@符号,所以第二个返回值是1。
当直接将string.gsub的结果传入keymap.set时,这个额外的数字1会被当成keymap.set的第四个参数(配置选项opts),而opts要求必须是table类型,因此触发类型校验错误。
解决方法
方法1:捕获string.gsub的第一个返回值
用括号包裹string.gsub调用,强制只取第一个返回值:
local keymap = vim.keymap for i = 1, 9 do keymap.set("n", (string.gsub("<leader>@", "@", i)), (string.gsub("<cmd>BufferLineGoToBuffer @<CR>", "@", i))) end
方法2:先赋值给变量再传入
将替换结果提前赋值给变量,避免多值传递:
local keymap = vim.keymap for i = 1, 9 do local lhs = string.gsub("<leader>@", "@", i) local rhs = string.gsub("<cmd>BufferLineGoToBuffer @<CR>", "@", i) keymap.set("n", lhs, rhs) end
方法3:用字符串拼接替代gsub(更简洁)
直接通过字符串拼接生成快捷键,无需gsub:
local keymap = vim.keymap for i = 1, 9 do keymap.set("n", "<leader>" .. i, "<cmd>BufferLineGoToBuffer " .. i .. "<CR>") end
内容的提问来源于stack exchange,提问作者Diego Ulloa
相关产品推荐
相关产品推荐

