vim 学习实录

记录一下学习 vim 的过程,加深每个命令的记忆,也方便以后查看。

顺便也熟悉一下 minila。 :)

特别注意,vim 中的操作符是区分大小写的

基础教程

第一讲

光标移动

vim 的光标移动使用的是 hjkl 四个键,分别对应 左下上右 四个方向。

具体对应关系:

1
2
3
4
h(左移)
j(下行)
k(上行)
l(右移)

个人体验下来,右手食指按照正常指法,应该放在j上,最开始使用光标移动的时候,我会把右手向左平移一个键位,这样右手四指依次放在了 hjkl 上,本以为这样能最快的控制四个方向的按键。但是实际体验中发现了问题,频繁的改变指法,其实会导致指法的混乱,很多时候大脑反应不过来究竟应该把食指放在 j 上还是 h 上,这样其实也很没有效率。所以我觉得不应该改变指法,而是用食指记住 hj 两个按键的功能,这样在不改变指法的前提下,也可以实现有效的按键控制。

进入及退出

进入 vim 编辑器:

1
vim <文件名>

退出 vim 编辑器:

1
2
:q!  // 放弃所有改动强制退出
:wq // 保存改动并退出

删除和插入

  1. 删除光标所在位置的字符: x
  2. 插入文本: i
  3. 添加文本: A

注意,插入命令 i 是在光标位置的前一个位置插入文本。而添加命令 A 是在该行最后一个字符后添加文本,无论光标处于该行什么位置,都可以使用A命令在该行最后添加文本。

第二讲

命令和对象

一个 vim 命令是由命令和对象两个部分组成的

1
operator [motion]

其中 operator 是命令, motion 是动作对象。

下面列出的是一个简短的动作列表

  1. w: 从光标的当前位置,直到下一个单词起始处,不包括它的第一个字符;
  2. e: 从光标的当前位置,直到该单词的末尾,包括最后一个字符;
  3. $: 从光标的当前位置,直到当前行的末尾。

实际上,上面的三个动作也可以当作命令使用,单独使用 w,光标就将跳到下一个单词的第一个字符上,其他的命令也会产生相应的动作。

删除命令

删除命令是字符 d,如果和上面的三个命令组合使用,效果如下:

  1. dw: 从光标的当前位置,删除至下一个单词的起始位置;
  2. de: 从光标的当前位置,删除至本单词的末尾;
  3. d$: 从光标的当前位置,删除至当前行的末尾。

在某些场景下,删除一整行是一个常用命令,vim对删除整行的操作做了优化,使用 dd 命令,无论光标处于一行的什么位置,都可以快速删除该行。

计数动作

将动作命令和数字组合使用,可以实现更加快速的操作效果,比如 2w 会跳过两个单词,3dd 则会删除三行文本,直观上理解的话,计数动作就是给一个动作做了乘法。

加入计数动作后,命令的语法如下:

1
<number> operator [motion]

注意,计数命令有一个比较特殊的命令字符 0,使用该命令会使光标回到行首,它与命令 $ 相对应,是一个快速操作的较常用命令

撤销命令

  1. 撤销单次操作的命令是字符 u,并且该命令可以多次使用直到之前所有的操作都被撤销;
  2. 如果希望一次命令就撤销单行内的所有之前的操作,那么使用字符 U 即可;
  3. 命令 ctrl-r 的作用是撤销之前的撤销命令,听上去比较晦涩和拗口,实际体验就知道是什么效果了。

第三讲

置入类命令

命令 p 的作用是将最近一次使用删除命令删除的文本(dw dd 等命令均可使用)置入到指定位置,根据实际使用测试,置入的位置遵循以下原则:

  1. 如果删除的文本是一个或几个单词(非整行),那么置入位置为光标所在位置的后边;
  2. 如果删除的文本是一整行( dd 命令),那么置入位置为光标所在行的下一行(无论光标在该行的哪一个位置)。

替换类命令

命令 r 的作用是将光标所在位置的字符替换成输入的字符。具体的使用流程如下:

  1. 正常模式下在需要修改的字符处按 r
  2. 此时编辑器切换到输入模式,输入想要更改的字符,光标位置的字符即替换完成。

更改类命令

该命令的核心字符是 c,组合动作可以是 w e $中的任意一个。

  1. cwce 的命令动作比较类似,都是从光标处开始删除该单词后面的部分字符(包括光标位置的字符),并转换到插入模式,然后手动输入想要更改的字符,按 ESC 退回到正常模式,本次命令动作完成。
  2. c$ 命令就是从光标处开始一直删除到本行末尾(包括光标处字符),让后转换到插入模式开始输入。
  3. c 命令也可以组合数字使用,如 2cw 4ce 等。

第四讲

定位

