一、什么是 IdeaVim?
IdeaVim 是 JetBrains 系列 IDE(如 IntelliJ IDEA, WebStorm, PyCharm 等)中的一个插件,让你在 IDE 里使用 Vim 的按键习惯,大大提升效率。
安装方法:
 在 IDE 中打开 设置(Settings) → 插件(Plugins) → 搜索 IdeaVim → 安装并重启。
Vim 的各种模式
Vim 主要有以下几种模式,每种模式有不同的快捷键:
| 模式名称 | 进入方式 | 作用 | 
|---|---|---|
| 普通模式(Normal) | Esc | 执行命令、移动光标 | 
| 插入模式(Insert) | i、a、o | 输入文本 | 
| 可视模式(Visual) | v、V、Ctrl+v | 选中文本 | 
| 命令模式(Command-line) | : | 执行 Vim 命令 | 
| 替换模式(Replace) | R | 逐字符替换文本 | 
| 选择模式(Select) | gh | 类似可视模式,但可以直接输入替换文本 | 
| Ex 模式(Ex mode) | Q | 进入 Vim 的 Ex 界面(类似命令模式,但适用于批量处理) | 
二、基础配置(.ideavimrc)
IdeaVim 支持使用 .ideavimrc 文件(类似于 Vim 的 .vimrc),配置自己喜欢的快捷键、模式、增强功能。
一般放在用户根目录下,比如:
-  
Windows:
C:\Users\你的用户名\.ideavimrc -  
Linux/macOS:
~/.ideavimrc 
推荐基础配置:
"" .ideavimrc - Matt Chapman"" 基础设置
"" ========================================================set scrolloff=10         " 保持光标上下方各 10 行的间距,避免视野紧张
set linenumber           " 显示行号
set showmode             " 显示当前 Vim 模式(Normal/Insert 等)
set showcmd              " 显示正在输入的命令set smartcase            " 搜索时智能大小写(有大写时区分大小写)
set incsearch            " 搜索时实时跳转到匹配项
set hlsearch             " 搜索后高亮所有匹配项set visualbell           " 出错时使用视觉提示,而非响铃" 使用系统剪贴板
set clipboard+=unnamed   " 与系统剪贴板共享内容(如复制粘贴)" 设置 leader 键为空格
let mapleader = " """ 插件相关设置
"" ========================================================set surround             " 启用 surround 插件(包围操作)
set highlightedyank      " 启用高亮 yank(复制)内容
set sneak                " 启用 Sneak 快速跳转插件
set nerdtree             " 启用 NERDTree 文件树插件" Easymotion 插件设置
set easymotion           " 启用 easymotion 插件(增强跳转)
set notimeout            " 禁用按键超时(提高组合键连按响应)" Which-key 插件设置
set which-key                          " 启用 which-key 插件
let g:WhichKey_FontSize = 16           " 菜单字体大小
let g:WhichKey_CommandColor = "#41ead4"     " 命令颜色
let g:WhichKey_PrefixColor = "#f335b2"      " 前缀颜色
let g:WhichKey_SortOrder = "by_key_prefix_first" " 按前缀排序" Which-key 描述设置
let g:WhichKeyDesc_leader = "<leader> Leader 键菜单"let g:WhichKeyDesc_leader = "<leader>x 打开文件管理器"let g:WhichKeyDesc_easymotion = "<leader>j 使用 Easymotion 跳转"
let g:WhichKeyDesc_easymotion_prefix = "<leader><leader>"let g:WhichKeyDesc_comment = "<leader>c 注释行"let g:WhichKeyDesc_fold = "<leader>z 折叠"
let g:WhichKeyDesc_fold_all = "<leader>zc 折叠所有区域"
let g:WhichKeyDesc_unfold_all = "<leader>zo 展开所有区域"let g:WhichKeyDesc_window = "<leader>w 窗口操作"
let g:WhichKeyDesc_window_split_vertically = "<leader>wv 垂直分屏"
let g:WhichKeyDesc_window_split_horizontally = "<leader>wh 水平分屏"
let g:WhichKeyDesc_window_split_unsplit = "<leader>wu 取消分屏"
let g:WhichKeyDesc_window_split_move_editor = "<leader>wm 移动编辑器到另一个分组"let g:WhichKeyDesc_display = "<leader>d 显示选项"
let g:WhichKeyDesc_zen_mode = "<leader>dz Zen 模式"
let g:WhichKeyDesc_df_mode = "<leader>dd 专注模式"
let g:WhichKeyDesc_fullscreen = "<leader>df 全屏模式"let g:WhichKeyDesc_action= "<leader>a 动作"
let g:WhichKeyDesc_action_context_menu = "<leader>am 打开上下文菜单"
let g:WhichKeyDesc_action_search = "<leader>as 打开命令面板"let g:WhichKeyDesc_file_quickLook = "<leader><leader> 最近文件"let g:WhichKeyDesc_file_nav = "<leader>f 文件导航"
let g:WhichKeyDesc_file_nav_goto_file = "<leader>ff 跳转到文件"
let g:WhichKeyDesc_file_nav_goto_content = "<leader>fc 查找文件内容"
let g:WhichKeyDesc_file_nav_show_recent_files = "<leader>fr 最近使用文件"
let g:WhichKeyDesc_file_nav_show_recent_locations = "<leader>fl 最近位置"let g:WhichKeyDesc_close_tab = "<leader>q 关闭当前标签页"let g:WhichKeyDesc_refactoring = "<leader>r 重构菜单"
let g:WhichKeyDesc_refactoring_rename = "<leader>rn 重命名元素"
let g:WhichKeyDesc_refactoring_method = "<leader>rm 提取方法"
let g:WhichKeyDesc_refactoring_variable = "<leader>rv 引入变量"
let g:WhichKeyDesc_refactoring_field = "<leader>rf 引入字段"
let g:WhichKeyDesc_refactoring_signature = "<leader>rs 更改函数签名"
let g:WhichKeyDesc_refactoring_all = "<leader>rr 打开重构列表"let g:WhichKeyDesc_goto = "<leader>g 跳转"
let g:WhichKeyDesc_goto_declaration = "<leader>gd 跳转到定义"
let g:WhichKeyDesc_goto_type_declaration = "<leader>gy 跳转到类型定义"
let g:WhichKeyDesc_goto_implementation = "<leader>gi 跳转到实现"
let g:WhichKeyDesc_goto_usages = "<leader>gu 查看用法"
let g:WhichKeyDesc_goto_test = "<leader>gt 跳转到测试"
let g:WhichKeyDesc_goto_back = "<leader>gb 返回上一步"
let g:WhichKeyDesc_goto_forward = "<leader>gf 前进一步"let g:WhichKeyDesc_git = "<leader>g Git 操作"
let g:WhichKeyDesc_git_commit = "<leader>gc 提交代码"
let g:WhichKeyDesc_git_status = "<leader>gs 查看 Git 状态"
let g:WhichKeyDesc_git_branches = "<leader>gb 查看分支列表"let g:WhichKeyDesc_errors = "<leader>e 错误导航"
let g:WhichKeyDesc_errors_next = "<leader>en 跳转到下一个错误"
let g:WhichKeyDesc_errors_prev = "<leader>ep 跳转到上一个错误""" 快捷键映射
"" ========================================================inoremap jk <Esc>                            " 插入模式按 jk 退出" 标签页切换
nnoremap <A-n> :tabnext<CR>                  " Alt+n 切换到下一个标签
nnoremap <A-p> :tabprev<CR>                  " Alt+p 切换到上一个标签" 窗口方向跳转
nnoremap <A-h> <C-w>h                        " Alt+h 跳转到左侧分屏
nnoremap <A-l> <C-w>l                        " Alt+l 跳转到右侧分屏
nnoremap <A-k> <C-w>k                        " Alt+k 跳转到上方分屏
nnoremap <A-j> <C-w>j                        " Alt+j 跳转到下方分屏" 方法间跳转(需 IDE 支持)
nnoremap [[ <Action>(MethodUp)              " 跳转到上一个方法
nnoremap ]] <Action>(MethodDown)            " 跳转到下一个方法" 可视模式缩进优化
vnoremap < <gv                              " 保持选择状态的左缩进
vnoremap > >gv                              " 保持选择状态的右缩进" 执行寄存器 q 中的宏
nnoremap qj @q" 弹窗菜单导航(补全提示)
inoremap <C-j> <Action>(PopupMenu-selectNext)   " 下一个补全项
inoremap <C-k> <Action>(PopupMenu-selectPrev)   " 上一个补全项"" Leader 快捷键命令
"" ========================================================" 注释行
map <leader>c <action>(CommentByLineComment)" Easymotion 快速跳转
map <leader>j <Plug>(easymotion-s)" 打开 NERDTree 文件浏览器(q 退出)
map <leader>x :NERDTreeToggle<CR>" 折叠操作
map <leader>zc :action CollapseAllRegions<CR>
map <leader>zo :action ExpandAllRegions<CR>" 窗口分屏操作
map <leader>wv <Action>(SplitVertically)
map <leader>ws <Action>(SplitHorizontally)
map <leader>wu <Action>(Unsplit)
map <leader>wm <Action>(MoveEditorToOppositeTabGroup)" 显示模式切换
map <leader>dd <action>(ToggleDistractionFreeMode)
map <leader>dz <action>(ToggleZenMode)
map <leader>df <action>(ToggleFullScreen)" 动作菜单
map <leader>am <action>(ShowIntentionActions)
map <leader>as <action>(SearchEverywhere)" 文件导航
map <leader>ff <action>(GotoFile)
map <leader>fr <action>(RecentFiles)
map <leader>fc <action>(FindInPath)
map <leader><leader> <Action>(RecentFiles)
map <leader>fl <action>(RecentLocations)
map <leader>fs <action>(NewScratchFile)" 关闭当前标签
map <leader>q <action>(CloseContent)" 重构操作
map <leader>rn <Action>(RenameElement)
map <leader>rm <Action>(ExtractMethod)
map <leader>rv <Action>(IntroduceVariable)
map <leader>rf <Action>(IntroduceField)
map <leader>rs <Action>(ChangeSignature)
map <leader>rr <Action>(Refactorings.QuickListPopupAction)" 跳转功能
nmap <leader>gd <Action>(GotoDeclaration)
nmap <leader>gy <Action>(GotoTypeDeclaration)
nmap <leader>gi <Action>(GotoImplementation)
nmap <leader>gu <Action>(ShowUsages)
nmap <leader>gt <Action>(GotoTest)
nmap <leader>gf <Action>(Back)
nmap <leader>gb <Action>(Forward)" Git 操作
map <leader>gc <Action>(CheckinProject)
map <leader>gs <Action>(ActivateVersionControlToolWindow)
map <leader>gb <Action>(Git.Branches)" 错误导航
map <leader>en <Action>(ReSharperGotoNextErrorInSolution)
map <leader>ep <Action>(ReSharperGotoPrevErrorInSolution)
 
