Don't rely on `after/plugin` for registering sources
FAQ
- [X] I have checked the FAQ and it didn't resolve my problem.
Announcement
- [X] I have checked Breaking change announcement.
Minimal reproducible full config
- nvim-cmp and a completion source (e.g. cmp-nvim-lsp) installed as
optplugins in the packpath -
packaddnvim-cmp and cmp-nvim-lsp within an autocommand (e.g.InsertEnter).
Description
Most completion sources rely on after/plugin to register themselves, and the impact on startup time can be quite heavy (especially when a lot of sources are installed).
For this reason, it can be desirable to install the plugins as opt plugins and lazy-load them (e.g. on an InsertEnter event).
But nvim-cmp sources rely on after/plugin to register themselves (for lack of an API).
Because Neovim doesn't source after scripts once the startup initialisation has completed, the sources won't register themselves and nvim-cmp will error when trying to pass them in via the setup function.
Steps to reproduce
- Install nvim-cmp and cmp-nvim-lsp to
opt - Create an autocommand for
InsertEnterwith a callback that-
packadd! nvim-cmp -
packadd cmp-nvim-lsp - calls
cmp.setupto add the source. -
packadd nvim-cmp
-
Expected behavior
No error. nvim-cmp and the LSP source configured and loaded on InsertEnter
Actual behavior
nvim-cmp errors when calling setup, due to the missing source.
Additional context
A potential solution would be to execute a :h User autocommand with the pattern CmpRegisterSourcePre at the start of the setup call, or in the main module that loads the setup function.
Sources could create an autocommand with that pattern to ensure they are registered at the appropriate time.
If you're open to the proposed solution, I'd be happy to contribute :smile:
hi i maintain a fork of nvim-cmp, magazine.nvim, and this looks like something interesting to implement
Is there a way to detect when something has been added to the runtimepath, rather than using packadd?
I'd like to be able to detect when something has been added to the runtimepath as well.
nvim-cmp can cache runtimepath and check it when on completion events.
Or you can use OptionSet autocmd.