VIM基本操作,掌握这些就够了

1 引言

VIM是unxi或类unix操作系统必备的一款文本编辑器(当然目前也有windows版本GVim),其基本功能还是用来浏览编辑文本文件的。本文也是阐述文件的编辑保存功能,其他的一些高级功能请另行查阅相关文档。

  1. 编辑文件前确定键盘大写锁定未开启。先看一个实例:
  2. 打开文件 test.txt,并将第一行删除:
  3. vim test.txt --> gg --> dd --> shift + : --> wq
  4. vim test.txt : VIM 打开文件 test.txt,如果文件不存在就是新建
  5. gg : 跳转到第一行
  6. dd : 删除当前光标所在行
  7. shift + : : 同时按下键盘 shift 键和:(L 旁边的冒号分号键),进入命令模式
  8. wq : 在上一步执行后的光标出,输入 wq,保存文件并退出
  9. 关于保存文件的一点说明:
  10. w : 英文 write 的缩写,即写入更新文件,也叫保存文件
  11. q : 英文 quit 的缩写,退出当前文件编辑
  12. w filename : 保存到文件 filename
  13. q! : 放弃更改,强制退出

VIM的熟练使用,可以解放鼠标及光标,双手一直在键盘字母输入区域,可以大大提高输入效率。另外由于VIM的操作涉及各个字符按键,多用VIM也可以提高对键盘操作熟练度。

2 操作模式

VIM的灵魂在于它的操作模式,不同模式间切换,能够极大的丰富按键功能。VIM的操作模式有正常模式、插入模式、命令模式,以上三种是最基本必用的,还有一种可视模式,主要用于块操作,可用要不用,但对程序员来说其列编辑模式还是十分有用的。

正常模式(normal-mode)

在其他模式下,按下Esc按键(一次不行多按几次)就能回到正常模式。
正常模式,各种按键就相当于是一个功能键,代表的是某个功能。
正常模式也是最主要的一种模式,也是用的最多的,通常切换到其他模式下,都要先切换到正常模式,即其他模式间是不支持相互切换的。

插入模式(insert-mode)

插入模式,就是普通文本输入模式。
从正常模式进入到插入模式有多种方式,以下列举出一些常用的:

i            : 在光标前插入
I            : 在行首插入
a            : 在光标后插入
A            : 在行尾新增输入(**大写字母,未开启大写锁定,可以shift+字母,**)
o            : 在光标下方新增一行,进行输入
O            : 在光标上方新增一行,进行输入
s            : 删除光标所在字符,后进行插入
S            : 删除光标所在行,后进行输入

命令模式(command-mode)

命令模式下,可以执行各种命令,如w保存文件命令,还有诸如查找、替换、配置VIM选项等命令。
正常模式下,输入:(shift+冒号分号键)可进入到命令模式,在屏幕出现:命令行,可输入功能命令。

可视模式(visual-mode)

可视模式,主要是用来高亮选中一大段块内容,正常模式只能移动光标,但不能选中一段内容。选中一段数据后,可以用于复制、保存、删除等操作(此处的保存相当于实现部分保存功能,选中某部分内容,另存为文件)。
可视模式有三种常见的模式,在可视模式下,即可相互切换:

v         : 普通可视,移动光标可以选中一段数据
V         : 可视行,移动光标*以行为单位*选中一段数据
ctrl + v  : 可视列,移动光标*以列为单位*选中一段数据,可进行可视列编辑

3 基本操作

文件的打开,保存在引言部分已有说明,在此不再复述。
本章节操作无特别说明都是在正常模式下使用,其他模式下会特意说明。

光标移动

  1. 基本移动

    h j k l 分别相当于光标 ←↓↑→,hjkl用于移动光标用得是最基本也是最多的。
  2. 其他的光标移动

    | 按键 | 功能说明 | 备注 | | —- | —- | —- | | 0 | 行首 | 按下按键0,光标会移动到所在行的行首 | | $ | 行尾 | | | b | 单词起始 | b是begin首字母 | | e | 单词结尾 | e是end首字母 | | w | 下一个单词 | w是word首字母 | | + | 下一行行头 | 行头表行第一个非空字符 | | - | 上一行行头 | |

光标移动的操作是其他一切操作的基础。

输入内容

