IDEA VIM 配置 - 插件篇

IDEA Vimrc 配置 插件篇

前言

vim 最吸引我的能力是模态化操作,这种模态化操作起初可能会有一些不适应,但是在熟悉使用之后,确实又有点离不开模态编辑的形式。所以在有 vim 插件的地方,我会优先使用

最开始入坑 vim 的原因很简单,就是买了键盘但是没有买触控板,右手笔记本触控板跟键盘间移动确实是很累人,就想学习学习 vim ,让右手轻松一点而已。但是写 Java ,对于 IDE 的需求其实也是相对依赖的,而且 IDEA 的一些功能,确实也不是 lsp 能替代的。

本文的目标用户是有一定 VIM 的使用经历,期望在 IDEA 中使用 vim ,对 IDEA 的配置以及 Plugin 的功能想要多一些了解。

notice

vim 的配置内容,相对私人化一些,介绍的重点主要是在一些扩展插件以及他的功能使用上。 下文中配置项的内容,更多的是在向 lazyvim 的方向靠,减少在两套操作逻辑之间进行转换。

插件的安装

在 IDEA 中,选择 Settings -> Plugin 搜索 IdeaVim 选择安装,安装完成后,重启 IDEA 即可

右下角状态栏中会出现一个 v 标识 -> Enable 即可使用。

配置

IDEAVim 的配置项在 ~/.ideavimrc 中, 点击 v 标识 -> Open ~/.ideavimrc idea 会自动打开这个文件

插件介绍与配置

IDEAVIM_EXTENSION

这个插件放在第一个,他的功能只有一个,就是在退出插入模式时可以切换回系统的英文输入法,但是在中文编程环境下,确实非常非常有用,可以极大的提升在ideavim 的使用体验

配置方式

  1. 安装 ideavimextension 插件
  2. 编辑 ~/.ideavimrc
1
set keep-english-in-normal-and-restore-in-insert

vim-flash

插件功能与使用

插件功能 flash.nvim 在 IDEA 的替代品,主要作用是在 normal 模式下快速跳转

我们可以把 s 理解成 seek ,他的操作 motion 是 s character[*] character[] ,按 s 进入seek 模式,然后数据我们想要查找的单词,然后这个插件会为指示出匹配的文字字段,最后,我们选择我们想要跳转的位置,点击对应按键,我们就能快速的跳转到目标位置

通常情况下,我们应该不用输入完整的单词,通常利用 2-3 个字母,应该就能实现我们的跳转,这个插件我用来替代 easymotion

不过这个插件并不是很完善,也没有提供丰富的功能,例如 f/F/t/T 的支持,所以可以根据自己的习惯选择

配置方式

  1. 安装 vim-flash 插件
  2. 编辑 ~/.ideavimrc
" vim flash start
" https://github.com/yelog/vim-flash
nmap s <Action>(flash.search)
xmap s <Action>(flash.search)
" vim flash end

argtextobj

插件功能与使用

textobj 增强工具,增加了 arg 类型的 textobj

 - daa(delete-an-argument)  - cia(change-inner-argument)  - via(select-inner-argument)

配置方式

编辑 ~/.ideavimrc

加入一下内容

1
2
3
4
5
6
7
8
" argtextobj config start
" daa delete an arg
" cia change inner arg
" via select inner arg
" yia copy inner arg
Plug 'vim-scripts/argtextobj.vim'
" let g:argtextobj_pairs="[:],(:),<:>"
" argtextobj config end

默认情况下,这个插件只会识别 () 对内的内容,如果需要支持其他类型的括号,通过 leg g:argtextobj_pairs="[:],(:),<:>" 进行扩展,通常在 java 代码中 扩展 <:> 可以针对泛型 arg 进行一些操作,但是实际使用下来,意义不大,还需要在使用时考虑括号顺序问题。

commentary

插件功能与使用

快速注释与取消注释插件

  • gcc 快速注释一行
  • Visual 模式下通过 gc 注释所选择的内容
  • gc{motion}
warning

commentary 与后文的 functiontextobj 结合使用起来,效果不是很好,如果要快速注释一个方法,可以先用 zc ,然后 V 快速选择 , 最后使用 gc 注释

配置方式

  1. 配置 ~/.ideavimrc
1
2
3
4
5
6
7
8
9
" commentary config start
" gc{motion}              Comment or uncomment lines that {motion} moves over.
" gcc                     Comment or uncomment [count] lines.
" {Visual}gc              Comment or uncomment the highlighted lines.
" gc                      Text object for a comment (operator pending mode only.)
" gcgc                    Uncomment the current and adjacent commented lines.
" gcu
Plug 'tpope/vim-commentary'
" commentary config end

easymotion

插件功能与使用

与前文提到的 flash 插件类似,也是用来进行快速移动, ideavim 团队的官方插件,需要配合 ace 插件一起使用,如果习惯使用了 vim-esaymotion 的话,这个插件可能会跟适合

