IdeaVim键盘流

ideavim键盘流


  • 最后更新于2019-12-06

作为一个vimer,不管使用什么IDE或者编辑器,安装完成后的第一步就是安装vim插件。

我的日常开发中使用最多的就是IDEA,对应的vim插件为IdeaVim。但是其实想要在集成开发环境中顺手的完成代码的编写,其实单单熟练vim是不够的,毕竟IDEA的功能更多更复杂。所以除了编辑文本之外,让具体的IDE工具和vim配合起来才能达到更加完美的效率。

本篇文章的目的是阐述如何在idea中顺畅的使用vim编写代码以及完成常规的操作。所以不会对vim的基本使用做过多的描述,如果有兴趣了解vim的更多信息,请移步vim官网或者vimscript脚本进行了解和学习。

1. 安装ideavim

安装的部分就不多说了,打开:设置->插件->浏览依赖->搜索vim安装即可。

ideavim

ideavim已经支持vim大多数的操作,但是仍然是不完整实现。比如列表跳转和很多不常用的命令。此外,如果vim插件和已有的快捷键设置有冲突,可以在vim设置中进行调整,一面引起快捷键的混用。

2. idea的核心操作逻辑

idea毕竟是ide,有着完整的代码开发功能。熟悉idea的设计逻辑和模块应该也是调高效率的必走之路了。

2.1. 布局

布局

idea的设计布局分为五部分,从上往下分别是:目录(黄色),toolbar(蓝色),编辑区(红色),扩展工具(绿色),tips(灰色)。详细如图,正常来说vim的作用范围也就在代码编辑区,其他的操作都需要借助idea本身来完成。

除了基本布局之外,idea总是会弹出对话框,比如新建文件,搜索文件等等。这些对话框中的输入操作vim是未启用状态。所以在对话框中输入命令时vim不会生效这一点必须清楚,避免使用的时候引起环混乱。

2.2. 逻辑

开发过idea插件的人都知道,在idea中,任何目录选项上的点击操作,工具栏上的按钮都会被映射为一个action。即点击对应的按钮或者选项,执行相应的action。理解很简单,这就是MVC的思想,比如springmvc, 一个访问路径映射为一个控制器中的方法这样子。

明白action映射这一点很重要。因为ideavim的插件支持使用vim命令执行对应的action。所以,这个设计逻辑就打通了vim和idea的交互,使得我们可以在vim中完成所有和idea相关的操作。

2.3. 常规操作

vim的定位是文本编辑。所以在idea中一般情况下vim快捷键和命令生效的基本条件就是当前窗口焦点在编辑区。这是最基础的条件,如果你当前的快键键在Project或者Run这些侧边栏中,按vim的命令肯定是不会生效的。

明白了基本条件,那我们要做的第一件事也是最重要的事情就是在idea中,如何快速的将焦点回到的编辑区。答案是:

Esc

这应该是使用vim的人最能接受的快捷键了。所以,到这里基本的操作思路就很明确,当前的焦点要么在编辑区外,要么在编辑区内。而返回编辑区的操作很简单,就是Esc。当焦点在编辑区的时候,就可以随心所欲的使用vim的指令和快捷键了。

3. 配置

有了idea基本的了解之后,我们就可以着手配置自己的vim了。ideavim插件的配置通常是~/.ideavimrc,所以将自己的配置脚本写在对应的文件中即可。当然如果你已经有了自己的vim配置文件在~/.vimrc下,那只需要在ideavim的配置文件中添加一行命令即可全部读取映射过来

source ~/.vimrc

当然,只支持部分vimrc的参数,所以并不是所有的vimrc中的配置都会生效

4. 在vim中执行idea的action

为了执行idea中的action,ideavim有两个额外的命令来支持这一操作。

  • :actionlist [pattern]
  • :action {actionName}

第一个命令actionlist是帮助查看idea中有哪些命令。第二个命令是执行对应的action这样子。有了这两个命令的帮助我们就可以在ideavim的配置文件中使用map命令来映射idea的action到vim的快捷键中。

比如使用actionlist命令查看rundebugaction名称:

Run

然后就可以在~/.ideavimrc使用map命令映射自己习惯的快捷键,这里我把zd映射为Debugzr映射为Run

" 设置debug为 zd
:nnoremap zd :action Debug<CR>
" 设置run 为 zr
:nnoremap zr :action Run<CR>

