Open-source project
JetBrains/ideavim avatar
JetBrains/ideavim

IdeaVim: a Vim engine inside JetBrains IDEs, and what it does not replace

IdeaVim – A Vim engine for JetBrains IDEs

10,273 stars812 forksKotlinMIT

At a glance

What is it?
IdeaVim brings Vim modes, mappings and a .ideavimrc to IntelliJ-based IDEs. It is a keybinding and editing layer, not a terminal Vim, and the difference matters when you plan your setup.
Who is it for?
Adopt IdeaVim if you already know Vim motions and want them inside IntelliJ IDEA, PyCharm, GoLand or another JetBrains IDE without giving up refactoring and debugger actions; the <Action> mapping is the feature that makes the combination better than either tool alone. Do not adopt it if you need a real terminal Vim, if your plugin set depends on Vim features outside the supported list, or if you are unwilling to resolve keymap conflicts.
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 1 day ago.
What is it written in?
Mainly Kotlin, according to GitHub's language statistics.

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

Editorial analysis

The gap IdeaVim fills between Vim muscle memory and IDE tooling

Most editors force a choice. You keep Vim and lose the refactoring, debugger and version-control integration of a full IDE, or you keep the IDE and lose modal editing. IdeaVim is aimed at people who refuse that trade. It is a Vim engine implemented for JetBrains IDEs, so the modal layer sits on top of the editor rather than replacing it.

The audience is narrow and specific. According to the README, the plugin runs in IntelliJ IDEA, PyCharm, GoLand, CLion, PhpStorm, WebStorm, RubyMine, DataGrip, DataSpell, Rider, Cursive, Android Studio, and other JetBrains IDEs. If you do not already know Vim motions, IdeaVim is a poor first step: it changes the default behaviour of the editor you are still learning. If you do know them, the value is that `dd` and `ciw` keep working while `RenameElement` and the debugger stay one mapping away.

The project is written in Kotlin and carries the MIT licence. It is an official JetBrains project, which is worth noting because it means the plugin is developed against the same platform it plugs into, not against a third-party API surface that can shift without warning.

How the engine, the config file and IDE actions fit together

The repository layout shows the split clearly: `vim-engine/`, `ideavim-frontend/`, `ideavim-backend/`, plus per-IDE modules such as `ideavim-rider/`, `ideavim-clion-nova/` and `ideavim-terminal/`. The engine handles Vim semantics; the frontend and backend modules connect those semantics to the IDE's editor and platform services. That is why the same plugin can ship for a dozen products without a separate Vim implementation for each.

Configuration flows through one file. `~/.ideavimrc` is described as the analog of `~/.vimrc`, and the README gives a `source ~/.vimrc` line so an existing Vim configuration can be pulled in. The XDG standard is supported as well: settings can live in `$XDG_CONFIG_HOME/ideavim/ideavimrc`. There is also an `IDEA_VIM_CUSTOM_VIMRC` environment variable that overrides the default locations entirely.

The interesting mechanism is action mapping. IdeaVim exposes IDE actions as Ex commands and as a special mapping keyword. `:action {action_id}` runs an action from the command line, while `<Action>({action_id})` is the form used in mappings. The README warns that `<Action>` mappings do not work with `noremap`, and asks users who hit a case where they need it to report back. That is an honest limitation stated up front, and it tells you the mapping layer is not a transparent passthrough to Vim's mapping semantics.

The supported feature summary is broad but not exhaustive: modes, motion and change commands, key mappings, marks, macros, digraphs, registers, some `set` commands, full Vim regexps for search and search/replace, Vim script with some builtin functions, and IdeaVim plugins. The word "some" appears twice there. Read it as a boundary, not as modesty.

Installing IdeaVim and setting up a first .ideavimrc

There is no package manager step. IdeaVim installs through the IDE's own plugin UI: `Settings | Plugins`. The README points to JetBrains' general plugin-management instructions for the details, so the exact clicks depend on your IDE version. After installation, `Tools | Vim` in the menu enables or disables Vim mode, which is the fastest way to confirm the plugin loaded.