切换到插入模式,即可输入文本内容,见第2节操作模式部分。

剪切、更改、复制、粘贴

  1. 剪切

    | 按键 | 功能说明 | 备注 | | —- | —- | —- | | x | 剪切字符 | 将光标所在字符剪切 | | dd | 剪切整行 | | | D | 剪切到行尾 | | | dw | 从光标处剪切到下个单词起始位置 | d是一个组合功能按键,单独按没有意义 | | db | 从光标处剪切到所在单词起始位置 | | | de | 从光标处剪切到所在单词结束位置 | | | d0 | 剪切到行首 | 行头表行第一个非空字符 | | d$ | 剪切到行尾 | 与D效果一致,比D要多按个键 | | d… | | d还可以接其他的光标移动操作按键,此处不再一一列举 |

关于剪切组合功能d, d是delete的首字母,其与光标移动的操作配合,能实现灵活的剪切操作功能,所有的光标移动操作都能与d组合使用。另外还可配合重复操作(下文有介绍),可快速实现多项的剪切,如5dd,表示删除5行。剪切的数据存在于vim的缓冲区。

  1. 更改

    | 按键 | 功能说明 | 备注 | | —- | —- | —- | | cc | 更改整行 | 先剪切整行,进入插入模式,进行输入 | | C | 更改至行尾 | 先剪切至行尾,进入插入模式,进行输入 | | cw | 更改到下个单词起始位置 | c是一个组合功能按键,与d用法相似 | | c… | | c还可以接其他的光标移动操作按键,此处不再一一列举 |

其实更改d功能与剪切c功能相比,就是多了个进入插入模式功能。cw与dwi是一样的效果。 c是单词change的首字母。

  1. 复制

    | 按键 | 功能说明 | 备注 | | —- | —- | —- | | yy | 复制整行 | 将光标所在行复制下来,复制到行尾只能用y$ | | Y | 同上 | 同上 | | yw | 复制到下个单词起始位置 | y也是一个组合功能按键,与d用法相同 | | y… | | y还可以接其他的光标移动操作按键,此处不再一一列举 |

y组合按键的的用法,同剪切d的用法,与光标移动按键及重复操作配合,灵活实现复制操作。y用于复制,是单词yank的首字母,之所以不用copy的首字母c, 是因为c同时也是change的首字母,用于更改。复制的数据也是存在于vim的缓冲区。

  1. 粘贴

    p : 字母p,是用于正常模式下的粘贴,粘贴来自vim缓冲区的内容,包括剪切、更改去除、复制的内容。p是paste的首字母p
    如果要粘贴外部复制的数据,如在vim外的crtl+c复制来的数据,那么切换到插入模式下,使用shift+Insert组合按键来实现粘贴,vim内部是不支持crtl+c、ctrl+v。

小结:剪切(d)、更改(c)、复制(y)都是可以配合光标移动按键使用,用法相同,需要熟练掌握。

查找、替换

  1. 查找

    vim的查找支持基本的正则表达式查找。
    | 按键 | 功能说明 | 备注 | | —- | —- | —- | | /[pattern] | 向下查找模式[pattren],按下Enter键开开始查找 | /a 表示向下查找字母a; /[1-9] 表示向下查找1-9的任意一位数字 | | ?[pattern] | 向上查找模式[pattren] | | | n | 顺方向查找下一处 | n是next的首字母 | | N | 反方向查找下一处 | | | % | 括号匹配 | 显示匹配的括号,程序编写检查括号常用 |

有些字符有特殊功能使用,需要转义字符/转义,如查找/, 要用“/\/”。下方的替换操作也是如此。
/及?查找,最后需要按下Enter键才开始执行动作。

tips:
查找单词全词匹配: /\ 查找单词plus。
其中\是转义字符,<表示单词开头,>表示单词结尾。
查找时忽略大小写:/plus\c 结尾使用\c表示忽略大小写。
如果要默认忽略大小写,需要通过设置命令,下文会加以介绍。

  1. 替换

    s替换操作要切换到命令模式,在命令行上输入,支持正则表达式模式操作
    | 按键 | 功能说明 | 备注 | | —- | —- | —- | | r+单字符 | 单字符替换,将光标所在字符替换为r后的字符 | 正常模式下使用,r是replace首字母 | | R | 连续替换多个字符 | 正常模式下使用 | | s/old/new | 将所在行匹配到的第一个old替换成new | | | s/old/new/g | 将所在行匹配到的所有old替换成new | g是global的首字母 | | s/old/new/c | 将所在行匹配到的所有old替换成new,但替换前会提示确定 | c是confirm的首字母 | | %s/old/new/gc | 将整个文件匹配到的old替换成new | | | #,#s/old/new/gc | 是一个数字表行数,将两个数字之间的行中的old替换成new | 10,20s/old/new/g 表示将10到20行中的old替换成new |

