键位操作

光标操作

只靠前面这点知识,我们仍然需要鼠标协助完成很多操作,并且可能还完成不好,接下来我们需要了解一些键盘移动光标的操作。

我们先下载一个文本用作练习

  1. $ wget http://grepcode.com/file_/repository.grepcode.com/java/root/jdk/openjdk/8u40-b25/java/lang/Object.java/\?v\=source -O Object.java
  2. $ vim Object.java

在 Vim 中光标操作基本都是在 normal 模式下完成的,如果你有时候搞不清,那就多按几次 <esc> 键。

上下左右

h, j, k, l 四个键代表了方向键 ← ↓ ↑ →,这个键位是我们前期经常用到的。在开始你会感觉非常别扭,为什么有了方向键还要这四个键位?想想你在键入信息后手挪到方向键,再挪回来的操作,每天的开发都会如此反复个几百次,节约掉这个时间,就是 Vim 高效的第一步。

另外借助数字键可以更快的做到光标跳转,5l 表示向右移动 5 个字符,5j 表示向下移动 5 行,其他依次类推

翻页

<ctrl> + f 的组合键可以向下翻一页,这类的组合键以后我会用 <c-f> 形式表示。

  1. <c-f> " 向下移动一页
  2. <c-d> " 向下移动半页
  3. <c-b> " 向上移动一页
  4. <c-u> " 向上移动半页

以上四个键位在翻页时会经常使用,但是刚入门的话,我还是不建议你全部记住,只记住翻半页或一页的两个键位,在配合 j, k 精确到目标行就可以了,在入门阶段你要尽量减少快捷键的记忆量,在大量刻意练习并熟能生巧后,再去扩展快捷键。

行首行尾

  1. 0 " 快速跳到行首
  2. $ " 快速跳到行尾
  3. g_ " 快速跳到行尾最后一个非空字符(下一章我们会讨论它跟 $ 的区别)

在熟练应用 h, j, k, l 四个键位后,配合这两个键位可以让你几行之内的光标操作更加灵活

页头页尾

  1. gg " 快速跳到第一行
  2. G " 快速跳到最后一行

Object.java 这个文本为例,如果你想马上去看最后几行写的是什么,你一定不想按不知道多少次的 <c-f> 组合键,但是如你所试,只需要 G 就可以了。

现在我们已经学到了很多键位操作,我真诚的希望你能先花上几个小时的时间去练习它,最好是在一个你真正需要编辑的文档上来使用,将光标移动到需要输入的位置,i 进入 insert 模式,完毕后 <esc> 返回 normal 模式,如此反复,在这个过程中,你一定会有这样的想法,还不够,这些还不够,我还需要更快捷的东西,比如,搜索

查找与替换

举个例子,在样本 Object.java 中假设光标在第 39 行,我们想要快速的定位到 native 单词,目前可以通过 19l 来实现,但是数数也是很麻烦的吧,这时可以通过行内查找很方便的实现。

行内查找

在目标行内按下功能键 f,此时界面无变化,但是右下角会出现字母 f 表示等待下一步操作,然后按下 n,光标便会移动到 native 的首字母上

  1. fx " 从当前光标开始向右查找字符 x,x 为目标字符
  2. nfx " 从当前广告开始向右查找第 n 个字符 xn 为数字
  3. Fx " 从当前光标开始向左查找字符 x,x 为目标字符
  4. nfx " 从当前广告开始向左查找第 n 个字符 xn 为数字

同样的,在这里我建议大家开始只使用向右查找即可,这样也比较符合我们由左到右的阅读习惯,顶多每次先按一下 0 跳到行首就可以了。

全文查找

如果你想要把全文的 native 都找到,可以按下 / 进入 command 模式,随后输入 native 然后回车,此时光标会定位在第一个目标上,并高亮所有找到的目标单词。

此时按下 n 光标就会向下在高亮的单词上依次跳转,N 则会反方向跳转。值得注意的地方时,Native 也会被找到,说明默认情况下查找对小写是不敏感的,在以后的章节我们会来讨论怎么处理,但是它对大写是敏感的,你可以用 Native 查找试试。

