Vim

Current: 9.x — Created by Bram Moolenaar (1991)

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.

Neovim

Current: 0.10+ — Fork by Thiago de Arruda (2014)

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 Comparison

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.

⚡ Key Differentiators In Depth

Neovim: Lua-First Design

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:

  • Faster plugin execution (LuaJIT)
  • Familiar language for developers
  • Access to the full Lua standard library
  • Easy integration with C extensions
Neovim: Built-in LSP Client

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:

  • No polling — async by default
  • Works with any LSP-compliant server
  • Unified API for all languages
  • No more ALE/YCM fragmentation
Neovim: Headless + RPC API

Neovim can run fully headless and be controlled via msgpack-RPC. This enables:

  • Rich GUI frontends (Neovide)
  • IDE plugin bridges (VS Code, IntelliJ)
  • Automated testing of editor behavior
  • Embedding Neovim in other apps
Vim: Ubiquity & Stability

Vim's main advantages over Neovim:

  • Available on nearly every Unix system
  • Extremely stable — fewer breaking changes
  • Lower dependency footprint
  • Vim9script for advanced Vimscript users
  • Better if you SSH to many servers
  • gvim for cross-platform GUI

🔄 Migrating from Vim to Neovim

Good news: Your .vimrc is mostly compatible. Neovim sources it from ~/.vim/vimrc and most Vim plugins work unchanged.
Step 1 — Create init.lua

Create ~/.config/nvim/init.lua. You can start by just calling your old vimrc:

vim.cmd('source ~/.vimrc')

Then gradually migrate pieces to Lua.

Step 2 — Migrate Options

Replace set with vim.opt:

-- Vim
set number
set tabstop=2

-- Neovim (Lua)
vim.opt.number = true
vim.opt.tabstop = 2
Step 3 — Migrate Keymaps

Replace nnoremap with vim.keymap.set:

-- Vim
nnoremap <leader>ff :find <CR>

-- Neovim (Lua)
vim.keymap.set('n', '<leader>ff',
  vim.cmd.find)
Step 4 — Switch Plugin Manager

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' }

⚖ When to Use Which

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
Bottom line: If you're starting fresh in 2024+, choose Neovim. The ecosystem, built-in features, and Lua scripting make it the clear choice for a power editor. Keep learning core Vim motions — they work identically in both.