A deep comparison — architecture, features, extensibility, and which to choose.
The legendary editor that defined modal text editing. Vim 9 brought a new scripting language (Vim9script) for speed improvements. Extremely stable, ships everywhere, and is the benchmark all modal editors measure against.
A refactor of Vim focused on extensibility, modern architecture, and better defaults. First-class Lua scripting, built-in LSP, Treesitter, async job control, RPC API, and a vibrant plugin ecosystem define the Neovim experience.
| Feature | Vim | Neovim | Notes |
|---|---|---|---|
| Scripting language | Vimscript / Vim9script | Lua native + Vimscript | Neovim's Lua is JIT-compiled (LuaJIT), much faster. Vim9script is fast but Vim-only. |
| LSP support | plugin only (vim-lsp, ALE) | built-in | Neovim has a native LSP client since 0.5. Vim requires plugins. |
| Treesitter | partial plugin | built-in | Neovim bundles Treesitter for accurate parsing. Vim has a plugin but integration is limited. |
| Async job control | yes (vim 8+) | yes | Both support async, but Neovim's libuv-based event loop is more robust. |
| RPC / API | no | built-in | Neovim exposes a msgpack-RPC API, enabling GUI frontends (neovide, goneovim) and external tools. |
| GUI frontends | gvim (built-in) | Neovide, nvim-qt, goneovim, Neovim.app | Neovim's RPC API allows richer 3rd-party GUIs with animations, fonts, etc. |
| Default config location | ~/.vimrc |
~/.config/nvim/init.lua |
Neovim follows XDG spec. Lua config is the modern standard. |
| Vimscript compat | full | mostly | Neovim supports most Vimscript. Some rarely-used features differ. |
| Terminal emulator | yes (vim 8+) | yes | Both have :term. Neovim's terminal mode is more polished. |
| Floating windows | no | built-in | Neovim has nvim_open_win(). Enables modern UI elements: popups, hover docs, etc. |
| Virtual text / extmarks | no | built-in | Inline diagnostic hints, git blame, and other overlays require virtual text. |
| Diagnostic system | no (plugin) | vim.diagnostic | Unified diagnostic API for LSP, linters, etc. Plugins hook into one system. |
| Spell check | yes | yes | Identical. :set spell works in both. |
| Folding | yes | yes | Both support all fold methods. Neovim adds Treesitter-based folds. |
| Plugin ecosystem | Large (vim-plug, Vundle) | Larger + modern (lazy.nvim) | Most new plugins are Neovim-only. Vim plugins largely work in Neovim too. |
| Built-in completion | yes (omni) | yes + LSP | Both have Ctrl+n completion. Neovim adds LSP completion via plugins (nvim-cmp). |
| Startup time | Very fast | Fast (slightly heavier base) | Both are fast. Vim edge with default install; Neovim with lazy loading. |
| License | Vim license (charityware) | Apache 2.0 | Neovim uses a standard OSI-approved license. |
| Default colorscheme | default | habamax (Nvim 0.8+) | Neovim ships with better defaults including habamax, lunaperche. |
| ubiquity / preinstalled | vim wins | Less common preinstalled | Vim or vi is on virtually every Unix/Linux system by default. |
While Vim uses Vimscript (slow, opaque) and the new Vim9script, Neovim made Lua a first-class citizen from day one. Configuration, plugins, and even core features use Lua. This means:
Language Server Protocol allows editors to get IDE features (autocompletion, go-to-definition, diagnostics) from external language servers. Neovim ships with a native LSP client (vim.lsp) meaning:
Neovim can run fully headless and be controlled via msgpack-RPC. This enables:
Vim's main advantages over Neovim:
.vimrc is mostly compatible. Neovim sources it from ~/.vim/vimrc and most Vim plugins work unchanged.
Create ~/.config/nvim/init.lua. You can start by just calling your old vimrc:
vim.cmd('source ~/.vimrc')
Then gradually migrate pieces to Lua.
Replace set with vim.opt:
-- Vim
set number
set tabstop=2
-- Neovim (Lua)
vim.opt.number = true
vim.opt.tabstop = 2
Replace nnoremap with vim.keymap.set:
-- Vim
nnoremap <leader>ff :find <CR>
-- Neovim (Lua)
vim.keymap.set('n', '<leader>ff',
vim.cmd.find)
Move from vim-plug to lazy.nvim for lazy-loading, better performance, and Lua-native plugin config. Most vim-plug plugins work directly in lazy.nvim:
-- vim-plug
Plug 'tpope/vim-fugitive'
-- lazy.nvim
{ 'tpope/vim-fugitive' }
| Scenario | Use Vim if... | Use Neovim if... |
|---|---|---|
| Server editing | You SSH to many remote servers where only vi/vim is available | You install your own tools on servers |
| Stability preference | You want a config that never breaks on update | You're okay with occasional plugin breakage for more features |
| IDE-like features | Basic editing, minimal plugins | You want LSP, diagnostics, completion, git integration built-in |
| Programming workflow | Simple scripting and config editing | Primary IDE for daily development |
| Plugin authoring | You know Vimscript well | You prefer Lua and want async APIs |