核心工具之 ideavim

发布时间 2024-01-11 16:15:32作者: Koshkaaa

对于个人的核心工具集的选择,因为编程中熟练使用主力IDE能够大大提高效率,所以IDE是一个必选项。而IDE与VIM结合的插件,对于VIM使用者,常常是一个必选项。

在Jetbrains系列工具中,插件IdeaVim非常优秀,对我个人而言是一个必选项。

选用IdeaVim原因有以下几个:

  1. 安装配置简便
  2. 对原生的VIM命令支持在IDE中基本做到无缝集成
  3. 因为IDE对语法的理解比VIM更强,使一些VIM命令更“聪明”
  4. 提供最常用VIM插件的实现
  5. 可以通过VIM命令行快捷键调用IDE命令

下面进行一些展开介绍。

1. 安装配置简便

在JetBrains系列软件中,比如IntelliJ IDEA, WebStorm, DataGrip等等,可以使用Cmd + Shift + A,输入plugins进入plugin安装界面,然后在market place中查找IdeaVim进行安装。

image-ideavim-install-1

image-ideavim-install-2

安装好之后,可以在使用Cmd + Shift + A 进行打开/关闭 IdeaVim插件。

image-ideavim-config-1

或者点击工具栏下方的图标:

image-ideavim-config-2

安装好了之后,基本的VIM命令就都可以使用了。如果需要进一步配置,可以产生~/.ideavimrc文件。比如,这个是我的配置文件:

" ~/.ideavimrc

filetype plugin on
syntax on

set hidden

set shiftwidth=2
set expandtab
set tabstop=2
set softtabstop=2
set autoindent
set smartindent

set ic smartcase
set hlsearch
set incsearch
set lbr
set nu

set visualbell
set ruler
set scrolloff=4
set cursorline

set backspace=2

set dictionary=/usr/share/dict/words
set dir=~/.vimswap//,/var/tmp//,/tmp//,.

let g:netrw_home=$HOME.'/.cache/vim'

" Search for selected text in visula mode for * and #
vnoremap * y/<C-R>=substitute(escape(@@,"/\\"),"\n","\\\\n","ge")<CR><CR>
vnoremap # y?<C-R>=substitute(escape(@@,"?\\"),"\n","\\\\n","ge")<CR><CR>

""" Map leader to space ---------------------
let mapleader=" "

""" Plugins  --------------------------------
set surround
set multiple-cursors
set commentary
set argtextobj
set easymotion
set textobj-entire
set ReplaceWithRegister
set exchange

""" Plugin settings -------------------------
let g:argtextobj_pairs="[:],(:),<:>"

""" 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<CR>
map <leader>r :action RenameElement<CR>
map <leader>c :action Stop<CR>
map <leader>z :action ToggleDistractionFreeMode<CR>

map <leader>s :action SelectInProjectView<CR>
map <leader>a :action Annotate<CR>
map <leader>h :action Vcs.ShowTabbedFileHistory<CR>
map <S-Space> :action GotoNextError<CR>

map <leader>b :action ToggleLineBreakpoint<CR>
map <leader>o :action FileStructurePopup<CR>

另外, 这个配置文件是对所有JetBrains 工具都共享的。配置一次就可以在所有工具上生效。

2. 对原生的VIM命令支持在IDE中基本做到无缝集成

这一点没有太多解释。如果有快捷键冲突的话,可以在这个配置界页面进行调整:

image-ideavim-key-conflict

3. 因为IDE对语法的理解比VIM更强,使一些VIM命令更“聪明”

这里举一个最常用的例子。]m将光标跳转到下一个函数开始的地方。在VIM中要做到精准的跳转很不容易,所以我基本上没有使用。然而在IdeaVim中,因为IDE对语法语义理解精准,所以用起来很爽。类似的命令还有[m, ]M, ``[M`

4. 提供最常用VIM插件的实现

IdeaVim是JetBrains的开源软件1,是使用Kotlin实现的插件。所以我们不能直接使用vim的现有插件。不过,IdeaVim选择实现了一些最常用的VIM插件。比如,tpope/vim-surround, tpope/vim-commentary, vim-scripts/argtextobj.vim, 等等。

从我的使用体验来看,这些选择非常成功,每一个精品。做到了“插件中的插件,精品中的精品”。下面就举两个例子。

第一个,argtextobj。变成中我们常常需要修改函数声明中或者函数调用语句中的整个参数。这个时候,一些额外的单词以及逗号就很讨厌。vim-scripts/argtextobj.vim 就是用来解决这个问题的一个插件。比如使用如下操作方便工作:

  • daa: 删除这个参数,包括逗号
  • dia: 删除这个参数,不包括逗号
  • cia: 删除这个参数,不包括逗号,并进入编辑模式
  • vaa: 选中这个参数,包括逗号

image-ideavim-argtextobj

第二个例子,surround。我们常常需要在一段文字两端进行操作,不如添加单引号,双引号,括号,把单引号改成双引号,等等。vim-surround插件做这个非常方便。IdeaVim 自带了这个插件。我最常用的命令有

  • cs:修改文本目标两端的符号
  • ds:删除文本目标两端的符号
  • ys:在文本目标两端添加符号
  • S:在visual 模式中在被选择文本两端添加符号

这里的可以是', ", {,还可以是xml 标签(用t触发) 。更过的使用说明可以参考vim-surround插件的链接上的文档说明。

而要使用这两个功能,不需要任何安装,只需要在~/.ideavimrc文件中添加以下两行即可:

set argtextobj
set surround

5. 可以通过VIM命令行快捷键调用IDE命令

VIM的一个根本优势是默认模式是命令模式,所以很多按键很简洁,不需要组合键,从而在IdeaVim中我们可以方便定义很多快捷键。比如,可以使用Space, a 快速切换 Annotation View (Git Blame):

image-ideavim-toggle-annatation.png

IDE暴露了大量的命令可以用IdeaVim快捷键触发。

列举可用命令,在命令行中输入:actionlist:

image-ideavim-acitonlist-1

image-ideavim-acitonlist-2

这里也有一个网上的列表供参考。

然后,可以在~/.ideavimrc中进行配置:

" ~/.ideavimrc

""" Map leader to space ---------------------
let mapleader=" "

""" Mappings --------------------------------
map <leader>d :action Debug<CR>
map <leader>r :action RenameElement<CR>
map <leader>z :action ToggleDistractionFreeMode<CR>
map <leader>s :action SelectInProjectView<CR>
map <leader>a :action Annotate<CR>
map <S-Space> :action GotoNextError<CR>
map <leader>b :action ToggleLineBreakpoint<CR>
map <leader>o :action FileStructurePopup<CR>

比如,可以使用<space>a 打开/关闭 annotation view (git blam),<space>s在project窗口中找到当前文件。

总之,推荐使用IdeaVim!