本文假设您对VIM有基本的了解,会用一些基本快捷键,但难以在日常的代码编辑中使用。
本文将讨论如何只通过少量基本按键操作的组合,使用VIM进行高效的代码编辑。
两种模式
VIM中有两种模式。普通模式、编辑模式
平时是普通模式,就是没法打字的模式。这时所有的操作都是通过键盘上的按键来完成的,比如上下左右就是jhkl。
编辑模式就和普通的word,notebook等软件一样,可以自由地写字。
普通模式下按a或i键进入编辑模式,编辑模式下按esc键回到普遍模式。
普通模式下,会进行移动光标、复制粘贴、选择、删除、查找等等,除了打字输入外的一切操作。
编辑模式下,一般只进行文本编辑。
因此,一个熟练的vim用户往往一大半的时间都在待在普通模式中。只有要打字时才进编辑模式,输完要打的字会顺手按一下esc回到普通模式。从普通模式下快速移动光标到下一个需要编辑的位置,再进入编辑模式,输入... 以此循环。
光标移动
先说基本的光标移动操作: 下: j, 上:k, 左: h, 右:l 。 看似奇葩,但正好就是右手最顺手的四个键,手在原地就能控制方向
光标向后移动一个词: w (word), 向前移动一个词: b (back), 移到词尾: e。 如果是代码或英文,很好用,可以用来在一行内进行光标快速移动。如果是中文,忽略他们吧。
向后寻找下一个指定字符:f, 向前寻找: F 。 比如:先按f,再按a, 就是从光标当前位置开始,找到下一个字符a, 并把光标移动过去。
重复操作: 数字。比如向右移动10次, 就是10l。在键盘上依次按下 1 0 l , 光标就向右移动了10个字符的位置。
移动到指定行: 冒号+行号。 比如 :100 就是移动到当前文件的第100行。 先按:, 这时在vim界面的最下方会进入输入命令的模式。输入100,再回车, 就移到了第100行。
$ 移到行尾, ^移到行首。
基于上面的基本操作,我们会得到一些快速移动的“组合键”。
-
在使用IDE里的Vim插件时,由于我们知道行号,可以通过
:xxx的语法快速定位到指定行号。或通过当前光标所在行号和目标行号,快速计算出需要上下移动多少行。这个计算不需要太精确,比如希望从356行移到391行,第一反应算不出准确数字,但知道肯定是30-40之间。先移动一个30行或40行,就很接近目标位置了,再连按几下方向键就到了。 -
快速移到某一行,但没有行数。方向同上,根据屏幕上的距离,先随意估一个大体的行数,位置接近了再一行行移动过去。
-
快速移动到本行的指定位置。 如果一眼就知道这个位置或它附近的字符在这一行里是唯一的(比如函数定义时的括号), 使用对应的
f(或F(移动到(处,再连按wb 或hjkl快速移动到对应位置。 -
快速移动到本行的指定位置。如果一眼找不到那个字符的特殊性,这时可以使用这个比较通用的方法。估计它大致的位置,然后使用数字+方向键快速逼近;再连按
w或b进一步接近,最后使用方向键到达指定位置 。如果这个位置在偏行尾处,先按$到行尾,再连按b快速逼近。看起来很复杂,但实际用的时候往往非常快。下面是一个本行内快速移动的示例,这行代码是我从Golang源码中随意挑选的:
var errNegativeRead = errors.New("bufio: reader returned negative count from Read")
假设现在光标在行首,要快速移动到 "bufio:"中o或:的位置,然后把"bufio:" 改成 "bufioooo:"。
方法一; 第一眼就发现了:的特殊性, 使用f: 直接到达位置。
方法二: 连按w (一直按着不放), 几下之后就到了位置 (不小心按过了就再按b退回)
方法三:快速估了一个30的长度, 按了30l, 光标向右移动了30次,到了"New"的"e"位置。已经很近了,我再随手按了一个5l, 向右移动5次,现在就已经到"bufio"的"u"的位置了。再连按几下l就到了。
即使是最麻烦的方法三,熟练的话实际也不超过2秒钟。如果是用鼠标,这时手刚刚握到鼠标上。
文本操作
选中文本: v和V。 需要配合上文中的光标移动操作来使用。
v键:按下v键后,再移动光标,光标最终移动到哪,选中的位置就是从按v键的位置到最终的位置
V键:整行选中。按下V键后,再移动光标,从按下V键的那一行到最终光标所在那一行,全部的行都被整行选中。
替换单个字符:r键。 比如i = 500, 我现在想改成i = 400, 光标先移到5上,再输入r4, 即可完成。
删除:x或d键。比如先使用v和V键选中一部分,再按x或d键删除。 删除(剪切)当前字符:x键; 删除整行:dd; 从当前位置删除到行末:D 。 这里的“删除到行末”功能其实使用频率超乎寻常的高。请注意,我知道x键实际的意思是剪切而非删除,但当只需要删除单个字符时,使用x比d键要好用。
复制: y, 剪切: x, 粘贴: p 。 也需要配合上面的v和V键选中所需要的部分,再配合前面的光标移动操作来移动到相应位置。
基于上述基本命令,又有了一些组合键:
从当前位置删除到词尾:de 按d进入删除模式, 按e移动到词尾
复制多个词: 移到词首,按v开始选取,连按b键到想要的位置 ,按y复制。 再移动到指定位置,p粘贴。
复制整行: V + y + p 。 复制整行5次: Vy5p
编辑模式
使用a和i进入编辑模式。区别是a的光标会在当前字符的右边,而i在右边。因为a的意思是append,而i指insert。
初学的时候会对这种块状光标不习惯,用多了就有肌肉记忆了。
总结
以上就是本文全部的内容。 一共只讲了不到20个命令,但已经足够在vim模式下高速操作并极大提升编辑效率。