Skip to content

FAQ

Why not just use LazyVim or kickstart.nvim?

This config predates/deliberately avoids adopting a distribution. Writing every option, keymap, and plugin spec by hand keeps each piece traceable to a single file instead of hidden behind a distribution’s abstractions and defaults — at the cost of not getting features “for free.” See Introduction for the full reasoning.

Why hand-roll LSP instead of using nvim-lspconfig’s setup{} presets?

Same reasoning as above, applied specifically to LSP: lua/plugins/lsp.lua calls vim.lsp.start() directly through a small setup_lsp() helper instead of require("lspconfig").<server>.setup{}. It also means the executable-existence guard (vim.fn.executable(...)) is explicit and visible, rather than depending on nvim-lspconfig’s own defaults. See Code Explanation for the code.

How do I add support for a new language server?

Add a new setup_lsp("server_name", { cmd = {...}, on_attach = on_attach, capabilities = capabilities }) call inside the config function in lua/plugins/lsp.lua. Don’t reach for require("lspconfig").<server>.setup{} patterns copied from LazyVim/kickstart tutorials — they don’t apply here since nvim-lspconfig is only used as a data source, not as the thing driving setup.

Why are there two AI assistant plugins installed?

claudecode.nvim and codecompanion.nvim cover different workflows — Claude Code drives an actual claude CLI session from inside Neovim, while CodeCompanion is a more general chat/actions layer. They’re kept deliberately separate (different keymap prefixes: <leader>a* vs <leader>c*) rather than merged or picked between.

Why is the colorscheme file named catppuccion.lua instead of catppuccin.lua?

It’s a typo that’s intentional/historical at this point — don’t “fix” it without checking whether anything elsewhere in the Dotfiles repo references that exact filename.

Formatting on save isn’t doing anything (or only partially) — why?

Format-on-save is entirely LSP-driven (vim.lsp.buf.format() on BufWritePre, filtered to clients that support textDocument/formatting), with a tight 200ms timeout. If the buffer’s LSP doesn’t support formatting, or is slow enough to miss that window, nothing happens — there’s no fallback formatter plugin like conform.nvim to catch it.

What’s the leader key?

The default, \ — it’s never remapped. <leader>ff means \ff.

The dashboard shows “Neovim” as plain text instead of ASCII art — why?

alpha.lua reads the banner from the absolute path ~/.config/nvim/ascii/ascii-w2i.txt. If that exact file isn’t present at that path (e.g. testing this config outside its normal deployment), it silently falls back to the literal string "Neovim" instead of erroring.

How is this config actually deployed to ~/.config/nvim?

There’s no symlinking step specific to Neovim — ~/.config itself is a single symlink to the root of the Dotfiles repo, so nvim/ becomes ~/.config/nvim automatically as part of that one symlink. See Usage.

Nothing is auto-installing my language servers — is Mason missing on purpose?

Yes. There’s no mason.nvim or auto-install step; setup_lsp() just silently no-ops if the server’s command isn’t found on PATH. Language servers need to be installed through the system package manager (or however you normally install them) yourself.

Last updated on