键位操作
光标操作
只靠前面这点知识,我们仍然需要鼠标协助完成很多操作,并且可能还完成不好,接下来我们需要了解一些键盘移动光标的操作。
我们先下载一个文本用作练习
$ wget http://grepcode.com/file_/repository.grepcode.com/java/root/jdk/openjdk/8u40-b25/java/lang/Object.java/\?v\=source -O Object.java
$ vim Object.java
在 Vim 中光标操作基本都是在 normal
模式下完成的,如果你有时候搞不清,那就多按几次 <esc>
键。
上下左右
h, j, k, l
四个键代表了方向键 ← ↓ ↑ →
,这个键位是我们前期经常用到的。在开始你会感觉非常别扭,为什么有了方向键还要这四个键位?想想你在键入信息后手挪到方向键,再挪回来的操作,每天的开发都会如此反复个几百次,节约掉这个时间,就是 Vim 高效的第一步。
另外借助数字键可以更快的做到光标跳转,5l
表示向右移动 5 个字符,5j
表示向下移动 5 行,其他依次类推
翻页
<ctrl> + f
的组合键可以向下翻一页,这类的组合键以后我会用 <c-f>
形式表示。
<c-f> " 向下移动一页
<c-d> " 向下移动半页
<c-b> " 向上移动一页
<c-u> " 向上移动半页
以上四个键位在翻页时会经常使用,但是刚入门的话,我还是不建议你全部记住,只记住翻半页或一页的两个键位,在配合 j, k
精确到目标行就可以了,在入门阶段你要尽量减少快捷键的记忆量,在大量刻意练习并熟能生巧后,再去扩展快捷键。
行首行尾
0 " 快速跳到行首
$ " 快速跳到行尾
g_ " 快速跳到行尾最后一个非空字符(下一章我们会讨论它跟 $ 的区别)
在熟练应用 h, j, k, l
四个键位后,配合这两个键位可以让你几行之内的光标操作更加灵活
页头页尾
gg " 快速跳到第一行
G " 快速跳到最后一行
拿 Object.java
这个文本为例,如果你想马上去看最后几行写的是什么,你一定不想按不知道多少次的 <c-f>
组合键,但是如你所试,只需要 G
就可以了。
现在我们已经学到了很多键位操作,我真诚的希望你能先花上几个小时的时间去练习它,最好是在一个你真正需要编辑的文档上来使用,将光标移动到需要输入的位置,i
进入 insert
模式,完毕后 <esc>
返回 normal
模式,如此反复,在这个过程中,你一定会有这样的想法,还不够,这些还不够,我还需要更快捷的东西,比如,搜索
查找与替换
举个例子,在样本 Object.java
中假设光标在第 39 行,我们想要快速的定位到 native
单词,目前可以通过 19l
来实现,但是数数也是很麻烦的吧,这时可以通过行内查找很方便的实现。
行内查找
在目标行内按下功能键 f
,此时界面无变化,但是右下角会出现字母 f
表示等待下一步操作,然后按下 n
,光标便会移动到 native
的首字母上
fx " 从当前光标开始向右查找字符 x,x 为目标字符
nfx " 从当前广告开始向右查找第 n 个字符 x,n 为数字
Fx " 从当前光标开始向左查找字符 x,x 为目标字符
nfx " 从当前广告开始向左查找第 n 个字符 x,n 为数字
同样的,在这里我建议大家开始只使用向右查找即可,这样也比较符合我们由左到右的阅读习惯,顶多每次先按一下 0
跳到行首就可以了。
全文查找
如果你想要把全文的 native
都找到,可以按下 /
进入 command
模式,随后输入 native
然后回车,此时光标会定位在第一个目标上,并高亮所有找到的目标单词。
此时按下 n
光标就会向下在高亮的单词上依次跳转,N
则会反方向跳转。值得注意的地方时,Native
也会被找到,说明默认情况下查找对小写是不敏感的,在以后的章节我们会来讨论怎么处理,但是它对大写是敏感的,你可以用 Native
查找试试。
最后一点,现在所有的目标区域都是高亮的,怎么取消呢?输入 :nohls
即可,为什么,我们以后再讲。
/word " 输入 / 会进入 command 模式,再输入先要搜索的单词并回车进行搜索
?word " / 是向光标以后搜索,? 是向前搜索
n " 英文字母 n,根据 / 或 ? 搜索的方向定位到下一个匹配目标
N " 与 n 相反,定位匹配目标
替换
替换一般都是和查找绑定在一起的操作,Vim 中提供了两种替换方式
将 4 到 10 行内的 code 替换为 name
:4,10s/code/name/g
全文替换
:1,$s/code/name/g
不难理解,其实全文替换你也可以理解为替换 1 行到 $ 最后一行,唯一需要注意的是,第二个数字后面要记得跟上 s
:n1,n2s/word1/word2/g " n1, n2 表示数字,替换 n1 行到 n2 行的单词
:1,$s/word1/word2/g " 全文替换,也可以写成 :%s/word1/word2/g
:1,$s/word1/word2/gc " 全文替换,并出现确认提示
替换光标所在的行
:s/word1/word2/g " 替换光标当前所在行的内容,不需要输入行号
复制、粘贴、删除
复制当前行 yy
,删除并复制当前行 dd
,粘贴到光标下一行 p
这三类按键在以后的使用频率会非常的高,他们不难,但是组合键非常多的种类。
dd " 删除当前行
ndd " 向下删除 n 行
d1G / dgg " 删除第一行到当前行的数据
dG " 删除当前行到最后一行的数据
d$ " 删除当前字符到行尾
d0 " 从行首删除到当前字符
yy " 复制当前行
nyy " 从当前行开始复制 n 行
y1G / ygg " 从第一行复制到当前行
yG " 从当前行复制到最后一行
y0 " 从行首复制到当前字符
y$ " 从当前字符复制到行尾
p, P " 黏贴,p 黏贴到光标下一行,P 黏贴到光标上一行
他们可以跟数字键和移动光标的键位配合使用,做出很多种方式的复制和删除,他们彼此之间组合也可以有意想不到的效果,比如 ddp
从字面意思可以理解为,先删除当前行,在复制到下一行,而实际操作后你会发现,它起到了将当前行下移一行的效果,这不就是某些程序 IDE 的快捷键功能吗,当熟练操作这些组合键,你会第一次感觉到 Vim 的魅力,什么鼠标操作都弱爆了,我几个键位就可以秒到他们,并且还远不止此。你还会继续学下去的,对吗?
需要注意的一点是,yy
复制的数据只在当前缓冲区有效,退出文件再进来就不在生效,后面的章节我们会讨论怎样跨文件复制粘贴。
接下来是删除单个字符,从当前光标向后删除并复制一个字符 x
x " 向后删除一个字符
nx " 向后删除 n 个字符
X " 向前删除一个字符
nX " 向前删除 n 个字符
在这里,如果你试着按下 xp
,你会发现它完成删除当前字符,并向左粘贴了该字符,p
在复制的是几个字符的情况下,实现的也是粘贴字符,而不会跨行。
撤销和重做
如果你操作了一些删除操作,又后悔了怎么办,第一个想到的是撤销,撤销以后又后悔了怎么办,重做。任何编辑器都会有的两个功能,Vim 当然也有
u " 撤销
<c-r> " 重做
ok,要打住了,再讲下去东西就太多了,现在我们已经可以有点笨拙的在文本中移动光标,并进行复制、粘贴、删除、查找、替换、插入的操作。这样已经够了,我们已经可以用起来了,尽管还差了很远,但是停下来练习是很重要的。你在跟我的步骤练习中就会发现,你在进行某个操作时需要想很久才能按出正确的键,甚至不看教程就完全头脑空白不知所措,这样是肯定不行的。使用 Vim 最理想的状态是省去“想”的过程,完全靠手的感觉就做出相应的操作,这是需要相当大的练习才可以实现的,也这有这样,才能体现 Vim 快和爽的特点。加油吧!骚年,喝口水就赶紧练习吧。
2018-04-07 发布
2018-04-11 最后修改