VSCodeVim vs vscode-neovim: Vim keys in VS Code, two ways
VSCodeVim reimplements Vim inside VS Code in TypeScript: install it and it works, configured in settings.json, but some commands (such as :g) are missing. vscode-neovim runs a real Neovim process and lets VS Code handle Insert mode, so Normal mode, Ex commands and your init.lua behave as in Neovim, at the cost of installing Neovim 0.10 or newer and some setup. Beginners usually start with VSCodeVim; Neovim users usually prefer vscode-neovim.
| VSCodeVim | vscode-neovim | |
|---|---|---|
| How it works | Emulates Vim, written in TypeScript, inside VS Code | Runs a real Neovim instance; VS Code shows and edits the same buffer |
| Needs installed | Nothing else | Neovim 0.10 or newer |
| Insert mode | Handled by the extension | Handled by VS Code itself |
| Config | vim.* settings in settings.json; experimental .vimrc support for mappings only | Your init.lua or init.vim; check vim.g.vscode to load parts only inside VS Code |
| Ex commands | Its own set: :s, :normal, :sort, :m, :t, :registers, :marks and more; :g and :v not implemented | Neovim's own |
| Macros and registers | Implemented: q to record, @ to play, named registers | Neovim's own |
| Vim plugins | Built-in emulations of a few: EasyMotion, surround, commentary, ReplaceWithRegister | Real Neovim plugins for motions, text objects and editing; UI plugins don't apply |
| Multiple cursors | Supported, marked experimental | In Insert, Visual line and Visual block modes |
| Known rough edges | Key repeat on macOS needs a one-time defaults write; takes over Ctrl keys on Windows by default | Ctrl shortcuts must be bound in VS Code to reach Neovim; scrolling and the jump list are VS Code's |
Two approaches: emulation or the real thing
VSCodeVim describes itself as "Vim emulation for Visual Studio Code". Every motion, operator and command is reimplemented in the extension's own TypeScript code, which runs inside VS Code. That makes it self-contained (install from the Marketplace or Open VSX and you are done), and it means each Vim feature exists only if someone has written it.
vscode-neovim takes the other route: "this extension uses a fully embedded Neovim instance". Your keystrokes in Normal and Visual mode go to an actual Neovim process, which edits the buffer and sends the result back; VS Code's own editor handles Insert mode, which the project describes as giving a "lag-free insert mode". Anything Neovim can do in Normal mode, it does, because it is Neovim.
Compatibility: what works where
For everyday editing the two feel the same. Motions, operators, counts, text objects, . repeat, Visual mode, search, registers and macros work in both.
The differences show up at the edges:
- Ex commands. VSCodeVim parses Ex commands itself, and in its source as of November 2026
:s,:normal,:sort,:m,:t,:registersand:marksare implemented, while:gand:vare listed but unimplemented. It has an experimental option,vim.enableNeovim, that hands Ex commands to a Neovim install. In vscode-neovim every Ex command is Neovim's. - Plugins. VSCodeVim ships its own versions of a few favourite plugins (EasyMotion, surround with ds" and friends, commentary's gc, ReplaceWithRegister). vscode-neovim can load your real Neovim plugins; its README says navigation, text-object and editing plugins generally work, while plugins for highlighting, completion, LSP, file trees and fuzzy finding are unnecessary because VS Code already does those jobs.
- Behaviour owned by VS Code. In vscode-neovim, scrolling and the jump list belong to VS Code, and . can behave differently after some Insert-mode edits. In VSCodeVim, behaviour is whatever the emulation implements, which occasionally differs from Vim in small ways.
A :g that VSCodeVim can't run
Delete every console.log line with one command: :g/console.log/d and ↵. This works in Vim, Neovim and vscode-neovim. In VSCodeVim (as of November 2026) :g is not implemented, unless you turn on vim.enableNeovim, which hands Ex commands to Neovim.
This editor needs a keyboard. Read on, and play it at your computer.
A macro, in either extension
Macros work in both: VSCodeVim implements them, and vscode-neovim hands them to Neovim.
On the first line you record qa I" Esc A", Esc j q, then press 2@a. What do you get?
Configuration
VSCodeVim is configured in VS Code's settings.json: options such as vim.hlsearch and vim.useSystemClipboard, and mappings per mode in vim.normalModeKeyBindings and its siblings (with NonRecursive variants). You can point it at a .vimrc with vim.vimrc.enable and vim.vimrc.path, but that support is experimental and only reads mappings.
vscode-neovim uses your normal Neovim config. Its README recommends starting from an empty config, then adding back only what makes sense, guarded by if vim.g.vscode then in Lua (or exists('g:vscode') in Vimscript), or with a plugin manager's cond = vim.g.vscode. That makes it easy to share one config between Neovim in the terminal and VS Code.
Key handling needs attention in both. VSCodeVim takes over Ctrl keys by default on Windows (vim.useCtrlKeys and vim.handleKeys control this). In vscode-neovim, Ctrl shortcuts reach Neovim only if a VS Code keybinding sends them, and an escape chord such as jj is set up through its compositeKeys setting.
Performance
Neither project publishes benchmarks, and both document what to do if things feel slow. VSCodeVim's README suggests the extensions.experimental.affinity setting, which runs it in its own extension host process. vscode-neovim's README says the usual symptom is cursor jitter, caused by slow Neovim plugins or by other extensions that redraw decorations often, and suggests disabling those or testing with vscode-neovim.neovimClean to start Neovim without plugins.
Because vscode-neovim leaves Insert mode to VS Code, typing text is native. Because VSCodeVim does everything in-process, there is no second program to start or keep in sync.
Choosing, and switching
Install only one. vscode-neovim's README notes that a "command 'type' already exists" error means another extension that uses that command, such as VSCodeVim, has to be uninstalled. Switching later costs little: your Vim habits are the same in both, and only the config moves.
If you are still learning the motions, the extension matters less than the practice. You can practise them in a browser at the course, and the VS Code and IdeaVim lesson walks through installing either extension.
Which should you pick?
- You are new to Vim and want it working in VS Code in a minute VSCodeVim. Nothing else to install, and its built-in surround, commentary and EasyMotion cover common needs.
- You already use Neovim and have an init.lua you like vscode-neovim. Your mappings, options and editing plugins come with you.
- You rely on
:g, complex:normalranges or exact Vim behaviour vscode-neovim. Ex commands are Neovim's, not an emulation. - You can't install extra software on your work machine VSCodeVim, since vscode-neovim needs a Neovim binary.
Questions
- Can I install VSCodeVim and vscode-neovim together?
- No. They conflict over VS Code's
typecommand. Disable or uninstall one before using the other. - Does VSCodeVim read my .vimrc?
- Only partly. With
vim.vimrc.enableit reads mappings from it; other settings go insettings.json. The feature is marked experimental. - Do macros work in VS Code?
- Yes, in both. VSCodeVim implements recording with q and playback with @; in vscode-neovim, macros run in Neovim itself.