三、常用操作
| 操作 | 快捷键 | 
|---|---|
| 保存 | :w 或 <Ctrl-s> | 
| 退出 | :q | 
| 保存并退出 | :wq | 
| 撤销 | u | 
| 重做 | <Ctrl + r> | 
| 快速移动 | h 左 j 下 k 上 l 右 | 
| 搜索 | /关键词 | 
| 搜索下一个 | n | 
| 搜索上一个 | N | 
| 复制(可视模式) | y | 
| 粘贴 | p | 
| 剪切(可视模式) | d | 
| 可视选择 | v | 
| 块选择(列模式) | Ctrl+v | 
四、常见问题
1. 复制成功但粘贴失败?
Vim(包括 IdeaVim)复制内容,是放在Vim自己的寄存器里的,
 如果没有设置系统剪贴板共享,是不能用 Ctrl+V 粘贴到外面的!
解决: 打开你的 ~/.ideavimrc 文件,加上这一行:
set clipboard=unnamedplus
 
然后保存,重启 IntelliJ IDEA。
这样以后用 y 复制,就直接同步到系统剪贴板啦~可以 Ctrl+V 粘到微信、浏览器、VS Code 等外部程序。
2. 插件指令不完整?
-  
问题:IdeaVim 并没有完整复刻 Vim 的所有命令和功能。
 -  
