██████╗ ██╗███╗ ██╗██╗ ██╗██╗███╗ ███╗ ██╔══██╗██║████╗ ██║██║ ██║██║████╗ ████║ ██████╔╝██║██╔██╗ ██║██║ ██║██║██╔████╔██║ ██╔══██╗██║██║╚██╗██║╚██╗ ██╔╝██║██║╚██╔╝██║ ██████╔╝██║██║ ╚████║ ╚████╔╝ ██║██║ ╚═╝ ██║ ╚═════╝ ╚═╝╚═╝ ╚═══╝ ╚═══╝ ╚═╝╚═╝ ╚═╝
vim grammar.
batteries included.
A modal TUI editor in Rust with tree-sitter, LSP, and
fuzzy pickers baked into a single binary. No plugin manager.
No 400-line init.lua. No 18-month-old GitHub issue blocking
your formatter. You install binvim, you edit text. That's it.
Neovim is excellent. But every install begins with a ~/.config/nvim archeology dig:
Lua versus Vimscript, lazy.nvim vs packer vs paq, mason for LSPs, conform for formatters,
nvim-cmp for completion, treesitter parsers that quietly desync from the Neovim version
you upgraded last Tuesday. binvim ships the answers.
// the current situation
- ✗Pick a plugin manager. Pick a config language. Pick a colourscheme bootstrap.
Then maintain three different ecosystems forever. - ✗
:Mason,:LspInstall,:TSInstall,:checkhealth— four different install surfaces. - ✗Treesitter parsers compile against the runtime. Upgrade Neovim → re-install everything.
- ✗Completion stack: nvim-cmp · cmp-nvim-lsp · cmp-buffer · cmp-path · LuaSnip · friendly-snippets…
Six plugins to autocomplete a variable name. - ✗Telescope works great. After 14 dependencies and a Rust toolchain for the sorter.
- ✗Format on save? Pick: null-ls (deprecated) → none-ls → conform.nvim → guard.nvim → …
// binvim
- ✓One binary.
Nothing to bootstrap. No package manager-of-the-month. - ✓
:healthtells you what's attached and what isn't.
That's the whole diagnostic surface. - ✓Tree-sitter grammars are compiled into the binary. Upgrade
binvim, parsers ship with it. - ✓Completion is a feature, not a stack. LSP + buffer-words, on by default.
- ✓Fuzzy file / buffer / grep pickers on
<space>. Built in. - ✓Format on save via biome &
.editorconfig.:fmtif you'd rather drive it.
// caveat: binvim is opinionated. It does not have a plugin API. If you want a 200-plugin fortress, stay on Neovim — it is the better tool for that job. binvim is for the developer who opened their config file last week and felt tired.
Modal editing, faithfully
Normal · insert · visual (charwise, linewise, blockwise). Operators, text objects, marks, registers, dot-repeat, undo tree, macros. The grammar you already speak.
Tree-sitter, compiled in
Rust, TS/TSX, JS, JSON, Go, HTML, CSS, Markdown, C#. Grammars baked into the binary — upgrade binvim and your parsers come with it.
Real LSP, multi-server
Diagnostics, hover, completion, goto-definition. Primary + auxiliary servers fan out per buffer — Tailwind layers on top of CSS / HTML / JSX / Vue / Svelte / Astro automatically.
Fuzzy everywhere
Files, buffers, live grep — all on the leader. No telescope-extension folder, no fzf shim, no node bridge. Just a fast fuzzy matcher and a list.
Format on save
Biome handles JS/TS/JSX/TSX/JSON/JSONC. .editorconfig directives applied on save (final newline, trailing whitespace). :fmt drives it manually.
Whitespace visible
Every space, tab, NBSP, and EOL surfaces as a muted glyph (· → ⎵ ¬) in the overlay colour. You see what the file actually contains.
: in normal mode%s/.../.../g for buffer» ~/.config/binvim/config.tomltoml · 21L · 538B# missing or malformed → defaults to baked-in Catppuccin Mocha schema_version = 1 [colors] # hex (#rrggbb) or a named crossterm colour. dotted suffixes # match more specifically before falling back to the head. keyword = "#cba6f7" "keyword.return" = "Magenta" string = "#a6e3a1" [start_page] lines = [ " hello, world ", " press : to start ", ] [whitespace] # space=· tab=→ nbsp=⎵ eol=¬ on by default show = true
binvim spawns these on demand. Each is optional — when a binary isn't on
$PATH (or in a relevant node_modules/.bin/) the
editor just skips that capability.
// resolution order:
project-local node_modules/.bin/ → $PATH.
Global installs lose to project-local devDependencies, which is what you want.