s替换操作,也是最后要按下Enter键才开始执行

重复及撤销类操作

  1. 重复操作

    重复操作在前面已有提及,5dd表示删除5行。
    重复操作就是在动作前面加个一个数字,表示用于连续执行动作次数。
    5j 向下移动五行;
    5dd 删除5行;
    5yy 复制5行。
  2. 撤销类操作

    撤销类的操作,是针对文件修改的撤销,未修改操作如光标移动,没有撤销说法,即光标移动后,再撤销按键,是无法回到上次光标位置。
    | 按键 | 功能说明 | 备注 | | —- | —- | —- | | u | 撤销上一次的修改操作 | | | ctrl+r | 恢复撤销 | r是recover的首字母;如果误操作撤销,可按ctrl+r恢复 | | U | 撤销或者恢复整行的修改 | 按下U,撤销整行的修改,撤销后再按一次U是恢复整行的修改 |

  3. 文件定位及状态

    本节主要介绍文件的定位操作(包括跳转,翻页等功能),以及查看文件状态。

按键 功能说明 备注
ctrl+g 在屏幕下方显示当前文件状态
gg 跳转到文件开头
G 跳转到文件末尾
数字+G 跳转指定数字行
数字+gg 同上
ctrl+f 前滚一屏,也即下一页
ctrl+b 后滚一屏,也即上一页

命令模式操作

本节介绍下命令模式下的一些常用命令操作,顾名思义,首先得按:进入到命令模式下。

按键 功能说明 备注
set xxx 设置类命令,设置xxx选项,支持简写为se
w FILENAME 以文件名FILENAME保存文件,相当于另存为 w 保存当前文件
r FILENAME 提取文件FILENAME内容插入到当前光标处
r ![shell cmd] 执行shell cmd提取其标准输出内容,插入到当前光标处 如r !ls表示在外部shell下执行ls命令并将其输出内容,插入到当前光标处
!shell cmd 在外部shell中执行shell cmd

关于设置类常用命令:

按键 功能说明 备注
se nu 在每一行前显示出行号 se是set的简写,number的简写
se nonu 取消设置行号,即不显示出行号 取消设置某一命令,都是在相应命令前加上no组成取消命令,nonu就是nonumber的简写
se ic 设置查找时忽略大小写 ic是igorecase的简写
se hls 将查找到的字符串高亮显示 hls是hlsearch的简写
se is 在输入查找内容时,就实时显示出第一个找到的内容 is是incsearch的简写
help cmd 获取命令帮助 如:help set、help incsearch

列块操作,不常用(notepad++支持,程序员用的多)

1、保存部分内容
 shift+v --> 移动光标选中若干行 --> : w FILENAME

2、列编辑插入

crtl+v --> 移动光标选中若干列 --> shift+i 列插入--> 输入文本 --> 连按两次 Esc 键 --> 选中的列前都有输入文本

crtl+v --> 移动光标选中若干列 --> d --> 删除选中列

例:
//a[0].no = 1;
//a[0].name = "XiaoMing";
//a[0].grade = 1;
//a[0].class = 2;
将每行前的//删除,且将 a[0]中的 0 改成 1

按如下操作:
光标移动到第一行行首处 --> crtl+v --> 按 j 跟 l 选中所有的// --> d --> 光标移动到第一行的 0 上 --> 移动 j 选中所有的 0 --> 输入 r1,将所有 0 替换成 1 --> 结束

tips:
I : 列编辑下,在光标处插入
A : 列编辑下,在光标后插入

小结

掌握以上基本操作,相信就可以实现大部分的文件编辑功能。当然VIM的功能按键多如牛毛,往往在正常模式误按到某个键而调用了其相应功能,只要使用撤销操作,以及Esc键,回到正常模式下。