Startuptime: 88ms
Based on the actual CPU time of the Neovim process till UIEnter.
This is more accurate than `nvim --startuptime`.
LazyStart 6.84ms
LazyDone 83.17ms (+76.33ms)
UIEnter 88ms (+4.84ms)
Most Neovim configurations pretend like they are being used to get actual work done. This one is.
This is the Neovim configuration I use daily in large production codebases. Every plugin, keymap, and option earns its place through real usage - if something breaks or slows me down, it gets fixed or removed. All plugins are actively used and I keep it as minimal as possible, but I never compromise on developer experience - if there's a better path, I always take it.
It contains a lot of "hacks" and little known tricks I've accumulated over the years to make overall experience better, which you won't find in any other dotfiles - all of this comes from battle-testing plugins in real projects and digging through countless GitHub issues to find solutions that actually work.
I actively keep it up to date with modern approaches, plugins, and ecosystem changes. Even though it is opinionated, it strikes a good balance between being ready to use now and providing good defaults as a starting point for your own configuration.
- 67 plugins organized across 38 separate plugin files
- 20 language servers configured with smart root detection and conditional attachment
- AI-augmented development via Codeium integration (I use claude-code via tmux)
- Custom tree-sitter parser (
edf) for.envfile syntax highlighting - Format on save with conform.nvim (prettier, biome, stylua, ruff, rustfmt, and more)
- 10+ linters running via nvim-lint
- Modern completion via blink.cmp with AI and LSP sources
- Sensitive data masking with shelter.nvim
- Environment variable management with ecolog2.nvim
- REST client via kulala.nvim
- Database interface via vim-dadbod
TypeScript/JavaScript, React/Vue/Astro, Python, Rust, Lua, SQL, Bash, HTML/CSS/Tailwind, Markdown, TOML, YAML, JSON, Docker, GraphQL, Prisma, and Graphviz DOT.
Required:
- Neovim >= 0.10
- git, make, unzip
- C compiler (
gccorclang) — needed by tree-sitter to compile parsers - ripgrep — used by snacks.nvim picker for live grep
- Node.js & npm — required by many LSP servers and tools
- Nerd Font — provides icons used throughout the UI (
vim.g.have_nerd_fontis set totrue) - Clipboard tool —
pbcopy/pbpaste(macOS),xclip/xsel(Linux), orwin32yank(Windows)
Recommended:
- mise — runtime version manager (config prepends mise shims to
PATH) - lazygit — terminal UI for git, integrated via snacks.nvim (
<leader>lg) - fd — faster file finding for the picker
Optional (language-specific):
- Deno — for Deno project support (LSP activates when
deno.json/deno.jsoncis present) - Python 3 — for Python development (pyright + ruff)
- Rust/cargo — for Rust development (rust-analyzer + rustfmt)
-
Clone this repository:
git clone https://github.com/ph1losof/nvim ~/.config/nvim -
Open Neovim — Lazy.nvim will auto-install all plugins on first launch:
nvim
-
Install all LSP servers, formatters, and linters (this is a custom command defined in this config, not a built-in Mason command):
:MasonInstallAll
-
Verify tree-sitter parsers are installed:
:TSUpdate
Leader key is Space. Here are the most important mappings — run :map or check lua/config/mappings.lua and individual plugin files for the full list.
| Key | Description |
|---|---|
<leader>ff |
Find files |
<leader>fw |
Live grep |
<leader><space> |
Find open buffers |
<leader>fr |
Resume last search |
<leader>fh |
Help pages |
<C-n> |
Open file explorer (Oil) |
<leader>h1–h4 |
Jump to Harpoon mark 1–4 |
<leader>ha |
Add buffer to Harpoon |
| Key | Description |
|---|---|
K |
Hover documentation |
<leader>gd |
Go to definition |
<leader>gr |
Find references |
<leader>gI |
Go to implementation |
<leader>gp |
Peek definition |
<leader>rn |
Rename symbol |
<leader>ca |
Code action |
<leader>ol |
Toggle outline |
| Key | Description |
|---|---|
<leader>lg |
Open Lazygit |
<leader>lf |
Lazygit current file history |
<leader>hs |
Stage hunk |
<leader>hp |
Preview hunk |
<leader>hb |
Git blame line |
]c / [c |
Next / previous git change |
| Key | Description |
|---|---|
<leader>/ |
Toggle comment |
<leader>sr |
Search & replace (grug-far) |
<leader>z |
Zen mode |
<leader>u |
Undotree |
S |
Quick find/replace word under cursor |
U |
Redo |
+ / - |
Increment / decrement number |
~/.config/nvim/
├── init.lua # Entry point (leader key, loads config modules)
├── lua/
│ ├── config/
│ │ ├── lazy.lua # Lazy.nvim bootstrap and setup
│ │ ├── options.lua # Vim options and diagnostics
│ │ ├── mappings.lua # Global keymaps
│ │ └── autocmds.lua # Autocommands
│ ├── plugins/ # 38 plugin spec files (one per plugin/group)
│ └── helpers.lua # Shared utility functions
├── snippets/ # Custom snippets (drizzle, package.json, css)
├── patches/ # Plugin patches (applied via patchr.nvim)
└── lazy-lock.json # Plugin version lockfile
When I initially started using Neovim, my starting point was NvChad. That's why you may find keybindings similar to NvChad's.
The initial transition from NvChad was done using nvim-lua/kickstart.nvim as a starting point. Over time I dropped most of it and rewrote everything from scratch, keeping only a few good parts from them. Huge thanks to kickstart for getting me started in non-distro direction.
A lot of good defaults, extras, and plugin choices in this config were inspired by LazyVim. Whenever I add a new plugin, I usually look up its source code in the LazyVim repo first — a great reference for well-thought-out Neovim defaults.