Open-source project
VSCodeVim/Vim avatar
VSCodeVim/Vim

VSCodeVim: Vim keybindings inside Visual Studio Code

:star: Vim for Visual Studio Code

15,217 stars1,467 forksTypeScriptMIT

At a glance

What is it?
VSCodeVim layers Vim's modal editing onto VS Code instead of replacing it, which is exactly why it fits some workflows and frustrates others. Here is what the repository documents, where the emulation stops, and what to check before you install it.
Who is it for?
Adopt VSCodeVim if you want Vim's modal editing without giving up VS Code's debugger, notebooks, remote containers or extension ecosystem, and if your muscle memory tolerates an emulator rather than the real thing. Skip it if your workflow depends on Vim features the README does not list, or if you want the editor itself to be Vim; Neovim with a VS Code front end is the other path.
Can I use it commercially?
Yes. MIT is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
Is it still maintained?
Yes. The repository last received commits 6 days ago.
What is it written in?
Mainly TypeScript, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on September 30, 2026, and from our analysis. They are not legal advice.

Editorial analysis

What VSCodeVim actually solves

The problem is not that VS Code lacks a text editor. It is that modal editing and the VS Code extension ecosystem live in different worlds. Moving to Neovim means rebuilding your debugging, notebook, remote container and language server setup around a different host. Staying in VS Code means losing hjkl, text objects, registers and the command line grammar that many people have used for years.

VSCodeVim sits in the middle. It is a VS Code extension that emulates Vim's modes and motions inside the existing editor, so your extensions, settings sync and workspace configuration stay where they are. The audience is narrow but specific: developers who already have Vim muscle memory, who work in a team that standardizes on VS Code, or who need VS Code features that a terminal editor does not provide.

It is not for someone who has never used Vim and wants a lighter editor. The README assumes familiarity with modes, operators and motions. It also is not a way to run your existing Vim configuration unchanged; the .vimrc support is partial, and the extension documents its own settings as the primary configuration surface.

How the emulation is wired into the editor

The repository is TypeScript, and package.json declares the extension entry points: main points at ./out/extension for the desktop build, and browser points at ./out/extensionWeb for the web build. The extension activates on onStartupFinished and on the command type, and declares extensionKind as ui, meaning it runs on the UI side rather than in a remote extension host.

Rather than replacing VS Code's input handling wholesale, the extension registers its own commands and keybindings and then translates Vim commands into VS Code actions. The contributes section of package.json shows this directly: commands such as toggleVim, vim.showQuickpickCmdLine and vim.editVimrc, plus keybindings like extension.vim_escape bound to Escape when editorTextFocus && vim.active && !inDebugRepl. A remapping entry can therefore target either Vim keys or VS Code commands, which is why the README's example maps <C-n> to the :nohl command and K to lineBreakInsert.

That translation layer is the whole design. Vim semantics are reimplemented on top of VS Code's editor API, and a set of popular Vim plugins is reimplemented as well: vim-airline, vim-easymotion, vim-surround, vim-commentary, vim-indent-object, vim-sneak, CamelCaseMotion, ReplaceWithRegister, vim-textobj-entire and vim-textobj-arguments are listed as emulated plugins. Emulated is the operative word. These are not the original plugins running in a Vim process; they are behavior reproduced by the extension, so edge cases can differ from what the upstream plugin does.

Installing VSCodeVim and a first working setup

The README gives two distribution channels: the VS Code Marketplace and the OpenVSX Marketplace. Installation is an extension install, not a package manager install, so there is no npm or yarn step for end users. Once installed, the extension activates when VS Code starts.

On macOS the README notes that key repeating is disabled by default by the OS, which breaks held-down motions like j or l. The documented fix is a defaults write command per application identifier, followed by logging out and back in and restarting VS Code:

sh
defaults write com.microsoft.VSCode ApplePressAndHoldEnabled -bool false
defaults write com.vscodium ApplePressAndHoldEnabled -bool false
defaults delete -g ApplePressAndHoldEnabled

The README also recommends raising the Key Repeat and Delay Until Repeat values in System Settings. On Windows there is no equivalent command, but the README warns that the extension will take over your control keys, adjustable through useCtrlKeys and handleKeys.

The first real configuration step is a settings.json entry. The README's quick example is the clearest starting point, and it shows the three things most users touch: remapping jj to Escape in insert mode, setting the leader key, and excluding control keys from Vim handling.

json
{
  "vim.easymotion": true,
  "vim.incsearch": true,
  "vim.useSystemClipboard": true,
  "vim.useCtrlKeys": true,
  "vim.hlsearch": true,
  "vim.insertModeKeyBindings": [
    { "before": ["j", "j"], "after": ["<Esc>"] }
  ],
  "vim.leader": "<space>",
  "vim.handleKeys": { "<C-a>": false, "<C-f>": false }
}

After saving settings.json, open a file and press jj in insert mode. If the cursor returns to normal mode, the remapping is live. The README also documents a performance hint in the same example, using extensions.experimental.affinity to give vscodevim.vim an affinity value of 1, and it notes that the settings documented in the README are a subset, with the full list in the extension details page under FEATURES then Settings.

Where the emulation stops