这里,我没有测试idea中使用普通的*map隐射命令会不会引起递归调用,但是*noremap有效的状态下使用*nnoremap总是没有错的。

其实我想表达的重点到这里就差不多了,核心点就是在vim中调用idea的action,从而使得vim扩展到idea中的所有功能这样子。

当然,记住几个idea核心快捷键在大多数情况下总是有用的。

  • Ctrl + Shift + A 打开action快速搜索窗口
  • Alt + 数字/字母 打开对应的扩展工具栏
  • Double Shift 快速搜索
  • Ctrl + Tab 打开Switcher,进行扩展工具栏或者文件的快速切换

5. 常用技巧

跳转

掌握跳转技巧在阅读代码和debug的时候,非常有用。

说明:<C-x> 代表组合键 Ctrl + x

  • <C-]> 跳转到当前标识符的定义位置 (相当于在当前光标位置的单词上按住ctrl用鼠标点击)
  • <C-o> 回退一步 (go back)
  • <C-i> 前进一步 (go forward)
  • '. 跳转到之前修改位置
  • '' 在前一次跳转位置与当前位置间切换
  • 行号 G:行号<回车> 跳转到某一行
  • gg 跳转到文件开头
  • G 跳转到文件末尾
  • H 跳转到屏幕顶端(如果设置了set so=n,则跳转到第n行)
  • L 跳转到屏幕底端(如果设置了set so=n,则跳转到倒数第n行)
  • M 跳转到屏幕中间
  • fF 跳转到本行某个字符,小写f向右查找,大写F向左查找。用;,在匹配间切换
  • tT 跳转到本行某个字符之前,小写t向右查找,大写T向左查找。用;,在匹配间切换
  • /正则表达式 跳转到下一个匹配。用nN在匹配间切换。
  • ?正则表达式 跳转到上一个匹配。用nN在匹配间切换。

附上一张vim跳转图,方便理解。


vim十字跳转快捷键参考图

插件模拟

到目前位置,ideavim一共支持四个插件的模拟,分别为:

  • easymotion 快速跳转
  • surround 快捷环绕操作,比如添加修改括号双引号等等
  • multiple-cursors 多指针操作
  • commentary 快捷注释操作

当然对于以上插件的模拟本质是就是扩展几个核心命令,并不是完整实现插件的所有功能。

EasyMotion

EasyMotion依赖于IdeaVim-EasyMotionAceJump 两个插件,所以使用之前确保已经完成安装。安装完成之后,在ideavimrc中添加下面这行设置开启。

set easymotion

令人欣慰的是EasyMotion的模拟支持所有原生插件的功能。查看所有支持命令

surround

模拟的插件为 vim-surround。插件本身很简单,就是提供快捷的对操作。比如添加括号,双引号等等。

set surround

支持的命令有:ys, cs, ds, S。常见用法如下,将光标停留在*所在位置,输入对应的命令(Command),即可将左侧(Old text)的内容修改为右侧(New text)的内容。

vim-surround examples

multiple-cursors

多光标vim-multiple-cursors操作在vim中其实很爽,但是IDEA有语法解析和识别,所以将变量重命名的action绑定到vim快捷键上明显来的更方便些。具体可参考我下面的的ideavimrc中的内容。

官方readme里说支持的命令的有:<A-n>, <A-x>, <A-p>, g<A-n>,不知道为啥我就是没按出来。不知道A代表啥,commandoptionctrl键我都试了,貌似都不行。如果有知道的同学可以评论下,被自己蠢哭了,还没google到这个是什么含义。

commentary

一个方便添加注释的插件commentary.vim,相当有用,具体用法参考原生插件的readme。

IdeaVim模拟的命令有: gcc, gc + motion, v_gc

6 我自己的ideavimrc

本来添加了大量的映射,后来删除了大多数,大部分都转向了idea的double shift来快速搜索和执行。

" leader: ,
let mapleader = ","

" 基础键位映射
" esc 使用jk
inoremap jk <esc>

" 映射idea常用快捷键
" 重命名
nnoremap <leader>r :action RenameElement<CR>
" 格式化当前文件
nnoremap <leader>f :action ReformatCode<CR><esc>
" quick java doc
nnoremap <leader>q :action QuickJavaDoc<CR>

" 插件模拟
" surround
set surround
" multiple-cursors
set multiple-cursors
" easyMotion 模拟,额外依赖插件:AceJump,IdeaVim-EasyMotion
set easymotion
" 注释插件模拟
set commentary

参考

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342