Adapting Vim-plug Examples For Lazy.nvim A Comprehensive Guide
Migrating from one plugin manager to another can often feel like translating a foreign language. You understand the core concepts, but the syntax and structure are just different enough to cause confusion. If you're transitioning from vim-plug to Lazy.nvim and trying to adapt configurations, particularly for complex plugins like those in the nvim-cmp
ecosystem (such as cmp-zotcite
), you're in the right place. This guide will walk you through the process, ensuring a smooth transition and a fully functional setup.
Understanding the Landscape: vim-plug vs. Lazy.nvim
Before diving into specific examples, let's establish a foundational understanding of the two plugin managers.
vim-plug
- Simple and Synchronous: vim-plug is known for its straightforward syntax and synchronous plugin loading. This means plugins are loaded in the order they appear in your configuration file.
- Traditional Block Configuration: vim-plug typically uses a block-based configuration within your
init.vim
orinit.lua
file, demarcated byplug#begin()
andplug#end()
. - Manual Dependency Management: While vim-plug can handle dependencies, it often requires explicit declaration and management.
Lazy.nvim
- Asynchronous and Lazy Loading: Lazy.nvim, as the name suggests, embraces asynchronous plugin loading and lazy loading. This significantly improves Neovim's startup time by only loading plugins when they're needed.
- Modular Configuration: Lazy.nvim encourages a modular approach, where each plugin has its own configuration file, typically within a
plugins
directory. - Automatic Dependency Management: Lazy.nvim excels at automatically detecting and managing plugin dependencies, simplifying the configuration process.
- Lua-Centric: While vim-plug can be used with both Vimscript and Lua, Lazy.nvim is designed with Lua in mind, making it the preferred choice for modern Neovim configurations.
The Challenge: Adapting cmp-zotcite
from vim-plug to Lazy.nvim
cmp-zotcite
is a Neovim plugin that integrates with Zotero, a popular research management tool, to provide citation completion within your editor. It leverages nvim-cmp
, a powerful completion plugin framework, and zotcite
, a plugin that interacts with Zotero's database. Adapting this setup from vim-plug to Lazy.nvim involves several key steps:
- Plugin Installation: Moving the plugin declarations from vim-plug's block configuration to Lazy.nvim's modular structure.
- Dependency Management: Ensuring that
nvim-cmp
,zotcite
, and any other dependencies are correctly installed and loaded. - Configuration Translation: Converting vim-plug-specific configuration snippets to Lazy.nvim-compatible Lua code.
- Lazy Loading Configuration: Optimizing plugin loading by using the
event
key to load plugins on demand.
Step-by-Step Guide to Adapting cmp-zotcite
Let's walk through the process of adapting a vim-plug configuration for cmp-zotcite
to Lazy.nvim. We'll assume you have a basic understanding of both plugin managers and Neovim's configuration structure.
1. Project Setup
First, if you haven't already, ensure you have Lazy.nvim installed. Refer to the Lazy.nvim documentation for installation instructions. The basic idea is to clone the Lazy.nvim repository into your Neovim packpath
. Once Lazy.nvim is set up, create a plugins
directory within your Neovim configuration directory (usually ~/.config/nvim/
). This is where you'll place your plugin configuration files.
2. Plugin Declaration
In vim-plug, you might have something like this in your init.vim
or init.lua
:
call plug#begin('~/.config/nvim/plugged')
Plug 'hrsh7th/nvim-cmp'
Plug 'jalvesaq/zotcite'
Plug 'jalvesaq/cmp-zotcite'
call plug#end()
With Lazy.nvim, you'll create a separate Lua file for each plugin. Let's start with nvim-cmp
. Create a file named cmp.lua
inside your plugins
directory (~/.config/nvim/plugins/cmp.lua
) and add the following:
return {
'hrsh7th/nvim-cmp',
dependencies = {
'hrsh7th/cmp-nvim-lsp',
'hrsh7th/cmp-buffer',
'hrsh7th/cmp-path',
'saadparwaiz1/cmp_luasnip',
'hrsh7th/cmp-nvim-lua',
},
config = function()
local cmp = require('cmp')
cmp.setup({
snippet = {
-- REQUIRED - you must specify a snippet engine
expand = function(args)
require('luasnip').lsp_expand(args.body)
end,
},
mapping = cmp.mapping.preset.insert({
['<C-b>'] = cmp.mapping.scroll_docs(-4),
['<C-f>'] = cmp.mapping.scroll_docs(4),
['<C-Space>'] = cmp.mapping.complete(),
['<C-e>'] = cmp.mapping.abort(),
['<CR>'] = cmp.mapping.confirm({ select = true }), -- Accept currently selected item. Set `select` to `false` to only confirm explicitly selected items.
}),
sources = cmp.config.sources({
{ name = 'nvim_lsp' },
{ name = 'luasnip' }, -- For luasnip snippets.
{ name = 'buffer' },
{ name = 'path' },
{ name = 'nvim_lua' },
}),
})
-- Set configuration for specific filetype.
cmp.setup.filetype('gitcommit', {
sources = cmp.config.sources({
{ name = 'cmp_git' }, -- For git commits.
})
})
-- Use buffer source for `/` (if you enabled `native_menu`, this won't work).
cmp.setup.cmdline('/', {
mapping = cmp.mapping.preset.cmdline(),
sources = {
{ name = 'buffer' }
}
})
-- Use cmdline & path source for ':' (if you enabled `native_menu`, this won't work).
cmp.setup.cmdline(':', {
mapping = cmp.mapping.preset.cmdline(),
sources = cmp.config.sources({
{ name = 'path' }
})
})
end,
}
This code snippet does the following:
- Defines the Plugin: The
'hrsh7th/nvim-cmp'
string tells Lazy.nvim the plugin's repository on GitHub. - Declares Dependencies: The
dependencies
table lists other plugins thatnvim-cmp
relies on. Lazy.nvim will automatically install these. - Configures the Plugin: The
config
function contains the Lua code that configuresnvim-cmp
. This is where you'll set up mappings, sources, and other options. This code configures nvim-cmp with various sources like LSP, snippets, buffers, paths, and Lua. It also sets up mappings for navigating the completion menu and accepting suggestions. The configuration includes specific settings forgitcommit
filetypes and command-line completion.
Next, create zotcite.lua
in the same directory (~/.config/nvim/plugins/zotcite.lua
):
return {
'jalvesaq/zotcite',
dependencies = {
'nvim-lua/plenary.nvim',
},
config = function()
require('zotcite').setup {
-- Configuration options here
}
end,
}
This file declares the jalvesaq/zotcite
plugin and specifies nvim-lua/plenary.nvim
as a dependency. The config
function sets up zotcite
with its default or custom options.
Finally, create cmp-zotcite.lua
(~/.config/nvim/plugins/cmp-zotcite.lua
):
return {
'jalvesaq/cmp-zotcite',
dependencies = {
'nvim-cmp/cmp-nvim-lsp',
'jalvesaq/zotcite',
},
config = function()
local cmp = require('cmp')
cmp.setup.filetype('tex', {
sources = cmp.config.sources({
{
name = 'zotcite',
option = { citeformat = 'authoryear' },
},
})
})
end
}
This file declares jalvesaq/cmp-zotcite
, lists nvim-cmp
and zotcite
as dependencies, and configures the completion source for tex
files to use zotcite
. This will allow you to autocomplete citations when editing LaTeX documents. The configuration specifies the authoryear
citation format.
3. Initializing Lazy.nvim
Now, you need to tell Lazy.nvim to load these plugin configurations. In your init.lua
(or init.vim
if you prefer Vimscript), add the following:
require(