LazyVim is a Neovim setup powered by ๐ค lazy.nvim to make it easy to customize and extend your config. Rather than having to choose between starting from scratch or using a pre-made distro, LazyVim offers the best of both worlds - the flexibility to tweak your config as needed, along with the convenience of a pre-configured setup.
- ๐ฅ Transform your Neovim into a full-fledged IDE
- ๐ค Easily customize and extend your config with lazy.nvim
- ๐ Blazingly fast
- ๐งน Sane default settings for options, autocmds, and keymaps
- ๐ฆ Comes with a wealth of plugins pre-configured and ready to use
- Neovim >= 0.8.0 (needs to be built with LuaJIT)
- Git >= 2.19.0 (for partial clones support)
- a Nerd Font (optional)
You can find a starter template for LazyVim here
Try it with Docker
docker run -w /root -it --rm alpine:edge sh -uelic '
apk add git lazygit neovim ripgrep alpine-sdk --update
git clone https://github.com/LazyVim/starter ~/.config/nvim
cd ~/.config/nvim
nvim
'
Install the LazyVim Starter
-
Make a backup of your current Neovim files:
mv ~/.config/nvim ~/.config/nvim.bak mv ~/.local/share/nvim ~/.local/share/nvim.bak
-
Clone the starter
git clone https://github.com/LazyVim/starter ~/.config/nvim
-
Start Neovim!
nvim
Refer to the comments in the files on how to customize LazyVim.
The files under config will be automatically loaded at the appropriate time, so you don't need to require those files manually. LazyVim comes with a set of default config files that will be loaded before your own. See here
You can add your custom plugin specs under lua/plugins/
. All files there
will be automatically loaded by lazy.nvim
~/.config/nvim โโโ lua โ โโโ config โ โ โโโ autocmds.lua โ โ โโโ keymaps.lua โ โ โโโ lazy.lua โ โ โโโ options.lua โ โโโ plugins โ โโโ spec1.lua โ โโโ ** โ โโโ spec2.lua โโโ init.toml
LazyVim can be configured in the same way as any other plugin.
For example in lua/plugins/core.lua
return {
{
"LazyVim/LazyVim",
opts = {
colorscheme = "catppuccin",
}
}
}
Default Settings
{
-- colorscheme can be a string like `catppuccin` or a function that will load the colorscheme
---@type string|fun()
colorscheme = function()
require("tokyonight").load()
end,
-- icons used by other plugins
icons = {
diagnostics = {
Error = "๏ ",
Warn = "๏ฑ ",
Hint = "๏ ต ",
Info = "๏ ",
},
git = {
added = "๏พ ",
modified = "๏
",
removed = "๏
",
},
kinds = {
Array = "๎ช ",
Boolean = "๎ช ",
Class = "๎ญ ",
Color = "๎ญ ",
Constant = "๎ญ ",
Constructor = "๎ช ",
Enum = "๎ช ",
EnumMember = "๎ญ ",
Event = "๎ช ",
Field = "๎ญ ",
File = "๎ฉป ",
Folder = "๏ ",
Function = "๎ช ",
Interface = "๎ญก ",
Key = "๎ช ",
Keyword = "๎ญข ",
Method = "๎ช ",
Module = "๎ฌฉ ",
Namespace = "๎ช ",
Null = "๏ณ ",
Number = "๎ช ",
Object = "๎ช ",
Operator = "๎ญค ",
Package = "๎ฌฉ ",
Property = "๎ญฅ ",
Reference = "๎ฌถ ",
Snippet = "๎ญฆ ",
String = "๎ฎ ",
Struct = "๎ช ",
Text = "๎ช ",
TypeParameter = "๎ช ",
Unit = "๎ช ",
Value = "๎ช ",
Variable = "๎ช ",
},
},
}
Configuring LazyVim is exactly the same as using lazy.nvim to build a config from scratch.
For the full plugin spec documentation please check the lazy.nvim readme.
Example spec: lua/plugins/example.lua
-- every spec file under config.plugins will be loaded automatically by lazy.nvim
--
-- In your plugin files, you can:
-- * add extra plugins
-- * disable/enabled LazyVim plugins
-- * override the configuration of LazyVim plugins
return {
-- add gruvbox
{ "ellisonleao/gruvbox.nvim" },
-- Configure LazyVim to load gruvbox
{
"LazyVim/LazyVim",
opts = {
colorscheme = "gruvbox",
},
},
-- change trouble config
{
"folke/trouble.nvim",
-- opts will be merged with the parent spec
opts = { use_diagnostic_signs = true },
},
-- disable trouble
{ "folke/trouble.nvim", enabled = false },
-- add symbols-outline
{
"simrat39/symbols-outline.nvim",
cmd = "SymbolsOutline",
keys = { { "<leader>cs", "<cmd>SymbolsOutline<cr>", desc = "Symbols Outline" } },
config = true,
},
-- override nvim-cmp and add cmp-emoji
{
"hrsh7th/nvim-cmp",
dependencies = { "hrsh7th/cmp-emoji" },
---@param opts cmp.ConfigSchema
opts = function(_, opts)
local cmp = require("cmp")
opts.sources = cmp.config.sources(vim.list_extend(opts.sources, { { name = "emoji" } }))
end,
},
-- change some telescope options and a keymap to browse plugin files
{
"nvim-telescope/telescope.nvim",
keys = {
-- add a keymap to browse plugin files
-- stylua: ignore
{
"<leader>fp",
function() require("telescope.builtin").find_files({ cwd = require("lazy.core.config").options.root }) end,
desc = "Find Plugin File",
},
},
-- change some options
opts = {
defaults = {
layout_strategy = "horizontal",
layout_config = { prompt_position = "top" },
sorting_strategy = "ascending",
winblend = 0,
},
},
},
-- add telescope-fzf-native
{
"nvim-telescope/telescope.nvim",
dependencies = { { "nvim-telescope/telescope-fzf-native.nvim", build = "make" } },
-- apply the config and additionally load fzf-native
config = function(_, opts)
local telescope = require("telescope")
telescope.setup(opts)
telescope.load_extension("fzf")
end,
},
-- add pyright to lspconfig
{
"neovim/nvim-lspconfig",
---@class PluginLspOpts
opts = {
---@type lspconfig.options
servers = {
-- pyright will be automatically installed with mason and loaded with lspconfig
pyright = {},
},
},
},
-- add tsserver and setup with typescript.nvim instead of lspconfig
{
"neovim/nvim-lspconfig",
dependencies = {
"jose-elias-alvarez/typescript.nvim",
init = function()
require("lazyvim.util").on_attach(function(_, buffer)
-- stylua: ignore
vim.keymap.set( "n", "<leader>co", "TypescriptOrganizeImports", { buffer = buffer, desc = "Organize Imports" })
vim.keymap.set("n", "<leader>cR", "TypescriptRenameFile", { desc = "Rename File", buffer = buffer })
end)
end,
},
---@class PluginLspOpts
opts = {
---@type lspconfig.options
servers = {
-- tsserver will be automatically installed with mason and loaded with lspconfig
tsserver = {},
},
-- you can do any additional lsp server setup here
-- return true if you don't want this server to be setup with lspconfig
---@type table<string, fun(server:string, opts:_.lspconfig.options):boolean?>
setup = {
-- example to setup with typescript.nvim
tsserver = function(_, opts)
require("typescript").setup({ server = opts })
return true
end,
-- Specify * to use this function as a fallback for any server
-- ["*"] = function(server, opts) end,
},
},
},
-- for typescript, LazyVim also includes extra specs to properly setup lspconfig,
-- treesitter, mason and typescript.nvim. So instead of the above, you can use:
{ import = "lazyvim.plugins.extras.lang.typescript" },
-- add more treesitter parsers
{
"nvim-treesitter/nvim-treesitter",
opts = {
ensure_installed = {
"bash",
"help",
"html",
"javascript",
"json",
"lua",
"markdown",
"markdown_inline",
"python",
"query",
"regex",
"tsx",
"typescript",
"vim",
"yaml",
},
},
},
-- since `vim.tbl_deep_extend`, can only merge tables and not lists, the code above
-- would overwrite `ensure_installed` with the new value.
-- If you'd rather extend the default config, use the code below instead:
{
"nvim-treesitter/nvim-treesitter",
opts = function(_, opts)
vim.list_extend(opts.ensure_installed, {
-- add tsx and treesitter
ensure_installed = {
"tsx",
"typescript",
},
})
end,
},
-- the opts function can also be used to change the default opts:
{
"nvim-lualine/lualine.nvim",
event = "VeryLazy",
opts = function(_, opts)
table.insert(opts.sections.lualine_x, "๐")
end,
},
-- or you can return new options to override all the defaults
{
"nvim-lualine/lualine.nvim",
event = "VeryLazy",
opts = function()
return {
--[[add your custom lualine config here]]
}
end,
},
-- use mini.starter instead of alpha
{ import = "lazyvim.plugins.extras.ui.mini-starter" },
-- add jsonls and schemastore ans setup treesitter for json, json5 and jsonc
{ import = "lazyvim.plugins.extras.lang.json" },
-- add any tools you want to have installed below
{
"williamboman/mason.nvim",
opts = {
ensure_installed = {
"stylua",
"shellcheck",
"shfmt",
"flake8",
},
},
},
}
LazyVim uses which-key.nvim to help you remember your
keymaps. Just press any key like <space>
and you'll see a popup with all
possible keymaps starting with <space>
.
General
Key | Description | Mode |
---|---|---|
<C-h> |
Go to left window | n |
<C-j> |
Go to lower window | n |
<C-k> |
Go to upper window | n |
<C-l> |
Go to right window | n |
<C-Up> |
Increase window height | n |
<C-Down> |
Decrease window height | n |
<C-Left> |
Decrease window width | n |
<C-Right> |
Increase window width | n |
<A-j> |
Move down | n, v, i |
<A-k> |
Move up | n, v, i |
<leader>bb |
Switch to Other Buffer | n |
<leader>` |
Switch to Other Buffer | n |
<esc> |
Escape and clear hlsearch | i, n |
<leader>ur |
Redraw and clear hlsearch | n |
n |
Next search result | n, x, o |
N |
Prev search result | n, x, o |
<C-s> |
Save file | i, v, n, s |
<leader>l |
Lazy | n |
<leader>fn |
New File | n |
<leader>xl |
Open Location List | n |
<leader>xq |
Open Quickfix List | n |
<leader>uf |
Toggle format on Save | n |
<leader>us |
Toggle Spelling | n |
<leader>uw |
Toggle Word Wrap | n |
<leader>ul |
Toggle Line Numbers | n |
<leader>ud |
Toggle Diagnostics | n |
<leader>uc |
Toggle Conceal | n |
<leader>gg |
Lazygit (cwd) | n |
<leader>gG |
Lazygit (root dir) | n |
<leader>qq |
Quit all | n |
<leader>sH |
Highlight Groups at cursor | n |
<leader>ft |
Terminal (root dir) | n |
<leader>fT |
Terminal (cwd) | n |
<esc><esc> |
Enter Normal Mode | t |
<leader>ww |
other-window | n |
<leader>wd |
delete-window | n |
<leader>w- |
split-window-below | n |
<leader>w| |
split-window-right | n |
<leader><tab>l |
Last | n |
<leader><tab>f |
First | n |
<leader><tab><tab> |
New Tab | n |
<leader><tab>] |
Next | n |
<leader><tab>d |
Close | n |
<leader><tab>[ |
Previous | n |
LSP
Key | Description | Mode |
---|---|---|
<leader>cd |
Line Diagnostics | n |
<leader>cl |
Lsp Info | n |
<leader>xd |
Telescope Diagnostics | n |
gd |
Goto Definition | n |
gr |
References | n |
gD |
Goto Declaration | n |
gI |
Goto Implementation | n |
gt |
Goto Type Definition | n |
K |
Hover | n |
gK |
Signature Help | n |
[d |
Next Diagnostic | n |
]d |
Prev Diagnostic | n |
]e |
Next Error | n |
[e |
Prev Error | n |
]w |
Next Warning | n |
[w |
Prev Warning | n |
<leader>ca |
Code Action | n, v |
<leader>cf |
Format Document | n |
<leader>cf |
Format Range | v |
<leader>cr |
Rename | n |
Plugins
Key | Description | Mode |
---|---|---|
<leader>cm |
mason.nvim Mason | n |
<leader>bd |
mini.bufremove Delete Buffer | n |
<leader>bD |
mini.bufremove Delete Buffer (Force) | n |
<leader>fe |
neo-tree.nvim Explorer NeoTree (root dir) | n |
<leader>fE |
neo-tree.nvim Explorer NeoTree (cwd) | n |
<leader>e |
neo-tree.nvim Explorer NeoTree (root dir) | n |
<leader>E |
neo-tree.nvim Explorer NeoTree (cwd) | n |
<S-Enter> |
noice.nvim Redirect Cmdline | c |
<leader>snl |
noice.nvim Noice Last Message | n |
<leader>snh |
noice.nvim Noice History | n |
<leader>sna |
noice.nvim Noice All | n |
<c-f> |
noice.nvim Scroll forward | n |
<c-b> |
noice.nvim Scroll backward | n |
<leader>un |
nvim-notify Delete all Notifications | n |
<leader>sr |
nvim-spectre Replace in files (Spectre) | n |
<leader>qs |
persistence.nvim Restore Session | n |
<leader>ql |
persistence.nvim Restore Last Session | n |
<leader>qd |
persistence.nvim Don't Save Current Session | n |
<leader>, |
telescope.nvim Switch Buffer | n |
<leader>/ |
telescope.nvim Find in Files (Grep) | n |
<leader>: |
telescope.nvim Command History | n |
<leader><space> |
telescope.nvim Find Files (root dir) | n |
<leader>fF |
telescope.nvim Find Files (cwd) | n |
<leader>fb |
telescope.nvim Buffers | n |
<leader>ff |
telescope.nvim Find Files (root dir) | n |
<leader>fr |
telescope.nvim Recent | n |
<leader>gc |
telescope.nvim commits | n |
<leader>gs |
telescope.nvim status | n |
<leader>sa |
telescope.nvim Auto Commands | n |
<leader>sC |
telescope.nvim Commands | n |
<leader>so |
telescope.nvim Options | n |
<leader>st |
telescope.nvim Telescope | n |
<leader>sh |
telescope.nvim Search Highlight Groups | n |
<leader>sG |
telescope.nvim Grep (cwd) | n |
<leader>sk |
telescope.nvim Key Maps | n |
<leader>sM |
telescope.nvim Man Pages | n |
<leader>sb |
telescope.nvim Buffer | n |
<leader>sc |
telescope.nvim Command History | n |
<leader>sg |
telescope.nvim Grep (root dir) | n |
<leader>sh |
telescope.nvim Help Pages | n |
<leader>sm |
telescope.nvim Jump to Mark | n |
<leader>ss |
telescope.nvim Goto Symbol | n |
]t |
todo-comments.nvim Next todo comment | n |
[t |
todo-comments.nvim Previous todo comment | n |
<leader>xt |
todo-comments.nvim Todo Trouble | n |
<leader>xtt |
todo-comments.nvim Todo Trouble | n |
<leader>xT |
todo-comments.nvim Todo Telescope | n |
<leader>xx |
trouble.nvim Document Diagnostics (Trouble) | n |
<leader>xX |
trouble.nvim Workspace Diagnostics (Trouble) | n |
]] |
vim-illuminate Next Reference | n |
[[ |
vim-illuminate Prev Reference | n |
Core
- alpha-nvim
- catppuccin
- cmp-buffer
- cmp-nvim-lsp
- cmp-path
- cmp_luasnip
- dressing.nvim
- flit.nvim
- friendly-snippets
- gitsigns.nvim
- indent-blankline.nvim
- lazy.nvim
- LazyVim
- leap.nvim
- lualine.nvim
- LuaSnip
- mason-lspconfig.nvim
- mason.nvim
- mini.ai
- mini.bufremove
- mini.comment
- mini.indentscope
- mini.pairs
- mini.surround
- neo-tree.nvim
- neoconf.nvim
- neodev.nvim
- noice.nvim
- nui.nvim
- null-ls.nvim
- nvim-bufferline.lua
- nvim-cmp
- nvim-lspconfig
- nvim-navic
- nvim-notify
- nvim-spectre
- nvim-treesitter
- nvim-treesitter-textobjects
- nvim-ts-context-commentstring
- nvim-web-devicons
- persistence.nvim
- plenary.nvim
- telescope.nvim
- todo-comments.nvim
- tokyonight.nvim
- trouble.nvim
- vim-illuminate
- vim-startuptime
- which-key.nvim
Extras: lang.json
To use this, add it to your lazy.nvim imports:
require("lazy").setup({
spec = {
{ "folke/LazyVim", import = "lazyvim.plugins" },
{ import = "lazyvim.plugins.extras.lang.json" },
{ import = "plugins" },
},
})
Extras: lang.typescript
To use this, add it to your lazy.nvim imports:
require("lazy").setup({
spec = {
{ "folke/LazyVim", import = "lazyvim.plugins" },
{ import = "lazyvim.plugins.extras.lang.typescript" },
{ import = "plugins" },
},
})
Extras: ui.mini-starter
To use this, add it to your lazy.nvim imports:
require("lazy").setup({
spec = {
{ "folke/LazyVim", import = "lazyvim.plugins" },
{ import = "lazyvim.plugins.extras.ui.mini-starter" },
{ import = "plugins" },
},
})