键位操作

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

    在 Vim 中光标操作基本都是在 模式下完成的,如果你有时候搞不清,那就多按几次 <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. G " 快速跳到最后一行

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

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

    行内查找

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

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

    全文查找

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

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

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

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

    替换

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

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

    全文替换

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

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

    替换光标所在的行

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

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

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

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

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

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

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

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

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

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

    2018-04-11 最后修改