如何在Lua中使用字符串值作为命令

问题描述 投票:0回答:1

使用以下代码:

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 <

为什么会出现此错误以及如何解决?

lua neovim
1个回答
0
投票

回答你的主要问题:要在 Neovim 的命令中使用字符串值,你只需使用字符串即可;但是,它必须是格式良好的 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

© www.soinside.com 2019 - 2024. All rights reserved.