使用以下代码:
local keymap = vim.keymap
local opts = { noremap = true, silent = true }
function jumpToClassDef()
local test1 = ""
local myClass = "<cmd> tag ." .. vim.fn.expand('<cword>') .. "<cr>"
assert(loadstring(myClass))
return print(myClass)
end
keymap.set("n", "<leader>-", function() jumpToClassDef() end, opts)
当我将光标放在
test1
上并点击 <leader>-
时,我收到以下错误:
unexpected symbol near <
为什么会出现此错误以及如何解决?
回答你的主要问题:要在 Neovim 的命令中使用字符串值,你只需使用字符串即可;但是,它必须是格式良好的 Neovim 命令。
tag
命令的使用推断,您似乎想要执行标签搜索来查找某些标识符的定义。为此,您通常可以通过按 :
从正常模式进入命令模式,然后输入以下内容:
tag <some_identifier>
要通过 Neovim 中的 Lua 代码执行相同操作,您可以使用上述内容作为字符串参数来调用
vim.cmd
:
vim.cmd(":tag <some_identifier>")
在你的例子中,你想使用当前光标位置下的单词作为要搜索的标识符,因此,要调用的函数变为:
vim.cmd(":tag " .. vim.fn.expand("<cword>")
最后,您可以通过以下方式将此功能映射到
<leader>-
键序列:
vim.keymap.set("n", "<leader>-", function()
vim.cmd(":tag " .. vim.fn.expand("<cword>"))
end, { noremap = true, silent = true })
为了解决有关意外符号的第二个问题,错误来自对
loadstring
的调用。 loadstring
获取一个块,编译它,并返回一个可以调用来执行该块的函数。在解析传入的块时,Lua 意外地遇到了尖括号,因为它不是语言语法的一部分,因此出现错误。解决方案是仅将有效的 Lua 语法和格式良好的字符串传递给 loadstring
。但是,您不需要在 Neovim 中使用它。请注意,自 Lua 5.2 以来,loadstring
已被弃用。您现在应该只使用 load
。