定位命令字符是 g,其中:

  1. 输入 G 会跳转到文本的最后一行;
  2. 输入 gg 会跳转到文本的第一行;
  3. 输入 <number> G 会跳转的指定行。

另外,ctrl-g 命令可以查看光标当前所在行的行数,方便定位。

搜索

向后搜索命令字符是 /,向前搜索命令字符是 ?

/ 命令为例:

  1. 按下 / 键,编辑器由正常模式切换到输入模式;
  2. 输入想要查找的字符串,按下回车,找到需要的文本;
  3. 想要继续向后查找同一个字符串,按下命令字符 n,想要反方向查找统一字符串,按下命令字符 N
  4. 想要回到之前查找到的位置可以使用命令 ctrl-o,该命令可重复多次;
  5. 想要回到较新的位置,可以使用命令 ctrl-i

括号配对

匹配括号的命令是 %,该命令会匹配 () [] {} 所有的括号对,即使多层括号嵌套,也可以正确匹配到配对的括号。只需在一个左括号或右括号上按下 % 即可。

替换

基本的替换操作命令如下所示:

1
:s/old/new/g

其中:

  1. :s 是替换操作的操作命令;
  2. old 是目标字符;
  3. new 是替换字符;
  4. /g 是全部替换命令,这是一个可选项。

注意,该命令仅限光标当前所在行的行内替换,如需多行替换,则如下操作:

1
2
3
4
:#,#s/old/new/g  // 其中 #,# 代表需要进行替换操作的首位两行的行号。

:%s/old/new/g // 该操作会替换文本内的所有目标字符。
:%s/old/new/gc // 该操作会匹配文本内所有目标字符串,并对每个匹配的字符串询问是否替换。

第五讲

在 vim 内执行外部命令

: 命令会将光标移到屏幕最下方,使 vim 进入命令模式; ! 命令允许使用外部命令。

在正常模式下输入 :! 让后紧跟一个外部命令即可执行该命令。

比如:

1
2
:!ls
:!rm <FileName>

这个命令和在终端中执行 ls rm 命令的效果相同。

所有命令都可以用这种方法执行,包括带有参数的命令。

更多的保存文件的信息

使用 :w <FileName> 命令可以将文件保存到一个名为 FileName 的文件中。

可视模式

命令 v 会使 vim 进入可视模式,当进入该模式时,可使用方向命令选中任意多的内容。

命令 V 将进入可视行模式,在该模式中,只可选中整行内容。

可视模式命令可以和其他命令配合完成高效操作。比如用可视模式选中一个文件中的某一段文本,并将这段文本保存到新的文件中,可按如下方式操作:

  1. 按下 v 进入可视模式,选择需要的文本;
  2. 选择完毕后输入 : 命令,屏幕底部会出现 :'<,'>
  3. :'<,'> 后输入 w <NewFileName>,操作完成,新文件中将包含选中的文本。

对于可视模式中选中的字符,按一次 d 命令即可删除。

提取和合并文件

命令 :r <FileName> 可以将名为 FileName 的文件中的字符插入到当前文件中,插入位置就是光标所在位置。

该命令还可以读取外部命令的输出并插入,如 :r !ls

第六讲

打开新的一行并插入

输入命令 o 可以在光标所在行的下一行建立一个新行并切换到插入模式,用于输入新的文字。

命令 O 则是在光标所在行的上一行产生效果。

在光标后插入

输入命令 a 会将编辑器切换的插入模式,文字将被插入到光标之后,和命令 i 的插入位置不同。

稍作延展,命令 A 将在行末插入文字,而命令 I 则是在行首插入文字。

另一个替换类命令

在第三讲中,我们讲解过一个替换命令 r,该命令的大写命令 R 也具有相似的效果,不同的地方在于:

  • 命令 R 在退回到正常模式前会一直处于替换模式,输入的字符将替换光标处的字符,所以该命令用于多字符的替换操作,而 r 命令用于单字符的替换;
  • 命令 R 在替换过程中使用回退健并不会删除字符,而是将该位置的字符会退到替换之前的状态。

复制粘贴

命令 y 用于复制字符,或者换一种说法叫“把字符抽取出来”。该命令有以下几种常见用法:

  1. 与可视模式搭配使用;
  2. w 等命令搭配使用( yw );
  3. 与行首行末操作符搭配使用( y$ )。

命令 p 用于把命令 y 复制出来的字符粘贴到光标所在处。

设置类命令的选项

输入 set:xxx 可以设置 xxx 选项,下面以搜索命令为例展示几个有用的命令。

  • ic: ignorecase,在搜索时忽略字母大小写;
  • is: incsearch,查找短语时显示部分匹配的项;
  • hls: highlightsearch,高亮显示匹配短语。

如果想要关闭某个选项,只需要输入 set:noxxx 即可。

更多的选项类命令未来接触到再详细说明。