NeoVim - 检查 Lua 中是否存在 Vim 函数

3
我计划在NeoVim中使用vim-plug。因此,我的init.lua文件将包含函数调用,例如:
vim.fn['plug#begin'](vim.fn.stdpath('data') .. '/plugged')    
vim.fn['plug#']('hoob3rt/lualine.nvim')    

然而,我不想假定 vim-plug 已经安装。如果 vim-plug 没有安装,我希望我的 init.lua 文件能够优雅地降级,而不是抛出错误。

E5113: Error while calling lua chunk: Vim:E117: Unknown function: plug#begin
stack traceback:
        [C]: in function 'plug#begin'
        /Users/andy/.config/nvim/init.lua:8: in main chunk

如何在尝试调用vim-plug函数之前检查它们是否存在?

我尝试使用print(vim.fn['plug#begin']),但出于某种原因,它打印出一个非空值:function: 0x0104ba36f0,即使该函数不存在。

1个回答

2
我尝试了print(vim.fn['plug#begin']),但由于某种原因它打印了一个非空值:function: 0x0104ba36f0,即使该函数不存在。

据推测,它返回了一个引发您遇到的错误的函数。因此,我建议使用pcall

local success, error = pcall(vim.fn['plug#begin'], vim.fn.stdpath('data') .. '/plugged')
if not success then --[[fail gracefully]] end

注意:这会捕获任何错误,因此您可能需要执行一些检查,例如if error:find"Unknown function" then ... end,以仅捕获特定的错误。


谢谢提供的解决方法。我现在正在使用它。我已经在这个问题中请求一个更简洁的方法:https://github.com/neovim/neovim/issues/19271 - Andy Carlson
2
为什么不使用 :help exists() 呢? - Justin M. Keyes
1
@JustinM.Keyes exists() 实际上不起作用,因为 vim-plug 是自动加载的,所以 exists() 会返回 false,直到你在 NeoVim 中触发某些操作来查找插件并加载它,例如调用 vim.fn['plug#begin']。在你这样做之后,exists() 的输出将是准确的。 - Andy Carlson

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