neovim/neovim
Lore
The story of how Neovim got from "we should fork Vim" to a 36,000-commit codebase. Dates are derived from git history and tagged releases.
Eras
The fork (Jan–Jul 2014)
Neovim begins on 2014-01-31 with a single commit: Import vim from changeset v5628:c9cad40b4181. The next several months are spent ripping out platform-specific code paths that were hardcoded for legacy systems (DOS, OS/2, Amiga, classic Mac), removing GUI toolkit integrations (if_motif, if_athena, if_gtk), and replacing the input/output layer. Thiago de Arruda is the first contributor, and the early commit log is full of "Remove more #ifdef dead code" entries.
The architectural bet: rip out Vim's homegrown event handling and replace it with libuv. That decision shapes everything afterwards.
Async and msgpack-rpc (mid 2014 – early 2015)
The libuv loop lands and the msgpack-rpc layer is built on top. The original goal — let UIs attach over a pipe rather than be linked into the editor — is achieved when the TUI is split out of the core. :terminal (Neovim's own contribution) lands; jobstart() and the v0 API stabilize. Neovim ships v0.1.0 in November 2015.
Lua arrives (2017–2019)
LuaJIT had been embedded since the early days for some internal tooling, but it was not a first-class plugin language. Through v0.4.x (2018–2019) the vim.api, vim.fn, and vim.regex Lua bridges land. The premise — "Vimscript is fine but a real language is better" — drives most of what comes later.
LSP and treesitter (2020–2021)
Neovim ships a built-in [LSP] client in v0.5.0 (July 2021). At the same time, [tree-sitter] is integrated as an alternative to the legacy regexp-based syntax engine (runtime/lua/vim/treesitter* and src/nvim/lua/treesitter.c). These two features change the value proposition of Neovim: it is no longer just a faster, async-friendly Vim — it is a full IDE substrate with a Lua-first plugin ecosystem.
The Lua stdlib (2022–2024)
runtime/lua/vim/ grows from a thin collection of helpers into a documented standard library: vim.fs, vim.iter, vim.diagnostic, vim.snippet, vim.version, vim.system, vim.lpeg, vim.re, vim.ui. The pattern of "implement the new thing in Lua, expose just enough hooks from C" becomes the default. By v0.10 (May 2024) most non-trivial features ship as Lua first.
Built-in package manager and faster defaults (2024–2026)
vim.pack lands in late 2025 / early 2026 (runtime/lua/vim/pack.lua, ~53k lines including helpers), giving Neovim a built-in plugin manager that doesn't require an external bootstrapper. vim.ui.select, vim.ui.img, default LSP clients, and richer terminal output handling fill out the ergonomics. The 0.12.x series is the current stable line.
Longest-standing features
Code that survived from the Vim import and is still load-bearing:
- The memline (
src/nvim/memline.c, ~144k bytes). The disk-backed line storage that lets you edit gigabyte files. Has been touched many times but never rewritten. - The regexp engine (
src/nvim/regexp.c, ~456k bytes / 16k lines). Still the largest single file in the tree. Two engines coexist — the original NFA-style and the newer one — both inherited. normal.c(6,685 lines). The dispatch table for normal-mode commands has the same structure it did on day one of the import, even though virtually every entry has been refactored.- The undo tree (
src/nvim/undo.c, ~97k bytes). The "branching undo" that Vim users know and love. Inherited from Vim and largely unchanged in structure.
Major rewrites
- TUI separation (2015–2016). The terminal renderer moved from a tightly coupled in-process subsystem to a separate client process talking over msgpack-rpc. Today the same code is used to run a TUI and to power any third-party UI.
- Extmarks and marktree (2018–2020). Vim had marks; Neovim built extmarks, a more robust and feature-rich mechanism backed by a B+-tree (
src/nvim/marktree.c). Highlight ranges, virtual text, signs, and conceal regions all moved onto extmarks. - Decoration provider rewrite (2020). The screen-drawing path was reworked to consult per-line decoration providers (
src/nvim/decoration_provider.c) so plugins can compute highlights lazily. - Treesitter integration (2020–2021). Replaced (and now coexists with) the regex-based syntax engine for languages that have a tree-sitter grammar.
- LSP client (2021). Built from scratch in Lua. Lives entirely under
runtime/lua/vim/lsp/. - Options as data (2022). The hand-coded options table was replaced by a single source of truth in
src/nvim/options.lua(10,956 lines) that drives code generation. Same pattern was applied toex_cmds.lua,eval.lua,auevents.lua,vvars.lua,keycodes.lua. - Generated docs (ongoing).
:helpfiles for the API, options, and Lua stdlib are now regenerated bysrc/gen/gen_vimdoc.luarather than hand-maintained.
Deprecated features
- Python 2 provider. Removed when upstream Python 2 hit end of life. The Python 3 provider lives on at
runtime/lua/vim/provider/python.lua. - Hand-rolled syntax-only highlighting. Still present (legacy
:syntax), but for many languages the recommended path is treesitter. viminfoas the persistent state format. Replaced byshada(src/nvim/shada.c). The legacy file is read for migration but no longer written.- Deprecated API.
src/nvim/api/deprecated.c(32k bytes) keeps obsoletenvim_*functions alive at warning level. They are removed only at major version boundaries.
Growth trajectory
- 2014: solo to handful of contributors, single binary, no Lua plugins.
- 2017: ~20k commits, Lua bridge in beta.
- 2021: ~25k commits, LSP and treesitter ship.
- 2024: ~30k commits,
vim.iter,vim.fs,vim.system, default config. - 2026: 36k+ commits, built-in package manager, async UI selectors,
vim.ui.img.
The contributor base broadened steadily. The all-time top committer (zeertzjq, ~5,700 commits) joined long after the fork; in the last 90 days the same person leads with ~423 commits, confirming Neovim's "always-on maintainer" pattern. See Maintainers for the per-subsystem ownership map.
Built by Factory AutoWiki from public repository content. It is a generated preview for codebase exploration, not source-maintained documentation.