The project's README from github.com/VSCodeVim/Vim. As one markdown file: README.md.
Vim emulation for Visual Studio Code
VSCodeVim is a Vim emulator for Visual Studio Code.
"vim.insertModeKeyBindings"/"vim.normalModeKeyBindings"/"vim.visualModeKeyBindings"/"vim.operatorPendingModeKeyBindings""vim.insertModeKeyBindingsNonRecursive"/"normalModeKeyBindingsNonRecursive"/"visualModeKeyBindingsNonRecursive"/"operatorPendingModeKeyBindingsNonRecursive"VSCodeVim can be installed via the VS Code Marketplace or the OpenVSX Marketplace.
To enable key-repeating, execute the following in your Terminal, log out and back in, and then restart VS Code:
defaults write com.microsoft.VSCode ApplePressAndHoldEnabled -bool false # For VS Code
defaults write com.microsoft.VSCodeInsiders ApplePressAndHoldEnabled -bool false # For VS Code Insider
defaults write com.vscodium ApplePressAndHoldEnabled -bool false # For VS Codium
defaults write com.microsoft.VSCodeExploration ApplePressAndHoldEnabled -bool false # For VS Codium Exploration users
defaults write com.exafunction.windsurf ApplePressAndHoldEnabled -bool false # For Windsurf
defaults delete -g ApplePressAndHoldEnabled # If necessary, reset global default
We also recommend increasing Key Repeat and Delay Until Repeat settings in System Settings/Preferences -> Keyboard.
Like real vim, VSCodeVim will take over your control keys. This behavior can be adjusted with the useCtrlKeys and handleKeys settings.
The settings documented here are a subset of the supported settings; the full list is described in the FEATURES -> Settings tab of VSCodeVim's extension details page, which can be found in the extensions view of VS Code.
Below is an example of a settings.json file with settings relevant to VSCodeVim:
{
"vim.easymotion": true,
"vim.incsearch": true,
"vim.useSystemClipboard": true,
"vim.useCtrlKeys": true,
"vim.hlsearch": true,
"vim.insertModeKeyBindings": [
{
"before": ["j", "j"],
"after": ["<Esc>"]
}
],
"vim.normalModeKeyBindingsNonRecursive": [
{
"before": ["<leader>", "d"],
"after": ["d", "d"]
},
{
"before": ["<C-n>"],
"commands": [":nohl"]
},
{
"before": ["K"],
"commands": ["lineBreakInsert"],
"silent": true
}
],
"vim.leader": "<space>",
"vim.handleKeys": {
"<C-a>": false,
"<C-f>": false
},
// To improve performance
"extensions.experimental.affinity": {
"vscodevim.vim": 1
}
}
These settings are specific to VSCodeVim.
| Setting | Description | Type | Default Value |
|---|---|---|---|
| vim.changeWordIncludesWhitespace | Include trailing whitespace when changing word. This configures the cw action to act consistently as its siblings (yw and dw) instead of acting as ce. | Boolean | false |
| vim.cursorStylePerMode.{Mode} | Configure a specific cursor style for {Mode}. Omitted modes will use default cursor type Supported cursors: line, block, underline, line-thin, block-outline, and underline-thin. | String | None |
| vim.digraphs.{shorthand} | Set custom digraph shorthands that can override the default ones. Entries should map a two-character shorthand to a descriptive string and one or more UTF16 code points. Example: "R!": ["๐", [55357, 56960]] |
Object | {"R!": ["๐", [0xD83D, 0xDE80]] |
| vim.disableExtension | Disable VSCodeVim extension. This setting can also be toggled using toggleVim command in the Command Palette |
Boolean | false |
| vim.handleKeys | Delegate configured keys to be handled by VS Code instead of by the VSCodeVim extension. Any key in keybindings section of the package.json that has a vim.use<C-...> in the when argument can be delegated back to VS Code by setting "<C-...>": false. Example: to use ctrl+f for find (native VS Code behavior): "vim.handleKeys": { "<C-f>": false }. |
String | "<C-d>": true"<C-s>": false"<C-z>": false |
| vim.overrideCopy | Override VS Code's copy command with our own, which works correctly with VSCodeVim. If cmd-c/ctrl-c is giving you issues, set this to false and complain here. | Boolean | false |
| vim.useSystemClipboard | Use the system clipboard register (*) as the default register |
Boolean | false |
| vim.searchHighlightColor | Background color of non-current search matches | String | findMatchHighlightBackground ThemeColor |
| vim.searchHighlightTextColor | Foreground color of non-current search matches | String | None |
| vim.searchMatchColor | Background color of current search match | String | findMatchBackground ThemeColor |
| vim.searchMatchTextColor | Foreground color of current search match | String | None |
| vim.substitutionColor | Background color of substitution text when vim.inccommand is enabled |
String | "#50f01080" |
| vim.substitutionTextColor | Foreground color of substitution text when vim.inccommand is enabled |
String | None |
| vim.startInInsertMode | Start in Insert mode instead of Normal Mode | Boolean | false |
| vim.useCtrlKeys | Enable Vim ctrl keys overriding common VS Code operations such as copy, paste, find, etc. | Boolean | true |
| vim.visualstar | In visual mode, start a search with * or # using the current selection |
Boolean | false |
| vim.highlightedyank.enable | Enable highlighting when yanking | Boolean | false |
| vim.highlightedyank.color | Set the color of yank highlights | String | rgba(250, 240, 170, 0.5) |
| vim.highlightedyank.duration | Set the duration of yank highlights | Number | 200 |
:warning: Experimental feature. Please leave feedback on neovim integration here.
To leverage neovim for Ex-commands,
| Setting | Description | Type | Default Value |
|---|---|---|---|
| vim.enableNeovim | Enable Neovim | Boolean | false |
| vim.neovimPath | Full path to neovim executable. If left empty, PATH environment variable will be automatically checked for neovim path. | String | |
| vim.neovimUseConfigFile | If true, Neovim will load a config file specified by vim.neovimConfigPath. This is necessary if you want Neovim to be able to use its own plugins. |
Boolean | false |
| vim.neovimConfigPath | Path that Neovim will load as config file. If left blank, Neovim will search in its default location. | String |
Here's some ideas on what you can do with neovim integration:
Custom remappings are defined on a per-mode basis.
"vim.insertModeKeyBindings"/"vim.normalModeKeyBindings"/"vim.visualModeKeyBindings"/"vim.operatorPendingModeKeyBindings""before", "after", "commands", and "silent".jj to <Esc> in insert mode: "vim.insertModeKeyBindings": [
{
"before": ["j", "j"],
"after": ["<Esc>"]
}
]
ยฃ to goto previous whole word under cursor: "vim.normalModeKeyBindings": [
{
"before": ["ยฃ"],
"after": ["#"]
}
]
: to show the command palette, and don't show the message on the status bar: "vim.normalModeKeyBindings": [
{
"before": [":"],
"commands": [
"workbench.action.showCommands",
],
"silent": true
}
]
<leader>m to add a bookmark and <leader>b to open the list of all bookmarks (using the Bookmarks extension): "vim.normalModeKeyBindings": [
{
"before": ["<leader>", "m"],
"commands": [
"bookmarks.toggle"
]
},
{
"before": ["<leader>", "b"],
"commands": [
"bookmark