使用与 flash 类似,差异是 easymotion 的搜索是有方向性的,总共 87 个command ,ideavim-easymotion 覆盖了 80 个 command

配置方式

  1. 安装 IdeaVim-EasyMotion 和 AceJump 两个插件
  2. 配置 ~/.ideavimrc
1
Plug 'easymotion/vim-easymotion'

Exchange

插件功能与使用

用来快速交换 textobj , 可用的场景主要是面向跨多行 exchange ,如果是相邻元素的交换,可以不用这个插件 比如 如果是交换上下两行,你需要执行 cxx cxx 两次 ,使用原生的 ddp 也能快速交换两行,同理,交换两个相邻字符,xp 是非常好用的,但是,加入 两行之间有一行空行,这就不能使用 ddp来快速交换了

  • cx{motion}
  • cxx
  • cxc 取消 exchange

这个插件与后文的 function结合使用,效果不错,可以快速交换两个函数的位置

配置方式

  1. 编辑 ~/.ideavimrc
1
Plug 'tommcdo/vim-exchange'

FunctionTextObj

插件功能与使用

提供扩展了 function 的 textObj

  • af (around function)
  • if (inner function)

这个插件可能多多少少有一些问题,时令时不灵的,不是特别好用,特别是配合 c d 这种进入 insert 模式的,都多多少少有点问题,但是 vif vaf 的行为的确是符合预期的,这可能是能跟 exchage 配合使用的原因

配置方式

  1. 安装 vim-functiontextboj 插件
  2. 编辑 ~/.ideavimrc
set functiontextobj

highlightedyank

插件功能与使用

这个插件属于 ui 类型的插件,可以对复制的区域进行高亮

配置方式

  1. 编辑 ~/.ideavimrc
1
2
3
Plug 'machakann/vim-highlightedyank'
let g:highlightedyank_highlight_duration="1000"
let g:highlightedyank_highlight_color = "rgba(160, 160, 160, 155)"
  • highlightedyank_highlight_duration 控制高亮区域留存时长
  • highlightedyank_highlight_color 可以自定义配色

indent-object

插件功能与使用

扩展了 ident-textobj 类型,可以是 句子、段落等,如果用 idea 进行 md 写作,可能需要,否则这个插件用处不大

  • ai: (A)n (I)ndentation level and line above.
  • ii: (I)nner (I)ndentation level (no line above).
  • aI: (A)n (I)ndentation level and lines above/below.
  • iI: (I)nner (I)ndentation level (no lines above/below).

配置方式

  1. 编辑 ~/.ideavimrc
1
" Plug 'michaeljsmith/vim-indent-object'

matchit.vim

插件功能与使用

增强了 % 的功能, 支持在配对的符号间进行循环跳转,以及在 if / else if / else 直接进行快速跳转

warning

但是不支持在 switch 间进行跳转

配置方式

  1. 编辑 ~/.ideavimrc
1
packadd matchit

Mini.ai

插件功能与使用