解决:查看 IdeaVim 官方文档 或使用
:help查看支持的命令列表。 
五、实用技巧
-  
基本模式切换
-  
Esc:返回普通模式。 -  
i:进入插入模式。 -  
v:进入可视模式(字符选择)。 -  
V:进入行选择模式。 -  
Ctrl + W:在普通模式下用来快速移动光标到下一个单词、删除单词等。 
 -  
 -  
跳转与搜索
-  
gg:跳转到文件开头。 -  
G:跳转到文件末尾。 -  
/:搜索文本,按n查找下一个,按N查找上一个。 -  
Ctrl + F:在文件内进行查找(相当于 Vim 的/,但在普通模式下)。 -  
Ctrl + R:使用历史搜索。 
 -  
 -  
多光标编辑
-  
Ctrl + D:选中下一个相同的词。 -  
Ctrl + N:跳到下一个匹配的光标位置。 
 -  
 -  
命令模式
-  
:w:保存文件。 -  
:q:退出文件。 -  
:wq:保存并退出。 
 -  
 -  
撤销与重做
-  
u:撤销操作。 -  
Ctrl + R:重做操作。 
 -  
 -  
修改光标移动方式
-  
Ctrl + f:滚动页面一个窗口。 -  
Ctrl + b:滚动页面一个窗口向上。 -  
Ctrl + d:向下滚动半个窗口。 -  
Ctrl + u:向上滚动半个窗口。 
 -  
 -  
窗口分割
-  
Ctrl + w再按s:水平分割窗口。 -  
Ctrl + w再按v:垂直分割窗口。 -  
Ctrl + w再按q:关闭当前窗口。 
 -  
 
六、插件推荐
已内置的功能
| 功能 | 对应设置 | 是否需额外安装插件 | 描述 | 
|---|---|---|---|
| Surround | set surround | 否 | 改变文本“包围符号”,如引号括号等(来自 vim-surround) | 
| Highlighted Yank | set highlightedyank | 否 | 复制(yank)时高亮被复制的区域 | 
| NerdTree | set nerdtree | 否 | 使用类似 Vim 的方式控制项目结构视图(注意:实际上在 IDEA 中不是使用真正的 NerdTree,而是通过模拟行为达成类似效果) | 
| Which-Key | set which-key | 否 | 类似 Emacs/Vim 中的 which-key,提示后续可用快捷键和含义 | 
需要额外安装插件的功能:
| 功能 | 需安装插件 | 描述 | 
|---|---|---|
| Sneak | IdeaVim Sneak | 在多行中快速跳转,输入两个字符定位,替代 f/F/t/T 方式搜索。 | 
| EasyMotion | IdeaVim-EasyMotion 和 AceJump | 高效跳转定位,输入字符后高亮出现所有匹配,并用快捷键快速跳转。AceJump 是依赖库。 |