My daily-driver Neovim setup, built on LazyVim and tuned for work across Python, Go, Kubernetes, Terraform, and more.
- Catppuccin theme that auto-switches between light (latte) and dark (mocha) based on your macOS appearance
- 15+ language extras with LSP, formatting, linting, and snippets out of the box
- Super-tab completion via blink.cmp — tab through suggestions, snippets expand inline
- Built-in tool terminals for K9s, lazydocker, and posting (API client) — only shows up if you have them installed
- Auto-save on every change — no more
:wmuscle memory needed - Database UI via Dadbod for running queries without leaving the editor
- Git blame inline with commit summaries, dates, and authors
| Tool | Purpose | Install |
|---|---|---|
| Neovim 0.10+ | Editor | neovim.io |
| Git | Plugin management | Required |
| ripgrep | Fast search | brew install ripgrep |
| fd | File finding | brew install fd |
| yamlfmt | YAML formatting | go install github.com/google/yamlfmt@latest |
| sqruff | SQL formatting | Optional |
| k9s | Kubernetes TUI | Optional — brew install k9s |
| lazydocker | Docker TUI | Optional — brew install lazydocker |
| posting | API client TUI | Optional — pipx install posting |
~/.config/nvim/
├── init.lua # Entry point — bootstraps lazy.nvim
├── .lazy.lua # Extra lazy config + DB connections
├── lazyvim.json # Enabled LazyVim extras
├── lazy-lock.json # Pinned plugin versions
├── stylua.toml # Lua formatter settings
│
├── snippets/ # Custom LuaSnip snippets
│ ├── kubernetes.json # K8s manifests (deployment, service, ingress, etc.)
│ ├── python.json # main, requests, logging, SFTP, classes
│ ├── javascript.json # React, TypeScript, fetch patterns
│ ├── dockerfile.json # Production Dockerfile with uv
│ └── package.json # Snippet registration
│
└── lua/
├── config/
│ ├── lazy.lua # Plugin manager setup
│ ├── options.lua # Editor options + macOS dark mode detection
│ ├── keymaps.lua # Custom keybindings
│ └── autocmds.lua # Auto-save and other autocommands
└── plugins/
├── colorschema.lua # Catppuccin + alternate themes
├── codediff.lua # Side-by-side diff viewer
├── git-blame.lua # Inline git blame
└── custom/ # Plugin overrides
├── blink.lua # Completion (super-tab preset)
├── conform.lua # Formatters (yamlfmt, sqruff)
├── lualine.lua # Status line styling
├── nvim-lint.lua # Linter config (yamllint)
├── snacks.lua # Dashboard, picker, dim, image
└── which-key.lua # Tool group registration
This config enables a lot of LazyVim language extras. Here's what's wired up:
| Language | LSP | Formatter | Linter |
|---|---|---|---|
| Python | ty (Astral) | ruff | ruff |
| Go | gopls | gofumpt | — |
| Rust | rust-analyzer | rustfmt | — |
| TypeScript/JS | ts_ls | prettier | eslint |
| Tailwind CSS | tailwindcss | prettier | — |
| YAML | yamlls | yamlfmt | yamllint |
| JSON | jsonls | prettier | — |
| TOML | taplo | taplo | — |
| SQL | sqlls | sqruff | — |
| Docker | dockerls | — | — |
| Terraform | terraformls | terraform fmt | — |
| Helm | helm_ls | — | — |
| Markdown | marksman | prettier | — |
| Java | jdtls | — | — |
| Lua | lua_ls (via LazyVim) | stylua | — |
Note: Python uses ty, Astral's type checker — not pyright. This is set via
vim.g.lazyvim_python_lsp = "ty"inoptions.lua.
| Key | Mode | What it does |
|---|---|---|
jj / jk |
Insert | Escape to normal mode |
aa |
Normal | Jump to end of line and enter insert mode |
Alt+j / Alt+k |
Normal, Insert, Visual | Move line(s) up/down |
These only appear if the tool is installed on your system:
| Key | Tool |
|---|---|
<leader>tk |
K9s (Kubernetes) |
<leader>td |
lazydocker |
<leader>ta |
posting (API client) |
| Key | Action |
|---|---|
<leader> |
Which-key popup (shows all available bindings) |
<leader>ff |
Find files |
<leader>sg |
Live grep |
<leader>gb |
Git branches |
<leader>gc |
Git commits |
<leader>xx |
Toggle Trouble diagnostics |
Custom snippets live in snippets/ and are loaded via LuaSnip.
Kubernetes (k8s- prefix in YAML files): deployment, service, configmap, secret, ingress, statefulset, pvc, job, cronjob.
Python: pmain (main boilerplate), req (requests call), sftp_ (paramiko SFTP), logger (logging setup), classpy (class template).
Dockerfile: dockerfile-uv — production multi-stage build with uv package manager.
JavaScript/TypeScript: 60+ snippets covering React components, TypeScript types, fetch patterns, and more.
Database connections are configured in .lazy.lua. The SQL extra gives you:
:DBUIto open the Dadbod database browser- Auto-completion for table/column names in SQL buffers
- Run queries and see results inline
See lazyvim.org/extras/lang/sql for details.
- Aggressive auto-save — every text change writes all buffers to disk. No unsaved state, ever.
- macOS appearance sync — reads
AppleInterfaceStyleat startup to pick light/dark theme. - Conditional tool keymaps — K9s, lazydocker, and posting bindings only register if the binary is on
$PATH. - yamlfmt over prettier for YAML — better Kubernetes support (preserves comments, handles multi-doc files).
- Prettier runs without config —
lazyvim_prettier_needs_config = false, so it formats even in projects without.prettierrc.
Drop a file in lua/plugins/:
-- lua/plugins/myplugin.lua
return {
"author/plugin-name",
opts = {},
}Edit lua/config/keymaps.lua:
vim.keymap.set("n", "<leader>my", function()
-- your action here
end, { desc = "My custom thing" })Edit lua/plugins/colorschema.lua. Dracula and boo-berry are already installed as alternates.
| Command | What it does |
|---|---|
:Lazy |
Open plugin manager |
:Lazy sync |
Update all plugins |
:Mason |
Manage LSP servers, formatters, linters |
:Checkhealth |
Run health checks |
:Format |
Format current buffer |
:DBUI |
Open database UI |
:CodeDiff |
Side-by-side diff viewer |
Plugins acting up?
:Lazy clean
:Lazy sync
LSP not working?
:LspInfo -- see what's attached
:LspStop -- stop current servers
:LspStart -- restart them
:Mason -- check if the server is installed
Built on LazyVim with Catppuccin.