增强扩展了 a,i 的使用场景

  • aq: Around any quotes. 可以用来 替代 a" a'
  • iq: Inside any quotes. 用来替代 i" i'
  • ab: Around any parentheses, curly braces, and square brackets. 替代 a( a[ a{
  • ib: Inside any parentheses, curly braces, and square brackets. 替代 i( i[ i{

但是在使用的时候可能需要注意当前的光标位置,尤其在方法中,有多种嵌套的情况下

配置方式

  1. 编辑 ~/.ideavimrc
1
set mini-ai

multiple-cursors

插件功能与使用

主要用于进行多行编辑,通常如果需要编辑连续多行,<Ctrl>-v 就够用了

配置方式

  1. 编辑 ~/.ideavimrc
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
Plug 'terryma/vim-multiple-cursors'
" Remap multiple-cursors shortcuts to match terryma/vim-multiple-cursors
nmap <C-n> <Plug>NextWholeOccurrence
xmap <C-n> <Plug>NextWholeOccurrence
nmap g<C-n> <Plug>NextOccurrence
xmap g<C-n> <Plug>NextOccurrence
xmap <C-x> <Plug>SkipOccurrence
xmap <C-p> <Plug>RemoveOccurrence

" Note that the default <A-n> and g<A-n> shortcuts don't work on Mac due to dead keys.
" <A-n> is used to enter accented text e.g. ñ
" Feel free to pick your own mappings that are not affected. I like to use <leader>
nmap <leader><C-n> <Plug>AllWholeOccurrences
xmap <leader><C-n> <Plug>AllWholeOccurrences
nmap <leader>g<C-n> <Plug>AllOccurrences
xmap <leader>g<C-n> <Plug>AllOccurrences

NERDTree

插件功能与使用

将 NERDTree 导航添加到项目面板。 NERDTree 是 vim 的一个文件管理器 ,可以跟 idea 的 project panel 进行一定程度的结合,在操作 文件管理的时候也能使用 vim 的方式进行操作

NERDTree support JetBrains/ideavim Wiki GitHub

配置方式

  1. 编辑 ~/.ideavimrc
1
2
Plug 'preservim/nerdtree'
map <leader>e   :NERDTree<CR>

使用 <leader> e 来激活 panel

paragraph-motion

插件功能与使用

这个插件扩展了 {} , 通常 { } 只匹配完全空的行。这个插件,仅包含空格的行也会匹配。

配置方式

  1. 编辑 ~/.ideavimrc
1
Plug 'dbakker/vim-paragraph-motion'

Peekaboo

插件功能与使用

可以显示寄存器弹出框

  • 在 normal 模式下 " 激活
  • 在 insert 模式下,<ctrl>r 激活

配置方式

  1. 安装 vim-peekaboo 插件
  2. 编辑 ~/.ideavimrc
1
set peekaboo

quick-scope

插件功能与使用

一个 UI 插件,会高亮光标当前行的唯一字母,然后可以利用 f/F 进行快速移动

配置方式

  1. 安装 IdeaVim-Quickscope 插件
  2. 编辑 `~/.ideavimrc
1
`set quickscope

ReplaceWithRegister

插件功能与使用

使用寄存器中的内容直接替换当前内容,把删除,粘贴两个动作合并成为了一个动作

配置方式

  1. 编辑 ~/.ideavimrc
1
Plug 'vim-scripts/ReplaceWithRegister'

sneak

插件功能与使用

跟 easymotion ,flash 类似,都是进行快速跳转功能

  • Type s and two chars to start sneaking in forward direction
  • Type S and two chars to start sneaking in backward direction
  • Type ; or , to proceed with sneaking just as if you were using f or t commands

配置方式

  1. 编辑 ~/.ideavimrc
1
Plug 'justinmk/vim-sneak'

surround

插件功能与使用

提供了一个 surround 的语义,可以针对各种符号包裹的包裹符号进行操作

  • cs"’ 表示 把 " 替换成 '
  • ds" 删除 " ,保留 "" 中的内容
  • ysiw
    给当前 word 插入 <div></div> 标签

配置方式

  1. 编辑 ~/.ideavimrc
1
Plug 'tpope/vim-surround'

Switch

插件功能与使用

该插件的目的是根据正则表达式模式切换光标下的一些文本。通过 :Switch 命令,插件会在光标下查找几个特定模式之一,并根据它执行替换。比如

  1. true <-> false
  2. && <–> ||
  3. == <–> !=

以及一些针对特定语言的特定 switch 方式

配置方式

  1. 安装 vim-switch 插件
  2. 编辑 ~/.ideavimrc
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
set switch
" Map to <leader>s and <leader>S
nnoremap <C-s> :Switch<CR>
nnoremap <C-S-s> :SwitchReverse<CR>

" Or use - and +
nnoremap - :Switch<CR>
nnoremap + :SwitchReverse<CR>

" 设置一些支持的转换模式
let g:switch_definitions = 'group:basic,group:java,group:rspec'

textobj-entire

插件功能与使用

通过了一个 entire 的 textobj ,来选择缓冲区的整个内容,简单来说可以替换 ggVG{montion},好处是不回改变当前光标的位置;实际使用场景不多

配置方式

  1. 编辑 ~/.ideavimrc
1
Plug 'kana/vim-textobj-entire'

Whick-Key

插件功能与使用

一个按键提示,起源应该是在 emacs 中,可以很好的对按键绑定做一个提示,如果使用过 spaceemacs , doomemacs , lazyvim 对这个功能应该不会陌生

配置方式

  1. 安装 Which-Key 插件
  2. 编辑 ~/.ideavimrc
1
2
3
set which-key
let g:WhichKey_ShowVimActions = "false"
let g:WhichKey_DefaultDelay = 300

为了降低一些 vim 原生操作的噪音,可以把 ShowVimAction 关闭,如果是刚入坑,可以打开,形成肌肉记忆以后,在管理

DefaultDelay 用于设置弹窗延迟,避免操作过快的时候,whichkey 的弹出框闪现

结语

以上就是 ideavim 的扩展插件介绍,其实有一些功能性上有一些重复,选择自己喜欢的配置即可,有一些插件可能没那么必要,如果追求一致性,可以不太需要使用,比如 entries 这个 textobj ,大部分场景下,我们都会使用 ggVg 来操作,没有必要单独再去配置与学习使用

插件介绍完了,后边还有基础设置与 keybind 设置, 由于这两项其实是非常私人化的,可能就不回介绍过于详细,只针对配置方式做一些介绍

updatedupdated2025-05-032025-05-03