Your configuration lives in `~/.ideavimrc`. The README's example file is a reasonable starting skeleton, and the parts worth copying first are the leader key and the IDE action mappings:

vim
let mapleader=" "
set showmode
set incsearch
set nu

map <leader>r <Action>(RenameElement)
map <leader>b <Action>(ToggleLineBreakpoint)
map <leader>o <Action>(FileStructurePopup)

What you should see after reloading: a space leader, the mode indicator, incremental search and line numbers, and a rename refactor triggered by space followed by `r`. If the leader does nothing, the file is not being read from the path IdeaVim expects.

That path is less obvious than it looks. The README notes that overriding the `user.home` JVM option changes where IdeaVim looks. With `-Duser.home=/my/alternate/home`, IdeaVim sources `/my/alternate/home/.ideavimrc` instead of `~/.ideavimrc`. If you run the IDE with a custom home, place the file there, or point `IDEA_VIM_CUSTOM_VIMRC` at an explicit path so IdeaVim reads that instead of the default locations.

Shortcut conflicts are the other setup task. The README directs Linux and Windows users to `File | Settings | Editor | Vim` and `File | Settings | Keymap`, and macOS users to `Preferences | Editor | Vim` and `Preferences | Keymap`, with regular Vim mappings in `~/.ideavimrc` as the third lever. Expect to spend real time here; the IDE ships with its own keymap and IdeaVim does not silently win every collision.

Where IdeaVim stops being Vim: plugins, scripts and EAP builds

The clearest failure mode is extension compatibility. IdeaVim plugins are a separate ecosystem, documented in the project wiki under `doc/IdeaVim Plugins.md`, and they are not Vim plugins. A Vim plugin that depends on Vim's internal scripting surface, on a terminal feature, or on a specific `set` option outside the supported list will not load. The README's own example enables `surround`, `multiple-cursors`, `commentary`, `argtextobj`, `easymotion`, `textobj-entire` and `ReplaceWithRegister` through `set` commands, which shows the pattern: IdeaVim plugins are enabled by name, not installed from a plugin manager.

Vim script support is partial by design. The README says Vim script is supported "including some builtin functions" and links to `vimscript-info/FUNCTIONS_INFO.MD`. A large `.vimrc` that leans on autocommands, complex functions or plugin-manager bootstrapping will not port cleanly. Sourcing `~/.vimrc` from `~/.ideavimrc` is a convenience, not a compatibility guarantee.

The Early Access Program deserves its own warning, and the README supplies one. EAP builds are subscribed to from the status bar icon under `Early Access Program | Subscribe to EAP`, or by adding `https://plugins.jetbrains.com/plugins/eap/ideavim` under `Settings | Plugins` via `Manage Plugin Repositories`. The README states plainly that EAP quality "may at times be way below even usual beta standards." If your editor is where you earn a living, that sentence should decide the question for you.

Finally, IdeaVim is not a terminal. It runs inside a GUI IDE, and the `ideavim-terminal/` module in the repository handles the terminal context rather than making the IDE a terminal. If your workflow depends on tmux, shell integration or running Vim over SSH, IdeaVim does not address any of that.

IdeaVim compared with running Vim itself or an editor's built-in Vim mode

The obvious alternative is Vim, or Neovim, in a terminal. The difference is not the editing model, which is the same, but what surrounds it. Terminal Vim gives you the full plugin ecosystem, Lua or Vimscript without a supported-subset caveat, and behaviour that matches upstream documentation exactly. It does not give you `RenameElement`, `ToggleLineBreakpoint`, `Annotate` or `Vcs.ShowTabbedFileHistory` as first-class mappings. With IdeaVim those are `<Action>` targets, which is the whole point of the plugin and the reason the comparison is not a simple feature count.

