/LazyVim

Neovim config for the lazy

Primary LanguageLuaApache License 2.0Apache-2.0

LazyVim

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.

image

โœจ Features

  • ๐Ÿ”ฅ 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

โšก๏ธ Requirements

  • Neovim >= 0.8.0 (needs to be built with LuaJIT)
  • Git >= 2.19.0 (for partial clones support)
  • a Nerd Font (optional)

๐Ÿš€ Getting Started

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.

๐Ÿ“‚ File Structure

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

โš™๏ธ Configuration

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 Plugins

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",
      },
    },
  },
}

โŒจ๏ธ Keymaps

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>.

image

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

๐Ÿ“ฆ Plugins

Core
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" },
  },
})