The honest framing is that this is an emulator, and the README says so in its own description. Every Vim behavior has to be reimplemented against VS Code's API, and the extension maintains its own changelog for breaking, major and minor updates. That changelog is worth reading before an upgrade, because a change in emulated behavior is a change in your muscle memory.

The plugin list makes the boundary concrete. vim-easymotion, vim-surround and the text object plugins are emulated, not loaded. If you rely on a Vim plugin that is not on that list, there is no general mechanism described in the README for running it. The .vimrc support is likewise a compatibility layer, and the README does not document rollback or a way to run an arbitrary Vimscript plugin.

The second constraint is key handling. On Windows the README states plainly that VSCodeVim takes over your control keys. That is a real conflict with VS Code defaults and with other extensions, and the workaround is manual: enumerate the keys you want to keep in vim.handleKeys. There is no automatic conflict resolution described. If your workflow depends on Ctrl-based shortcuts you cannot remap, this is the wrong tool.

The third is the performance hint in the README itself. The presence of an extensions.experimental.affinity setting for vscodevim.vim, described as improving performance, implies that the extension's cost is noticeable enough to configure around on large workspaces.

Neovim integration and the alternative path

The README documents a Neovim Integration setting, which changes the trade-off rather than removing it. With that integration, parts of the editing behavior are delegated to a real Neovim instance, so the emulation is backed by Vim's own engine instead of a reimplementation. It requires a Neovim installation alongside VS Code, and it is a configuration mode rather than the default.

The alternative approach is to run Neovim as the editor and attach a VS Code-like front end, for example through a Neovim GUI or a VS Code extension that embeds Neovim. The difference is which side owns the buffer. VSCodeVim keeps VS Code as the host and emulates Vim on top; the Neovim-first path keeps Neovim as the engine and treats the GUI as a client. The first preserves the VS Code extension ecosystem exactly as it is. The second gets you real Vimscript, real plugins and the actual Vim runtime, at the cost of a different integration story for VS Code features such as notebooks and the debugger.

If your reason for using VSCodeVim is a handful of motions and text objects, the emulation is enough and much less setup. If your reason is that your Vim configuration is the valuable part, the Neovim-first path is closer to what you actually want, and the README's Neovim Integration setting is the middle ground worth reading before you commit.

Maintenance, licence and upgrade cost

The repository is not archived, and its last push was on 2026-09-19, two days before this article's reference point, so it is under current development. The most recent releases listed are v1.32.4 on 2025-12-14, v1.32.3 on 2025-12-11 and v1.32.2 on 2025-12-01, and package.json carries version 1.32.4. Note the gap between the last release and the last push: the repository has continued to receive commits since the December release, which means the extension you install from the Marketplace may lag the master branch.

The licence is MIT, declared both in the repository metadata and in package.json. For most users that is uncomplicated: you can use, modify and redistribute the extension, including in a commercial setting, provided the licence terms are met. It does not grant trademark rights, and it offers no warranty. If you fork it and ship your own build, the MIT notice needs to travel with it. Nothing here is legal advice, and if you are redistributing a modified build inside an organization, the license file in the repository is the thing to read.

The upgrade cost is the changelog. Because the extension reimplements behavior, an update can change how a motion or operator works, and the README points at CHANGELOG.md for breaking, major and minor updates between releases. Pin a version if a team depends on consistent behavior. The other recurring cost is configuration drift: the README documents only a subset of settings and defers the full list to the extension details page, so settings you rely on may not be visible in the repository documentation.

Editorial conclusion

Adopt VSCodeVim if you want Vim's modal editing without giving up VS Code's debugger, notebooks, remote containers or extension ecosystem, and if your muscle memory tolerates an emulator rather than the real thing. Skip it if your workflow depends on Vim features the README does not list, or if you want the editor itself to be Vim; Neovim with a VS Code front end is the other path. Verify first that vim.useCtrlKeys and vim.handleKeys match the shortcuts you refuse to lose, because on Windows the README states the extension takes over your control keys by default.

Frequently asked questions

Can I use Vim with VS Code?

Yes. VSCodeVim is a Vim emulator for Visual Studio Code, installed from the VS Code Marketplace or the OpenVSX Marketplace. It emulates Vim modes and motions inside VS Code rather than replacing the editor.

Is Vim actually better than VS Code?

The README does not compare the two editors; it positions VSCodeVim as Vim emulation for VS Code, so you keep VS Code as the host and get Vim's modes and motions inside it. The choice depends on whether you need VS Code features such as notebooks and the debugger or a real Vim runtime.

Which is better for VS Code, Neovim or Vim?

The README documents a Neovim Integration setting that delegates editing behavior to a real Neovim instance, while the default mode is VSCodeVim's own emulation. The Neovim route requires a Neovim installation alongside VS Code and is a configuration mode rather than the default.

Why would anyone use Vim?

The README does not argue the case for Vim; it assumes familiarity with modes, operators and motions and focuses on reproducing them in VS Code. What it does document is the configuration surface, including remapping, .vimrc support and a set of emulated plugins.

Official sources

  1. License: MIT
  2. Project website
  3. README
  4. Releases
  5. VSCodeVim/Vim on GitHub
Add this badge to your README

If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.

Add this badge to your README

markdown
[![Hysen Labs](https://hysenlabs.com/badge/vscodevim-vim.svg)](https://hysenlabs.com/projects/vscodevim-vim)