A second alternative is the Vim emulation built into other editors, such as VS Code's Vim extension. The architectural difference is where the action layer lives. VS Code's emulation maps to VS Code commands; IdeaVim maps to JetBrains action IDs and also exposes them through `:action` on the Ex command line. If you switch IDEs, your `~/.ideavimrc` mappings do not transfer, because the action IDs are JetBrains-specific strings. That coupling is the cost of the integration.

A third option is to stay in the IDE and skip modal editing entirely. That is a legitimate choice, and it is the right one for anyone who has not internalised Vim motions. IdeaVim does not teach Vim, and a half-learned modal layer inside an IDE is slower than the default keymap.

Maintenance, licence and what upgrading actually involves

The repository is not archived, and the last push was on 2026-09-21. The project is developed in the open under the MIT licence, with `LICENSE.txt` and `ThirdPartyLicenses.md` at the top level. MIT is permissive: it allows use, modification and redistribution with the licence and copyright notice retained. That is a general description of the licence text, not legal advice for your situation; if you redistribute the plugin or bundle it into a product, read `LICENSE.txt` and `ThirdPartyLicenses.md` yourself.

Upgrade cost is low in the normal case and uneven in the EAP case. Stable builds arrive through the IDE's plugin manager, and the changelog is `CHANGES.md`. EAP builds are opt-in through a separate plugin repository URL and, per the README, can be well below beta quality. The practical rule is to keep EAP off on machines where a broken editor costs you a day.

The real upgrade risk is configuration drift, not the plugin binary. Because `~/.ideavimrc` maps to JetBrains action IDs, an IDE release that renames or removes an action can leave a mapping silently dead. There is no validation pass documented in the README for action IDs, so the way you find out is that the key stops working. Keeping the action mappings in a small, commented block in `~/.ideavimrc` makes that failure easy to spot.

Editorial conclusion

Adopt IdeaVim if you already know Vim motions and want them inside IntelliJ IDEA, PyCharm, GoLand or another JetBrains IDE without giving up refactoring and debugger actions; the <Action> mapping is the feature that makes the combination better than either tool alone. Do not adopt it if you need a real terminal Vim, if your plugin set depends on Vim features outside the supported list, or if you are unwilling to resolve keymap conflicts. Before committing, check three things: that your IDE appears in the compatibility list, that the Vim features you rely on appear in the supported summary, and that `~/.ideavimrc` is the file your JVM user.home actually points at.

Frequently asked questions

What is IdeaVim and what does it do?

IdeaVim is a Vim engine for JetBrains IDEs, distributed as a plugin. It provides Vim modes, motions, key mappings, marks, macros, registers, some set commands and full Vim regexps for search inside IntelliJ IDEA, PyCharm, GoLand and other JetBrains products.

How do I use IdeaVim in IntelliJ?

Install it from Settings | Plugins, then use Tools | Vim in the menu to enable or disable Vim mode. Your initialization commands go in ~/.ideavimrc, and shortcut conflicts are resolved under Editor | Vim and Keymap in settings.

How do I use EasyMotion with IdeaVim?

EasyMotion is one of the IdeaVim plugins enabled by name in ~/.ideavimrc with set easymotion. The README's example then maps it with map <leader>f <Plug>(easymotion-s) and map <leader>e <Plug>(easymotion-f).

How is IdeaVim different from Vim or Neovim?

IdeaVim runs inside a JetBrains IDE rather than a terminal, so Vim script support is partial and Vim plugins are replaced by IdeaVim plugins. In exchange, IDE actions such as RenameElement can be mapped with the <Action> keyword, which terminal Vim does not offer.

Is IdeaVim worth using?

That depends on whether you already know Vim motions and want to keep IDE actions such as refactoring and debugging. The README lists the supported features, and the EAP builds it offers may be below beta quality, so the stable plugin is the reasonable default.

Official sources

  1. Issues
  2. JetBrains/ideavim on GitHub
  3. License: MIT
  4. Project website
  5. README
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/jetbrains-ideavim.svg)](https://hysenlabs.com/projects/jetbrains-ideavim)