Top Related Projects
The official Vim repository
Vim-fork focused on extensibility and usability
A modular configuration of Vim and Neovim
🌙 LunarVim is an IDE layer for Neovim. Completely free and community driven.
Blazing fast Neovim framework providing solid defaults and a beautiful UI, enhancing your neovim experience.
Quick Overview
IdeaVim is a plugin for JetBrains IDEs that emulates Vim key bindings and functionality. It brings the power and efficiency of Vim to the feature-rich environment of JetBrains IDEs, allowing developers to use familiar Vim commands and motions while benefiting from the IDE's advanced features.
Pros
- Seamless integration of Vim keybindings with JetBrains IDEs
- Customizable configuration through
.ideavimrc
file - Support for many Vim plugins and extensions
- Regular updates and active community support
Cons
- Not a complete Vim emulation; some advanced Vim features may be missing
- Occasional conflicts with IDE-specific shortcuts
- Performance impact on older or less powerful machines
- Learning curve for users new to Vim or transitioning from pure Vim
Getting Started
- Install the IdeaVim plugin from the JetBrains Marketplace in your IDE.
- Create a
.ideavimrc
file in your home directory to customize IdeaVim settings. - Add the following basic configuration to your
.ideavimrc
:
" Enable Vim emulation
set ideajoin
set idearefactormode=keep
" Set up some common Vim settings
set incsearch
set hlsearch
set ignorecase
set smartcase
" Map IDE actions to IdeaVim
nnoremap <Space>f :action GotoFile<CR>
nnoremap <Space>g :action FindInPath<CR>
nnoremap <Space>b :action Switcher<CR>
" Enable IdeaVim-EasyMotion plugin
set easymotion
-
Restart your IDE or reload the
.ideavimrc
file using the:source ~/.ideavimrc
command in the IDE. -
Start using Vim keybindings in your JetBrains IDE!
Competitor Comparisons
The official Vim repository
Pros of vim
- Full-featured Vim implementation with extensive plugin ecosystem
- Runs on virtually any platform, from embedded systems to mainframes
- Highly customizable with Vimscript and native support for various programming languages
Cons of vim
- Steeper learning curve for newcomers to modal editing
- Requires terminal or separate GUI application, not integrated into IDEs
- Configuration and plugin management can be complex for beginners
Code comparison
vim:
:set number
:syntax on
:set expandtab
:set tabstop=4
:set shiftwidth=4
IdeaVim:
set number
set syntax
set expandtab
set tabstop=4
set shiftwidth=4
Key differences
- vim is a standalone text editor, while IdeaVim is a Vim emulation plugin for JetBrains IDEs
- IdeaVim provides Vim keybindings and basic functionality within the IDE environment
- vim offers more extensive customization options and a wider range of features
- IdeaVim integrates seamlessly with IDE features like code completion and refactoring tools
Use cases
- Choose vim for a full-featured, standalone text editor with maximum flexibility
- Opt for IdeaVim when working in JetBrains IDEs and wanting Vim-like editing capabilities
- vim is ideal for users who prioritize customization and work across various environments
- IdeaVim suits developers who want Vim keybindings while leveraging IDE-specific features
Vim-fork focused on extensibility and usability
Pros of Neovim
- Full-featured, standalone text editor with extensive plugin ecosystem
- Highly customizable and extensible through Lua scripting
- Better performance and lower resource usage
Cons of Neovim
- Steeper learning curve for new users
- Requires more setup and configuration to achieve IDE-like functionality
Code Comparison
IdeaVim:
public class IdeaVimExtension implements VimExtension {
@Override
public void initComponent() {
// IdeaVim-specific initialization
}
}
Neovim:
local M = {}
function M.setup()
-- Neovim-specific setup
end
return M
Key Differences
- IdeaVim is a plugin for JetBrains IDEs, while Neovim is a standalone editor
- IdeaVim focuses on Vim emulation within IDEs, Neovim aims to be a full Vim replacement
- IdeaVim uses Java for extensions, Neovim primarily uses Lua for configuration and plugins
Use Cases
- IdeaVim: Ideal for developers who want Vim keybindings in JetBrains IDEs
- Neovim: Suitable for users seeking a lightweight, customizable text editor with Vim-like functionality
Community and Support
- IdeaVim: Smaller community, focused on JetBrains IDE users
- Neovim: Larger, more diverse community with active development and plugin ecosystem
A modular configuration of Vim and Neovim
Pros of SpaceVim
- Highly customizable with a wide range of built-in plugins and layers
- Supports multiple programming languages and frameworks out of the box
- Provides a consistent experience across different editors (Vim, Neovim, etc.)
Cons of SpaceVim
- Steeper learning curve due to its extensive features and configurations
- May feel overwhelming for users who prefer a simpler Vim setup
- Potential performance impact due to the large number of included plugins
Code Comparison
SpaceVim configuration example:
let g:spacevim_enable_debug = 1
let g:spacevim_realtime_leader_guide = 1
call SpaceVim#layers#load('incsearch')
call SpaceVim#layers#load('lang#go')
call SpaceVim#layers#load('lang#markdown')
IdeaVim configuration example:
set surround
set multiple-cursors
set commentary
set easymotion
set NERDTree
SpaceVim offers a more comprehensive configuration with layer-based setup, while IdeaVim focuses on enabling specific plugins commonly used in JetBrains IDEs. SpaceVim's approach allows for more granular control over features and language support, whereas IdeaVim provides a streamlined experience tailored for JetBrains environments.
🌙 LunarVim is an IDE layer for Neovim. Completely free and community driven.
Pros of LunarVim
- Fully customizable Neovim configuration with sensible defaults
- Extensive plugin ecosystem and built-in LSP support
- Active community and frequent updates
Cons of LunarVim
- Steeper learning curve for users new to Vim/Neovim
- Requires more setup and configuration compared to IdeaVim
Code Comparison
LunarVim configuration example:
lvim.colorscheme = "lunar"
lvim.format_on_save = true
lvim.leader = "space"
IdeaVim configuration example:
set surround
set multiple-cursors
set commentary
LunarVim offers more extensive configuration options and plugin support, while IdeaVim provides a simpler setup within JetBrains IDEs. LunarVim is a standalone Neovim distribution, whereas IdeaVim is a plugin for JetBrains IDEs that emulates Vim keybindings and functionality.
LunarVim is better suited for users who want a fully customizable Vim-like experience with advanced features, while IdeaVim is ideal for those who want Vim keybindings within the familiar JetBrains IDE environment.
Blazing fast Neovim framework providing solid defaults and a beautiful UI, enhancing your neovim experience.
Pros of NvChad
- Highly customizable and extensible Neovim configuration
- Faster startup time and better performance
- Active community and frequent updates
Cons of NvChad
- Steeper learning curve for users new to Neovim
- Limited IDE-like features compared to IdeaVim
Code Comparison
NvChad configuration example:
local custom_init = function()
vim.opt.relativenumber = true
vim.opt.wrap = false
end
local plugins = {
{ "folke/which-key.nvim", enabled = true },
}
IdeaVim configuration example:
set relativenumber
set nowrap
set ideajoin
set surround
set commentary
NvChad offers a more modern, Lua-based configuration approach, while IdeaVim uses traditional Vimscript and focuses on integrating Vim keybindings into JetBrains IDEs. NvChad provides a full Neovim setup with extensive customization options, whereas IdeaVim aims to bring Vim-like editing to JetBrains environments while leveraging existing IDE features.
Convert
designs to code with AI
Introducing Visual Copilot: A new AI model to turn Figma designs to high quality code using your components.
Try Visual CopilotREADME
IdeaVim
IdeaVim is a Vim engine for JetBrains IDEs.
Contact maintainers:
- Bug tracker
- @IdeaVim on Twitter
- Chat on gitter
- IdeaVim Channel on JetBrains Server
Resources:
Compatibility
IntelliJ IDEA, PyCharm, CLion, PhpStorm, WebStorm, RubyMine, AppCode, DataGrip, GoLand, Rider, Cursive, Android Studio and other IntelliJ platform based IDEs.
Setup
-
IdeaVim can be installed via
Settings | Plugins
. See the detailed instructions. -
Use
Tools | Vim
in the menu to enable or disable vim. -
Use the
~/.ideavimrc
file as an analog of~/.vimrc
(learn more). The XDG standard is supported, as well. -
Shortcut conflicts can be resolved by using:
- On Linux & Windows:
File | Settings | Editor | Vim
&File | Settings | Keymap
, - On macOS:
Preferences | Editor | Vim
&Preferences | Keymap
, - Regular Vim mappings in the
~/.ideavimrc
file.
- On Linux & Windows:
Get Early Access
Would you like to try new features and fixes? Join the Early Access Program and receive EAP builds as updates!
- Click the IdeaVim icon
in the status bar |
Early Access Program
|Subscribe to EAP
Or subscribe to EAP updates manually:
- Open
Settings | Plugins
- Click the gear icon :gear:, select
Manage Plugin Repositories
, and add the following url:
https://plugins.jetbrains.com/plugins/eap/ideavim
See the changelog for the list of unreleased features.
It is important to distinguish EAP builds from traditional pre-release software. Please note that the quality of EAP versions may at times be way below even usual beta standards.
You can always leave your feedback with:
- @IdeaVim in Twitter
- Bug tracker
Summary of Supported Vim Features
Here are some examples of supported vim features and commands:
- Normal / insert / visual / select / etc. modes
- Motion / deletion / change / window / etc. commands
- Key mappings
- Marks / Macros / Digraphs / Registers
- Some set commands
- Full Vim regexps for search and search/replace
- Vim web help
~/.ideavimrc
configuration file
- vim-easymotion
- NERDTree
- vim-surround
- vim-multiple-cursors
- vim-commentary
- argtextobj.vim
- vim-textobj-entire
- ReplaceWithRegister
- vim-exchange
- vim-highlightedyank
- vim-paragraph-motion
- vim-indent-object
- match.it
etc
See also:
Files
~/.ideavimrc
- Your IdeaVim-specific Vim initialization commands
Example (click to see)
""" Map leader to space ---------------------
let mapleader=" "
""" Plugins --------------------------------
set surround
set multiple-cursors
set commentary
set argtextobj
set easymotion
set textobj-entire
set ReplaceWithRegister
""" Plugin settings -------------------------
let g:argtextobj_pairs="[:],(:),<:>"
""" Common settings -------------------------
set showmode
set so=5
set incsearch
set nu
""" Idea specific settings ------------------
set ideajoin
set ideastatusicon=gray
set idearefactormode=keep
""" Mappings --------------------------------
map <leader>f <Plug>(easymotion-s)
map <leader>e <Plug>(easymotion-f)
map <leader>d <Action>(Debug)
map <leader>r <Action>(RenameElement)
map <leader>c <Action>(Stop)
map <leader>z <Action>(ToggleDistractionFreeMode)
map <leader>s <Action>(SelectInProjectView)
map <leader>a <Action>(Annotate)
map <leader>h <Action>(Vcs.ShowTabbedFileHistory)
map <S-Space> <Action>(GotoNextError)
map <leader>b <Action>(ToggleLineBreakpoint)
map <leader>o <Action>(FileStructurePopup)
Suggested options (click to see)
Here is also a list of the suggested options from defaults.vim
" Show a few lines of context around the cursor. Note that this makes the
" text scroll if you mouse-click near the start or end of the window.
set scrolloff=5
" Do incremental searching.
set incsearch
" Don't use Ex mode, use Q for formatting.
map Q gq
You can read your ~/.vimrc
file from ~/.ideavimrc
with this command:
source ~/.vimrc
Also note that if you have overridden the user.home
JVM option, this
will affect where IdeaVim looks for your .ideavimrc
file. For example, if you
have -Duser.home=/my/alternate/home
then IdeaVim will source
/my/alternate/home/.ideavimrc
instead of ~/.ideavimrc
.
Alternatively, you can set up initialization commands using XDG standard.
Put your settings to $XDG_CONFIG_HOME/ideavim/ideavimrc
file.
IdeaVim Plugins
Executing IDE Actions
IdeaVim adds various commands for listing and executing arbitrary IDE actions as
Ex commands or via :map
command mappings:
Executing actions:
<Action>({action_id})
- For the mappings you can use a special
<Action>
keyword. Don't forget the parentheses. - E.g.
map gh <Action>(ShowErrorDescription)
<- execute hover ongh
. - :warning: Mappings to
<Action>
don't work withnoremap
. If you know the case when it's needed, please let us know.
- For the mappings you can use a special
:action {action_id}
- Execute an action by
{action_id}
. Works from Ex command line. - Please don't use
:action
in mappings. Use<Action>
instead.
- Execute an action by
Finding action IDs:
-
IJ provides
IdeaVim: track action IDs
command to show the id of the executed actions. This command can be found in "Search everywhere" (doubleshift
)."Track action IDs" Details (click to see)
-
:actionlist [pattern]
- Find IDE actions by id or keymap pattern (E.g.
:actionlist extract
,:actionlist <C-D
)
- Find IDE actions by id or keymap pattern (E.g.
Examples:
" Map \r to the Reformat Code action
:map \r <Action>(ReformatCode)
" Map <leader>d to start debug
:map <leader>d <Action>(Debug)
" Map \b to toggle the breakpoint on the current line
:map \b <Action>(ToggleLineBreakpoint)
Some popular actions:
ShowHoverInfo - Quick Documentation and Error Description
QuickImplementations - Quick Definition
Vim Script
IdeaVim can execute custom scripts that are written with Vim Script. At the moment we support all language features, but not all of the built-in functions and options are supported.
Additionally, you may be interested in the Vim Script Discussion or Vim Script Roadmap.
IDE specific options
You can evaluate the has('ide')
function call and get 1
if it was called with IdeaVim or 0
if the function was called from Vim/NeoVim.
The option &ide
contains the name and edition of your IDE, for example, "IntelliJ IDEA Ultimate Edition".
To see its value for the current IDE you are using, execute the :echo &ide
command.
To write an IDE-specific configuration, use Vim's regexp match operators =~?
(case-insensitive) / =~#
(case-sensitive)
Example config:
" options and mappings that are supported by both Vim and IdeaVim
set nu
set relativenumber
if has('ide')
" mappings and options that exist only in IdeaVim
map <leader>f <Action>(GotoFile)
map <leader>g <Action>(FindInPath)
map <leader>b <Action>(Switcher)
if &ide =~? 'intellij idea'
if &ide =~? 'community'
" some mappings and options for IntelliJ IDEA Community Edition
elseif &ide =~? 'ultimate'
" some mappings and options for IntelliJ IDEA Ultimate Edition
endif
elseif &ide =~? 'pycharm'
" PyCharm specific mappings and options
endif
else
" some mappings for Vim/Neovim
nnoremap <leader>f <cmd>Telescope find_files<cr>
endif
:gem: Contributing
The power of contributing drives IdeaVim :muscle:. Even small contributions matter!
See CONTRIBUTING.md to start bringing your value to the project.
Authors
See AUTHORS.md for a list of authors and contributors.
IdeaVim tips and tricks
-
Use the power of IJ and Vim:
set ideajoin
to enable join via the IDE. See the examples.- Make sure
ideaput
is enabled forclipboard
to enable native IJ insertion in Vim. - Sync IJ bookmarks and IdeaVim global marks:
set ideamarks
(works for marks with capital letters only) - Check out more ex commands.
-
Use your vim settings with IdeaVim. Put
source ~/.vimrc
in~/.ideavimrc
. -
Control the status bar icon via the
ideastatusicon
option. -
Not familiar with the default behaviour during a refactoring? See the
idearefactormode
option.
Some facts about Vim
Letâs relax and have some fun now! Here are a few things we've found interesting during development and would like to share with you.
-
There are no such commands as
dd
,yy
, orcc
. For example,dd
is not a separate command for deleting the line, but ad
command with ad
motion.
Wait, but there isn't ad
motion in Vim! Thatâs right, and thatâs why Vim has a dedicated set of commands for which it checks whether the command equals to motion and if so, it executes_
motion instead.
_
is an interesting motion that isn't even documented in vi, and it refers to the current line. So, commands likedd
,yy
, and similar ones are simply translated tod_
,y_
, etc. Here is the source of this knowledge. -
x
,D
, and&
are not separate commands either. They are synonyms ofdl
,d$
, and:s\r
, respectively. Here is the full list of synonyms. -
You can read a post about how modes work in Vim and IdeaVim.
-
Have you ever used
U
afterdd
? Don't even try. -
A lot of variables that refer to visual mode start with two uppercase letters, e.g.
VIsual_active
. Some examples. As mentioned here, this was done this way to avoid the clash with X11. -
Other strange things from vi:
- ":3" jumps to line 3
- ":3|..." prints line 3
- ":|" prints current line
-
Vim script doesn't skip white space before comma.
F(a ,b)
=> E475. -
Fancy constants for undolevels:
The local value is set to -123456 when the global value is to be used.
-
Vi (not Vim) is a POSIX standard, and has a spec! Vim is mostly POSIX compliant when Vi compatibility is selected with the
'compatible'
option, but there are still some differences that can be changed with'copoptions'
. The spec is interesting because it documents the behaviour of different commands in a stricter style than the user documentation, describing the current line and column after the command, for example. More details can be found by reading:help posix
.
License
IdeaVim is licensed under the MIT license.
Third-party components and licenses are listed in ThirdPartyLicenses.md.
All releases before 2.0.0 were licensed under terms of GPL-2.0 or later. The last commit before switch to MIT is 05852b07c6090ad40fde7d3cafe0b074604f7ac5. You can read more about the license change here: https://github.com/JetBrains/ideavim/discussions/543
Top Related Projects
The official Vim repository
Vim-fork focused on extensibility and usability
A modular configuration of Vim and Neovim
🌙 LunarVim is an IDE layer for Neovim. Completely free and community driven.
Blazing fast Neovim framework providing solid defaults and a beautiful UI, enhancing your neovim experience.
Convert
designs to code with AI
Introducing Visual Copilot: A new AI model to turn Figma designs to high quality code using your components.
Try Visual Copilot