About the project
What is CharVim?
A hand-crafted Neovim configuration built for developers who want a fast, modern editor without having to stitch plugins together themselves.
The idea
CharVim started as a personal Neovim config and grew into a shareable, opinionated distribution. The goal is simple: give you a Neovim that feels like a real IDE, with LSP, completion, debugging, AI, fuzzy-finding, and multi-cursor support, while staying lean, fast, and true to Vim's modal nature.
Every plugin in CharVim earns its place. Nothing is included just because it's popular. The configuration is built around a daily-driver workflow: writing code, navigating large projects, debugging, and staying in flow.
Philosophy
- Speed first. Plugins are lazy-loaded by filetype. Cold-start time stays minimal regardless of how many servers are installed.
- Keyboard-centric. Everything has a keymap. The mouse is optional. Custom implementations like multi-cursor and Find and Replace are built with Vim motions in mind.
- Personalize without forking. Two git-ignored files,
user.luaanduser-plugins.lua, let you add keymaps, options, and plugins that survivegit pullupdates without ever touching core files. - Batteries included. The install script handles system dependencies automatically on macOS, Fedora, Debian/Ubuntu, and Arch Linux.
Language support
CharVim ships with ten pre-configured LSP servers, covering the most common languages for backend, frontend, systems, and document authoring:
- Lua via lua_ls, with full Neovim API awareness
- Python via Pyright
- TypeScript and JavaScript via ts_ls
- Java via JDTLS (Maven, Gradle, and Ant are auto-detected)
- Kotlin via kotlin_language_server (JVM target 17, inlay hints)
- Go via gopls (gofumpt, full inlay hints, shadow analysis)
- C, C++, and Obj-C via clangd
- Swift and Obj-C via SourceKit-LSP
- Typst via Tinymist (exports PDF on save)
- XML via lemminx
Inlay hints are enabled by default on all servers that support them and can be toggled with leaderih.
The themes
CharVim ships with three themes, all switchable at runtime via :ThemeSelect or :Theme <name>. Your selection persists across restarts.
- Knew-pines: A warm variant of Rose Pine with dusty purples, muted pinks, gold accents, and pine greens. This is the default.
- Noir-cat: A custom dark theme with a Catppuccin-Mocha palette. Deep blacks, blue and purple highlights, and soft pastels. Defined in
nvim/colors/noir-cat.lua. - Dark: A clean, minimal dark mode with cool blue accents. Low saturation, high legibility.
Additional themes available inside Neovim include Tokyo Night, Catppuccin, Gruvbox, and Habamax.
AI integration
avante.nvim connects CharVim to Anthropic Claude (claude-haiku-4-5) for AI-assisted code chat and editing. Use :AvanteAsk to discuss code in context, or :AvanteEdit to apply AI suggestions directly. Add your ANTHROPIC_API_KEY to a .env file at the repo root and it gets loaded on startup automatically.
Installation
Run the one-line install script. It detects your OS, installs missing system dependencies, and symlinks the config into ~/.config/nvim.
bash <(curl -s https://raw.githubusercontent.com/CrtlUserKnown/Charvim/main/setup.sh)
Or clone the repository manually and launch Neovim. Plugins install automatically via lazy.nvim on first start.
Requirements
- Neovim 0.12+
- Git
- A Nerd Font for icons
ripgrepfor Telescope live grep and Find and Replacefdfor Telescope file findingpython3for DAP Python supportmakefor building avante.nvimnodefor Mason-managed LSP servers like TypeScriptANTHROPIC_API_KEY(optional) for AI features via avante.nvim
User customization
Two git-ignored files let you personalize CharVim without touching core config. They are auto-created with template comments on first startup and never overwritten by updates.
nvim/lua/user.lua
Loaded last, after all CharVim modules. Add keymaps, options, autocommands, or override any default:
-- nvim/lua/user.lua
vim.opt.wrap = true
vim.keymap.set('n', '<leader>x', ':!echo hello<CR>', { desc = 'My command' })
nvim/lua/user-plugins.lua
Return a lazy.nvim spec list to add your own plugins:
-- nvim/lua/user-plugins.lua
return {
{ 'folke/zen-mode.nvim', opts = {} },
}