Personal Neovim configuration: NvChad v2.5 base + LazyVim muscle-memory keybindings, tuned for cybersecurity, low-level systems programming, and full-stack development.
Built on the NvChad starter skeleton — NvChad provides the UI (statusline, tabufline, themes, dashboard) and core plumbing; LazyVim's high-frequency keymaps are ported on top wherever the underlying plugin exists. This is a hybrid, not a LazyVim clone: no snacks.nvim, no noice — telescope and nvim-tree stay.
Prerequisites (Arch): git ripgrep fd nodejs npm go rust lazygit gcc make unzip curl python and a Nerd Font. rustfmt comes from the rust package; rust-analyzer is installed via Mason.
git clone <this-repo> ~/.config/nvim
nvim # first run: lazy.nvim bootstraps and installs everything
:MasonInstallAll # LSP servers, formatters, debug adapters (async, run once)
- docs/CODE-TOUR.md — reading order, load order, what lives where, "where do I add X"
- docs/CONCEPTS.md — LSP, DAP, Mason, lazy.nvim, treesitter, conform, base46 … explained
init.lua unchanged starter bootstrap (lazy.nvim + NvChad v2.5 import)
lua/chadrc.lua theme + :MasonInstallAll package list
lua/options.lua LazyVim option ports, sessionoptions, mason PATH
lua/autocmds.lua yank highlight, restore last location, sql cmp source
lua/mappings.lua THE keybinding layer: nvchad.mappings + conflict fixes + ports
lua/configs/
lspconfig.lua on_attach override + vim.lsp.config/enable (nvim 0.11+ API)
conform.lua formatters_by_ft + toggleable format-on-save
dap.lua codelldb / debugpy / js-debug adapters, dap-ui wiring
lua/plugins/
init.lua core overrides: conform, lspconfig, treesitter, which-key groups
editor.lua flash, trouble, todo-comments, grug-far, harpoon2, persistence, mini.surround
git.lua gitsigns keymaps, diffview
dap.lua nvim-dap stack
lang.lua rustaceanvim, crates.nvim, schemastore
tools.lua kulala (REST), dadbod (DB)
| Language |
LSP |
Formatter |
DAP |
| C / C++ |
clangd (clang-tidy on) |
clang-format |
codelldb |
| Assembly |
asm-lsp |
— |
— |
| Rust |
rust-analyzer via rustaceanvim |
rustfmt (system) |
codelldb via :RustLsp debuggables |
| Python |
basedpyright + ruff |
ruff (imports + format) |
debugpy |
| Go |
gopls (gofumpt, staticcheck) |
goimports + gofumpt |
delve (nvim-dap-go) |
| JS / TS / Next.js |
vtsls + biome |
biome |
js-debug-adapter (pwa-node) |
| Web |
html, cssls, tailwindcss |
prettier (css/html/md/yaml) |
— |
| Lua |
lua_ls (NvChad default) |
stylua |
— |
| Misc |
jsonls+yamlls (schemastore), bashls, dockerls |
shfmt |
— |
<leader> = space. Press <leader> and wait for the which-key popup. NvChad defaults not listed here still apply (<Tab>/<S-Tab> buffer cycle, <leader>th theme picker, <C-n> tree, <A-i/h/v> terminals, …).
Changed from stock NvChad (why: LazyVim muscle memory)
| Key |
Now |
Was |
| <leader>e |
Explorer toggle |
NvimTreeFocus |
| <leader>/ |
Live grep |
Toggle comment (use gcc / gc) |
| <leader>h |
Harpoon menu |
Horizontal terminal (<A-h> remains) |
| <leader>ds |
DAP session |
Diagnostic loclist |
| <leader>D |
DBUI toggle |
LSP type definition (use gy) |
| Key |
Action |
| <S-h> / <S-l> |
Prev / next buffer |
| <leader>bd / <leader>bo |
Delete buffer / delete others |
| <A-j> / <A-k> |
Move line/selection down/up (n,i,v) |
| <leader>- / <leader>| / <leader>wd |
Split below / right / close window |
| <C-/> |
Bottom terminal (same toggle as <A-h>; <A-i> = floating) |
| <leader>gg |
Lazygit (floating) |
| s / S |
Flash jump / Flash treesitter |
| gsa / gsd / gsr |
Surround add / delete / replace |
| <leader>uw ud ul uL uf uF |
Toggle wrap / diagnostics / numbers / relnumber / autoformat global / buffer |
| <leader>qs ql qS qd |
Session restore / last / select / stop |
| <leader>H, <leader>1-5 |
Harpoon add, jump to slot |
| Key |
Action |
| <leader><space> <leader>ff |
Find files |
| <leader>, <leader>fb |
Buffers |
| <leader>/ <leader>sg <leader>fw |
Live grep |
| <leader>sw |
Grep word under cursor |
| <leader>sb |
Buffer fuzzy find |
| <leader>sk / <leader>sh / <leader>: |
Keymaps / help / command history |
| <leader>sR |
Resume last picker |
| <leader>st / <leader>sT |
Todo comments (all / TODO+FIX only) |
| <leader>sr |
Search & replace (grug-far) |
LSP / code (buffer-local, on attach)
| Key |
Action |
| gd gr gI gy gD |
Definition / references / implementation / type def / declaration |
| K / gK / <C-k> (i) |
Hover / signature help |
| <leader>ca |
Code action |
| <leader>cr (also <leader>ra) |
Rename |
| <leader>cf (also <leader>fm) |
Format |
| <leader>cd |
Line diagnostics |
| <leader>ss / <leader>sS |
Document / workspace symbols |
| ]d [d ]e [e ]w [w |
Next/prev diagnostic / error / warning |
| <leader>xx xX xl xq xt |
Trouble: diagnostics / buffer / loclist / quickfix / todos |
| <leader>cs |
Symbols outline (Trouble) |
| Key |
Action |
| ]h / [h |
Next / prev hunk |
| <leader>ghs ghr ghS ghR |
Stage / reset hunk, stage / reset buffer |
| <leader>ghp / <leader>ghd |
Preview hunk inline / diff this |
| <leader>gb / <leader>ghb |
Blame line (short / full) |
| <leader>gd / <leader>gf / <leader>gF |
Diffview / file history / repo history |
| <leader>gt / <leader>cm |
Git status / commits (telescope, NvChad) |
| Key |
Action |
| <leader>db / <leader>dB |
Toggle / conditional breakpoint |
| <leader>dc / <leader>da |
Continue / run with args |
| <leader>di do dO |
Step into / out / over |
| <leader>dC / <leader>dg |
Run to cursor / go to line |
| <leader>dj dk |
Down / up stack frame |
| <leader>dl dr ds dt dP |
Run last / REPL / session / terminate / pause |
| <leader>du / <leader>de / <leader>dw |
Dap UI / eval / widgets |
| Key |
Action |
| <leader>Rs Ra Rr |
Send request / send all / replay (.http files) |
| <leader>Ri Rc Rt |
Inspect / copy as cURL / toggle headers-body |
| <leader>Rn Rp Rq Rb |
Next / prev request, close UI, scratchpad |
| <leader>D |
Toggle DBUI |
- Update: :Lazy update. After NvChad updates, re-check that the LSP <leader>D shadow fix still holds (:map <leader>D in an LSP buffer should show only DBUI) — it relies on nvchad.configs.lspconfig resolving on_attach at LspAttach time.
- Broken highlights after update/theme edit: rebuild the base46 cache — :Lazy build base46 or rm -rf ~/.local/share/nvim/base46.
- Mappings load order: lua/mappings.lua runs after lazy setup, so NvChad's own maps would clobber plugin keys= specs on the same LHS. Keys that collide (harpoon, dap, dbui) are defined in mappings.lua as require() closures — keep new colliding keys there, not in plugin specs.
- Biome in monorepos: nested packages need "extends" from the root biome.json or the server won't attach.
- codelldb: adapter shim at ~/.local/share/nvim/mason/bin/codelldb; fallback path is mason/packages/codelldb/extension/adapter/codelldb.