SpaceVim安装gitsigns.nvim报错:vimL函数不可在lua循环回调中调用
问题原因
报错核心是gitsigns.setup()执行时机错误。
两种配置方案中,bootstrap_after、hook_add的执行逻辑都处于Neovim的luv异步回调上下文,此时Neovim禁止在lua循环回调中调用vimL函数,而gitsigns初始化时内部协程会触发相关vimL调用,直接抛出E5560错误。
原生Neovim配置里,setup调用是在plug#end()执行完成、回到Vim主事件循环后执行的,因此不会触发该限制。
解决方案
两种方案二选一即可:
方案1:通过VimEnter自动命令延迟初始化
- 在
~/.SpaceVim.d/init.toml中声明插件,无需添加hook_add配置:
[[custom_plugins]] name = 'lewis6991/gitsigns.nvim' merged = false
- 在
~/.SpaceVim.d/autoload/myspacevim.vim的after函数中绑定VimEnter事件,等Vim完全启动进入主循环后再执行gitsigns初始化:
function! myspacevim#after() abort augroup GitsignsCustomInit autocmd! autocmd VimEnter * lua require('gitsigns').setup({}) augroup END endfunction
方案2:用vim.schedule调度初始化逻辑
无需编写单独的autoload函数,直接在插件hook_add中用vim.schedule包裹setup逻辑,将执行逻辑从当前luv回调上下文调度到Vim主事件循环队列即可:
[[custom_plugins]] name = 'lewis6991/gitsigns.nvim' merged = false hook_add = ''' lua << EOF vim.schedule(function() require('gitsigns').setup({}) end) EOF '''
两种方案的最终运行效果和原生Neovim下直接初始化完全一致,不会再触发协程相关报错。
内容的提问来源于stack exchange,提问作者OlivierLarue
相关产品推荐
相关产品推荐

