After 15 years of using a heavily customized Vim setup, my plugins had fallen out of date. Rather than updating them piecemeal, I decided to switch to Neovim.
I initially tried LazyVim, but found that some of its defaults - like aggressive autocompletion and automatic bracket closures - didnβt suit my workflow. So I wiped my config and rebuilt from scratch using just the lazy.nvim plugin manager.
This repo documents my personal Neovim configuration. It's tailored to my preferences, but feel free to explore, use, or suggest improvements.
This Neovim config is built from scratch using lazy.nvim as the plugin manager. It favors a minimalist, scriptable, and fast editing environment without the heavy abstractions of prebuilt frameworks like LazyVim.
folke/lazy.nvimβ minimal, fast, Lua-based plugin manager- Bootstrapped automatically on first launch
- Plugin modules are declared in
lua/plugins/
| Plugin | Purpose |
|---|---|
rose-pine/neovim |
Elegant, dark colorscheme (default) |
rebelot/kanagawa.nvim |
Soft, slate colorscheme |
AlexvZyl/nordic.nvim |
Light blue colorscheme |
nvim-lualine/lualine.nvim |
Statusline with icons and theming |
akinsho/bufferline.nvim |
Visual buffer tabline |
nvim-tree/nvim-web-devicons |
Filetype icons |
folke/which-key.nvim |
Popup keybinding hints |
echasnovski/mini.icons |
Optional icon enhancements |
folke/snacks.nvim |
Scratchpad and Git UI tools |
nvim-telescope/telescope.nvim |
File browser, fuzzy file, finder tool |
folke/persistence.nvim |
Automated session management |
| Plugin | Purpose |
|---|---|
nvim-treesitter/nvim-treesitter |
Syntax highlighting via Tree-sitter |
folke/ts-comments.nvim |
Smarter gc comments (requires Neovim 0.10+) |
numToStr/Comment.nvim + nvim-ts-context-commentstring |
Context-aware commenting for JSX/HTML/etc. |
Uses format-on-save and is fully declarative by filetype.
| Filetype | Formatter |
|---|---|
| Python | black |
| JavaScript/TS | prettier |
| Shell | shfmt |
| PHP | php-cs-fixer |
| Lua | stylua |
| SQL | sql-formatter |
| HTML/CSS/JSON/YAML/Markdown | prettier |
External tools installed via Mason or system packages
Runs on BufWritePost, manually triggered via <leader>l
| Filetype | Linter |
|---|---|
| Python | ruff |
| JavaScript/TS | eslint_d |
| Shell | shellcheck |
| PHP | php |
| Markdown | markdownlint |
| JSON | jsonlint |
| Lua | luacheck |
| Tool | Description |
|---|---|
Mason |
Installs formatters/linters (auto-managed on startup) |
Ripgrep + fd |
Required by snacks.nvim for fuzzy finding |
Git |
Used by snacks' Git integration (blame_line) |
luacheck, ruff, eslint_d, etc. |
Installed via system or Mason |
- Tabs: 2 spaces, soft tabs, auto/smart indenting enabled
- Mouse: Toggleable via
<leader>m(default: off) - Virtual diagnostics: only show for WARN+ (no inline INFO spam)
- Disable auto-comment continuation
- Lint key:
<leader>l - File picker:
<leader>ff - Grep picker:
<leader>fg - Buffer deletion:
<leader>bd - Explorer toggle:
<leader>e - Scratchpad:
<leader>ss
~/.config/nvim/
βββ init.lua# Entry point, bootstraps lazy + core config
βββ lua/ βββ config/ # keymaps.lua, settings.lua
βββ plugins/ # plugin modules (treesitter, formatting, etc.)
Install neovim unstable repo and install from a nightly build. Also includes key packages that will be needed for basic functionality.
sudo add-apt-repository ppa:neovim-ppa/unstable
sudo apt update
sudo apt install neovim ripgrep fd-find git curl unzipAdded this to my ~/.bashrc
# I'll never remember to write n before vim
alias vim='nvim'
alias vi='/usr/bin/vim'You may want to run which vim first to see if yours is actually in /usr/bin/
Install lazy.nvim plugin manager bare bones.
git clone https://github.com/folke/lazy.nvim.git ~/.local/share/nvim/lazy/lazy.nvim
rm -rf ~/.local/share/nvim/lazy/lazy.nvim/.gitIt installs to ~/.local/share/nvim/lazy/lazy.nvim/
The following packages are needed to enable all functionality in my neovim stack, such as linting, formatting, etc.
sudo apt install \
shellcheck \
php-cli \
php-cs-fixer \
lua-check \
nodejs \
npm \
python3-pip \
luarocksAs a user (not sudo or root), install these for linting and formatting python
pip install black ruff --break-system-packagesInstall node based formatters and linters
sudo npm install -g \
prettier \
eslint_d \
jsonlint \
markdownlint-cli \
sql-formatterInstall luarocks linter
sudo luarocks install luacheckDownload fonts:
- Monaspice Nerd Font
- FiraCode Nerd Font
Extract, right click, install for all users
I'm using Monaspice Neon Nerd Font Mono 11-point Regular, with antialiasing enabled.
I'm using Monaspice Neon Nerd Font Mono 12-point Light, with antialiasing enabled.
In close second is my second choice, FiraCode Nerd Font Mono, which I ran at 11-point regular on both systems.
Backup the contents of your existing .config/nvim folder if it already exists.
mkdir -p ~/.config/nvim/
git clone https://github.com/gtwy/lazyjim ~/.config/nvimOn first launch, you'll want to make sure Lazy.nvim installs your plugins, Mason installs required tools, and Treesitter downloads its language parsers.
Run the following commands inside neovim
:Lazy Sync
:Mason Update
:TSUpdate- Add more functionality to which-key (and keymaps in general)
- Add toggleable columns with git info, line numbers
- Find more enhancements to add that don't cause bloat