(6条消息) IdeaVim插件使用技巧
在 IDEA Intellij小技巧和插件 一文中简单介绍了一下IdeaVim插件。在这里详细总结一下这个插件在日常编程中的一些常用小技巧。供有兴趣使用这个插件,但对Vim还不十分熟悉的朋友参考。当然基本的hjkl移动光标和几种常见模式等等基本概念就略过不提了。
为了确保只包含常用操作,这里提到的技巧都没有从现成文档里抄,而是凭记忆列出(不常用自然就不记得了)。估计会有所遗漏,慢慢再补充。
- 切换Vim模拟器状态
这个插件允许设置一个快捷键一键开启或关闭,在切换模式时会同时自动切换keymap,十分方便。默认键位是Ctrl+Alt+V,但这个键位覆盖了很常用的“抽取局部变量”功能,建议重设,在setting->keymap中查找VIM Emulator即可。
由于开启和关闭状态分别使用两套keymap,因此两套都需要设定。可以把两套keymap下的都设为一样的键,也就是用同一个键切换。但个人建议设为不同的键,这样能清楚知道当前处于那种模式中。并且,如果在开启Vim的插入模式下关闭Vim模拟器,下次进入时仍然是插入模式,比较混乱(因为你关闭模拟器就是为了使用默认keymap输入大段代码,重新开启Vim模拟器就是为了使用普通模式下的命令)。因此建议把Vim keymap中的Exit Insert Mode设为与另一个keymap的Vim Emulator相同的键(也就是进入Vim模拟器的快捷键)。例如,我使用的设定是:
Default keymap -> Vim Emulator : Ctrl+; (用Ctrl+分号开启Vim模拟器)
Vim keymap -> Vim Emulator : Ctrl+, (用Ctrl+逗号关闭Vim模拟器)
Vim keymap -> Vim Emulator : Ctrl+; (用Ctrl+分号退出插入模式,进入普通模式)
这样,在任何时候只要连按两下ctrl+分号,就能保证必定在Vim模拟器的普通模式中。
ScrollOff 参数
启动Intellij后在Vim模拟器下输入命令 :set so=5 可以令屏幕滚动时在光标上下方保留5行预览代码(也就是光标会在第5行触发向上滚动,或者在倒数第5行触发向下滚动)。在代码窗口比较狭小时(例如单步跟踪调试时)非常方便。可惜仅在Vim模拟器开启时有效。行号定位
普通模式下输入 行号G 或 :行号<回车> 都能快速定位到某一行。区别在于前者在输入行号时屏幕上没有任何提示,后者则在Vim命令输入框中可以看到输入过程。(题外话:Sublime Text 2也是用 :行号 来快速定位到某行,应该是沿用了Vim的习惯)进入修改
进入插入模式的方式有很多,直接选用合适的方式进入插入模式比进入后再用箭头键移动光标要好。常用的有:
o - 在当前行下方插入新行并自动缩进
O - 在当前行上方插入新行并自动缩进 (普通模式下的大写字母命令用 shift+字母键 输入,下同)
i - 在当前字符左方开始插入字符
a - 在当前字符右方开始插入字符
I - 光标移动到行首并进入插入模式
A - 光标移动到行尾并进入插入模式
s - 删除光标所在字符并进入插入模式
S - 删除光标所在行并进入插入模式
c<范围> - 删除光标所在位置周围某个范围的文本并进入插入模式。关于范围请看第5点,常用的组合有:caw - 删除一个单词包括它后面的空格并开始插入; ciw - 删除一个单词并开始插入; ci” - 删除一个字符串内部文本并开始插入; c−从光标位置删除到行尾并开始插入;ct字符−从光标位置删除本行某个字符之前(保留该字符)并开始插入。等等。C−删除光标位置到行尾的内容并进入插入模式(相当于c" role="presentation" style="position: relative;">−从光标位置删除到行尾并开始插入;ct字符−从光标位置删除本行某个字符之前(保留该字符)并开始插入。等等。C−删除光标位置到行尾的内容并进入插入模式(相当于c−从光标位置删除到行尾并开始插入;ct字符−从光标位置删除本行某个字符之前(保留该字符)并开始插入。等等。C−删除光标位置到行尾的内容并进入插入模式(相当于c)
r - 修改光标所在字符,然后返回普通模式
R - 进入覆盖模式范围操作
某些普通模式的动作命令后面可以追加一些表示范围的指令,表示该动作将作用在整个范围上。这类命令常用的有:
d<范围> - 删除一定范围内的文本 c<范围> - 删除一定范围内的文本并进入插入模式 y<范围> - 将范围内的文本放入0号和"号注册栏 v<范围> - 选择范围内的文本 =<范围> - 自动缩进范围内的文本 gU<范围> - 将范围内的字符转换为大写 gu<范围> - 将范围内的字符转换为小写 ><范围> - 将范围中的内容缩进一格 <<范围> - 将范围中的内容取消缩进一格
常用的范围指令有:
空格 - 光标所在位置字符。(例如 gU空格 - 将光标位置字符转为大写) 重复某些动作命令 - 光标所在行。 (例如dd删除一行,yy复制一行,cc删除一行文本并开始插入,>> 当前行缩进一格,==自动缩进当前行) $ - 从光标位置到行尾 ^ - 从光标位置到行首,不包含缩进空白 0 - 从光标位置到行首,包含缩进空白 gg - 从光标位置到文件开头 G - 从光标位置到文件结尾 % - 从光标位置到另一边匹配的括号 f<字符> - 从光标位置到光标右边某个字符首次出现的位置,包括该字符 F<字符> - 从光标位置到光标左边某个字符首次出现的位置,包括该字符 t<字符> - 从光标位置到光标右边某个字符首次出现的位置,包括该字符 F<字符> - 从光标位置到光标左边某个字符首次出现的位置,包括该字符 /正则表达式 - 从光标位置到下一个匹配正则表达式的位置(跨行) ?正则表达式 - 从光标位置到上一个匹配正则表达式的位置(跨行) aw - 一个单词加一个空格 (a可理解为“一个”,下同) iw - 一个单词 (i可理解为in,下同) a" - 一个字符串包括双引号 i" - 一个字符串内部文本 a< - 一组< >包含的文本,包括< >号本身 同理类推: i<, a[, i[, a(, i( 注意:真正vim中的it范围(一对xml标签内部)在ideaVim中不生效。 用/或?命令查找时,正则表达式默认大小写敏感,如果需要不敏感,可以在正则表达式开始处加上\c标志。例如 /\cabc 可以匹配到 ABC。下面提到的:s命令同样适用。
选择文本
在Vim中,选择文本需要进入“可视模式”(Visual Mode),这个名称比较奇怪,它的来由据说是因为在Vim的前身Vi中,选择区域是不可见的。在Vim中选择区域会高亮显示,因此称为“可视模式”。
v - 进入字符选择模式, V - 进入行选择模式, Ctrl+v - 进入块选择模式。
进入相应模式后移动光标即可选中文本。过程中可按o键令光标在选区两端切换。
在块选择模式中选中多行,然后按I或A后输入文本,再退出插入模式,所输入的文本将自动加入到每一行的开头或结尾。复制粘贴
在Vim模式下,复制粘贴并不直接使用系统的剪贴板,而是使用Vim提供的多个“寄存器”,每个寄存器都以一个字符来表示。关于寄存器的详细说明可以看这里 http://blah.blogsome.com/2006/04/27/vim_tut_register/ (随便google的一个网页),这里简单列一些常用的操作技巧 (注意,vim使用双引号”来作为选择寄存器的命令,因此下文中的双引号均指在普通模式下按双引号键):
a)用y命令将文本存入寄存器后,如果想在别处替换原有内容,可以先用v命令选中原有内容,然后用p命令粘贴。但第一次粘贴后,默认的寄存器”将被替换为刚刚删除的内容。如果要再次粘贴之前复制的内容,需要使用 “0p 命令组合来复制。也可以进入插入模式后用 Ctrl+r 0 来复制,例如 ciw