最后一点,现在所有的目标区域都是高亮的,怎么取消呢?输入 :nohls 即可,为什么,我们以后再讲。

  1. /word " 输入 / 会进入 command 模式,再输入先要搜索的单词并回车进行搜索
  2. ?word " / 是向光标以后搜索,? 是向前搜索
  3. n " 英文字母 n,根据 / ? 搜索的方向定位到下一个匹配目标
  4. N " 与 n 相反,定位匹配目标

替换

替换一般都是和查找绑定在一起的操作,Vim 中提供了两种替换方式

将 4 到 10 行内的 code 替换为 name

  1. :4,10s/code/name/g

全文替换

  1. :1,$s/code/name/g

不难理解,其实全文替换你也可以理解为替换 1 行到 $ 最后一行,唯一需要注意的是,第二个数字后面要记得跟上 s

  1. :n1,n2s/word1/word2/g " n1, n2 表示数字,替换 n1 行到 n2 行的单词
  2. :1,$s/word1/word2/g " 全文替换,也可以写成 :%s/word1/word2/g
  3. :1,$s/word1/word2/gc " 全文替换,并出现确认提示

替换光标所在的行

  1. :s/word1/word2/g " 替换光标当前所在行的内容,不需要输入行号

复制、粘贴、删除

复制当前行 yy,删除并复制当前行 dd,粘贴到光标下一行 p

这三类按键在以后的使用频率会非常的高,他们不难,但是组合键非常多的种类。

  1. dd " 删除当前行
  2. ndd " 向下删除 n
  3. d1G / dgg " 删除第一行到当前行的数据
  4. dG " 删除当前行到最后一行的数据
  5. d$ " 删除当前字符到行尾
  6. d0 " 从行首删除到当前字符
  7. yy " 复制当前行
  8. nyy " 从当前行开始复制 n
  9. y1G / ygg " 从第一行复制到当前行
  10. yG " 从当前行复制到最后一行
  11. y0 " 从行首复制到当前字符
  12. y$ " 从当前字符复制到行尾
  13. p, P " 黏贴,p 黏贴到光标下一行,P 黏贴到光标上一行

他们可以跟数字键和移动光标的键位配合使用,做出很多种方式的复制和删除,他们彼此之间组合也可以有意想不到的效果,比如 ddp 从字面意思可以理解为,先删除当前行,在复制到下一行,而实际操作后你会发现,它起到了将当前行下移一行的效果,这不就是某些程序 IDE 的快捷键功能吗,当熟练操作这些组合键,你会第一次感觉到 Vim 的魅力,什么鼠标操作都弱爆了,我几个键位就可以秒到他们,并且还远不止此。你还会继续学下去的,对吗?

需要注意的一点是,yy 复制的数据只在当前缓冲区有效,退出文件再进来就不在生效,后面的章节我们会讨论怎样跨文件复制粘贴。

接下来是删除单个字符,从当前光标向后删除并复制一个字符 x

  1. x " 向后删除一个字符
  2. nx " 向后删除 n 个字符
  3. X " 向前删除一个字符
  4. nX " 向前删除 n 个字符

在这里,如果你试着按下 xp,你会发现它完成删除当前字符,并向左粘贴了该字符,p 在复制的是几个字符的情况下,实现的也是粘贴字符,而不会跨行。

撤销和重做

如果你操作了一些删除操作,又后悔了怎么办,第一个想到的是撤销,撤销以后又后悔了怎么办,重做。任何编辑器都会有的两个功能,Vim 当然也有

  1. u " 撤销
  2. <c-r> " 重做

ok,要打住了,再讲下去东西就太多了,现在我们已经可以有点笨拙的在文本中移动光标,并进行复制、粘贴、删除、查找、替换、插入的操作。这样已经够了,我们已经可以用起来了,尽管还差了很远,但是停下来练习是很重要的。你在跟我的步骤练习中就会发现,你在进行某个操作时需要想很久才能按出正确的键,甚至不看教程就完全头脑空白不知所措,这样是肯定不行的。使用 Vim 最理想的状态是省去“想”的过程,完全靠手的感觉就做出相应的操作,这是需要相当大的练习才可以实现的,也这有这样,才能体现 Vim 快和爽的特点。加油吧!骚年,喝口水就赶紧练习吧。

2018-04-07 发布

2018-04-11 最后修改