Skip to content

xpressivecode/LazyVim

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

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

About

Neovim config for the lazy

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Lua 100.0%