Building a Modern Neovim Config with Lua and Lazy.nvim
# Building a Modern Neovim Config
Neovim has become my editor of choice due to its blazing speed and infinite extensibility. In this post, I'll dissect my configuration, which focuses on a clean UI, robust LSP support, and seamless navigation.
The Architecture: Lazy.nvim
I use **[lazy.nvim](https://github.com/folke/lazy.nvim)** as my plugin manager. It allows for a highly modular structure where every plugin category gets its own file.
My `init.lua` is surprisingly simple. It bootstraps `lazy` and imports the plugin specifications:
```lua
-- init.lua
require("lazy").setup({
{ import = "plugins.core" }, -- Themes, Dashboard
{ import = "plugins.ui" }, -- Neo-tree, Noice
{ import = "plugins.editing" }, -- Treesitter, Comments
{ import = "plugins.completion" }, -- Cmp, Snippets
{ import = "plugins.lsp" }, -- LSP Config
{ import = "plugins.formatting" }, -- Conform, None-ls
{ import = "plugins.utilities" }, -- Copilot, Which-key
}, {
defaults = { lazy = true },
checker = { enabled = false },
})
```
Core Settings
Before loading plugins, I set reasonable defaults in `lua/core/options.lua`. A few highlights include:
- **`relativenumber = true`**: Essential for relative jumps.
- **`clipboard = 'unnamedplus'`**: Syncs the system clipboard with Neovim.
- **`scrolloff = 4`**: Keeps context visible above and below the cursor.
- **`undofile = true`**: Persists undo history even after closing the file.
Keymaps & Workflow
I've mapped my **Leader key** to `<Space>`, which is ergonomic and standard for modern setups. You can find my full list in `lua/core/keymaps.lua`.
Window Management
I avoid using the mouse for window resizing or navigation:
```lua
-- Resize with arrows
vim.keymap.set("n", "<Up>", ":resize -2<CR>", opts)
vim.keymap.set("n", "<Down>", ":resize +2<CR>", opts)
-- Navigate splits using Leader + hjkl
vim.keymap.set("n", "<leader>h", ":wincmd h<CR>", opts)
vim.keymap.set("n", "<leader>l", ":wincmd l<CR>", opts)
```
File Operations
Quick saving and quitting are muscle memory:
```lua
vim.keymap.set("n", "<leader>s", "<cmd>w<CR>", { desc = "Save file" })
vim.keymap.set("n", "<leader>q", "<cmd>q<CR>", { desc = "Exit vim" })
```
The Visual Stack
Aesthetics play a huge role in productivity. I use the **GitHub Dark Default** theme via `github-nvim-theme` to match the rest of my developer environment.
For the interface, I use:
- **Neo-tree**: A file explorer that supports git status and icons.
- **Lualine**: A fast and configurable status line.
- **Noice.nvim**: Replaces the command line with nice popups and notifications.
Intelligence: LSP & Completion
My IDE-like features are powered by **Native LSP** and **nvim-cmp**.
I use `mason.nvim` to manage language servers like `clangd` (C++), `pyright` (Python), and `ts_ls` (TypeScript). Formatting is handled by `conform.nvim`, which ensures my code is always clean on save.
```lua
-- lua/plugins/formatting.lua
format_on_save = function(bufnr)
return { timeout_ms = 500, lsp_fallback = true }
end
```
I've also integrated **GitHub Copilot** for AI-powered suggestions, mapped to `<Tab>` for seamless acceptance.
Conclusion
This configuration strikes a balance between a minimal editor and a full-blown IDE. It starts fast, looks great, and provides all the tools I need for heavy coding sessions in C++, Lua, or Web Development.
Feel free to fork my setup from my [GitHub repository](https://github.com/abdeldjalile-lafkir/.config)!