在linux系统中,默认都安装了vi,它是最常用的文本编辑器,而且很多软件默认编辑器用的也是vi。
vi的全称是 ——visual interface
vim的全称是——visual interface improved


vim是vi的增强版,vi/vim 文件名,启动该编辑器。

既然有vi,那我们为何还要学vim?

vim应该说是程序编辑器,它不仅拥有vi的功能,它更像一般的IDE一样,根据文件名载入不同的语法高亮等等。因此我们有必要熟练掌握vim,提升在linux系统中工作的效率。

  • 模式

vim有三种模式,命令模式,插入模式和可视模式。

命令模式:vim编辑文件,进入时的初始模式,在这个模式下可以输入各种命令进行操作,如复制、删除等。

插入模式:在命令模式下通过输入插入命令,进入插入模式,可以对文件内容进行编辑。

可视模式:可视化,支持灵活的文本选择,并对选择的文本域做处理。


1. Esc是个很好的按键,在vim中,它和ctrl+c有着相似的功能,可以从其它模式切换回初始的命令模式。
2. 有三种方式进入可视模式——v(逐字)或V(逐行)或ctrl+v(逐块)。
  • 插入

在命令模式下,输入插入指令,便进入的插入模式,插入指令有如下这些。

指令 效果
i 在当前字符左侧插入
I 在当前行首插入
a 在当前字符右侧插入
A 在当前行尾插入
o 在当前行之后插入新的一行
O 在当前行之前插入新的一行

在vim中,很多命令都可以配合数字使用,比如在当前位置后插入3个!,我们在命令模式下输入3a!,这里的Esc是必须的,否则命令不生效。
  • 方位

红色标注,为我自己常用的指令。

指令 效果
h 向左一个字符,相当于键盘左键
j 向下一个字符,相当于键盘下键
k 向上一个字符,相当于键盘上键
l 向右一个字符,相当于键盘右键
w 向右移动一个单词,光标停在单词首部,如行尾则转至下一行
b 向左移动一个单词,光标停在单词首部,如行首则转至上一行
e 向右移动一个单词,光标停在单词尾部,如行尾则转至下一行
ge 向左移动一个单词,光标停在单词尾部,如行首则转至上一行
^ 移动到当前行第一个非空白字符上
0 移动到当前行第一个字符上
$ 移动到当前行的行尾
gg 移动到第一行
G 移动到最后一行
ctrl+e 屏幕向下滚动一行
ctrl+y 屏幕向上滚动一行
ctrl+d 向下滚动半屏
ctrl+u 向上滚动半屏
ctrl+f 向下滚动一屏
ctrl+b 向上滚动一屏
:+n 跳到第n行
[[ 跳到上一个函数
]] 跳到下一个函数

1. 充分利用数字组合,例如3j,向下移动3行。
2. 冒号加数字,跳到指定行数,如果n超过当前文件行数,则跳到行尾。
3. 数字+$,移动到之后数字行的尾部,例如3$,表示以当前行为首,移动到之后的第三行行尾。
  • 查找
指令 效果
/text 查找text,按n健查找下一个,按N健查找上一个
?text 查找text,按n健查找上一个,按N健查找下一个
:set ignorecase 忽略大小写的查找
set noignorecase 不忽略大小写的查找
:set hlsearch 所有搜索结果高亮显示
:set nohlsearch 搜索结果取消高亮显示
:set incsearch 逐步搜索模式,随着输入便实时搜索并展示
:set noincsearch 取消逐步搜索,只有敲回车后才会触发搜索
:set wrapscan 循环搜索,搜索到行尾后,会再次从头搜索
:set nowrapscan 取消循环搜索

1. 在查找时,有一些特殊字符需要加斜线进行转移,如.*[]^%/?~$。
2. 快速查找某个单词,只需要把光标移动到该单词上,按*或#键即可以该单词进行搜索,相当于/和?。
3. 输入冒号:,或者?,或者/之后,都可以通过上下键来选择历史操作。
  • 替换
指令 效果
ra 光标所在字符替换成字符a
:s/old/new/ 将当前行第一个old替换成new
:s/old/new/g 将当前行所有old替换成new
:%s/old/new/ 将所有行第一个old替换成new
:%s/old/new/g 将所有行所有old替换成new
:n1,n2s/old/new/ 将文件第n1行到第n2行的第一个old替换成new
:n1,n2s/old/new/g 将文件第n1行到第n2行的所有old替换成new

替换内容支持正则,比如:10,20s/^/\t/g 表示将文件10到20行,每行开头都加一个指标缩进。
  • 删除
指令 效果
x 删除当前字符
X 删除当前字符的前一个字符
dd 删除当前行
D 删除当前字符到行尾
J 删除两行之间的换行,合并两行

1. x——删除字符。
2. d——删除行。
3. J——删除行之间换行。

到这里,我们要讲一下vim的强大组合了。上面我们已经几个例子,比如:
3a!代表了向后插入三个空格
3$移动到第三行的行尾
等等组合。

这些组合,主要分为两种,一种是数字+指令,一种是指令+指令,使用多了也就记住了,在此给大家列举些组合用例:

指令 效果
dh 删除前一个字符
dj 删除上一行
dk 删除下一行
dl 删除当前字符
ndd 删除当前行开始的连续n行
d$ 删除当前字符到行尾,相当于D
dgg 删除当前行及以上所有行
dG 删除当前行及以下所有行
  • 复制和粘贴

和删除一样,支持与数字、操作的各种组合。

指令 效果
yy 复制当前行
nyy 复制从当前行开始之后的n行
p 粘贴

1. vim的删除和剪切是同一个意思,没有单独的剪切操作,比如dd可以理解为剪切当前行。
2. 粘贴操作p,根据复制内容的不同,而粘贴位置不同。比如复制字符串,则在光标之后粘贴,如复制整行,则在下一行粘贴。
3. 更灵活的操作,需要进入可视模式,在可视模式下操作光标选择所需内容,此时按下yy,即对所选内容进行复制。
4. 多使用组合键,事半功倍,比如ddp交换当前行和其下一行,xp交换当前字符和后面字符。
  • 撤销和还原
指令 效果
u 撤销历史操作
U 撤销本行上一次操作
ctrl+r 还原

1. u可以一直撤销到最开始vim时候的状态。
2. U只能撤销上一次操作,因此连续按两次U,则回到现在状态。
3. ctrl+r相当于u的逆向。
  • 退出和保存
指令 效果
:q 退出
:q! 强制退出,忽略所有更改
:w 保存当前操作
:wq 保存并退出
ZZ 保存并退出
:e! 放弃所有修改,并打开原始文件