在很多Liunx发行版中的vi编辑器其实也就是vim编辑器,此篇文章所说的vi等价于vim。vi编辑器是 Visual interface 的简称,其共有三种工作模式:
命令模式、
编辑模式、
末行模式。
一、用vi编辑器打开文件
下面三个命令均属于shell终端命令,不是在vi编辑器中的命令。
命令 | 功能 | 说明 |
---|
vi 文件名 | 打开文件,并将光标定位在文件开头 | 如果文件不存在则创建文件 |
vi 文件名 + | 打开文件,并将光标定位在文件末尾 | 如果文件不存在则创建文件 |
vi 文件名 +数字 | 打开文件,并将光标定位在数字指定的行数 | 如果文件不存在则创建文件 |
注:用vi编辑文件且没有保存时,如果遇到意外情况,导致文件编辑异常关闭,在下次打开这个文件时可能会看到 交换文件的提示信息,一般操作是 输入 D 将交换文件删除(或者在shell终端使用 rm 命令将交换文件删除,交换文件名一般为:.文件名.swp),不过删除交换文件后,异常关闭前未保存的文件会丢失
二、3种工作模式
- 命令模式
- 编辑模式
- 末行模式
三种模式之间的切换如图:
![](https://i-blog.csdnimg.cn/blog_migrate/324145b270558ba476bb5f81a78e8d0f.png)
1. 命令模式
1.1 重复命令
命令 | 功能 | 说明 |
---|
. | 重复上次的命令 | 英文符号的点 |
数字+命令 | 将命令重复数字指定的次数 | |
1.2 移动命令
命令 | 功能 | 说明 |
---|
h | 光标向左移动 | 小写,推荐用食指 |
j | 光标向下移动 | 小写,推荐用食指 |
k | 光标向上移动 | 小写,推荐用中指 |
l | 光标向右移动 | 小写,推荐用无名指 |
行内移动 | | |
w | 向后移动一个单词 | 小写,word |
b | 向前移动一个单词 | 小写,back |
0 | 移动到行首 | 数字零 |
^ | 移动到行首 | shift+6,移动到行首第一个非空白字符的位置 |
$ | 移动到行尾 | shift+4 |
行间移动 | | |
gg | 移动到文件第一行 | 小写 |
G | 移动到文件最后一行 | 大写 |
数字+gg | 移动到数字指定的行数 | 或数字+G,或末行模式 -> 数字 -> 回车 |
段落移动 | | |
{ | 移动到上一段落 | vi以空行来区分段落 |
} | 移动到下一段落 | vi以空行来区分段落 |
括号切换 | | |
% | 最近的一对括号之间来回切换 | |
命令 | 功能 | 说明 |
---|
m+字母 | 做标记 | mark,这个字母可以是 a ~ z 或者 A ~ Z 之间的任何一个字母 |
’+字母 | 返回标记 | 英文单引号,例如,要回到已经被标记的x位置,输入 'x 即可 |
被添加标记的行被删除时,该行的标记也会被删除;
如果在其他行添加了相同名称的标记,之前添加的标记也随之删除。
1.3 屏幕滚动
命令 | 功能 | 说明 |
---|
ctrl+b | 向上翻页 | 小写,back |
ctrl+f | 向下翻页 | 小写,forward |
H | 屏幕顶部 | 大写,Head |
M | 屏幕中间 | 大写,Middle |
L | 屏幕底部 | 大写,Low |
1.4 选择文本
选择文本时会进入一种特殊的模式:可视模式(Visual)。
可视模式分为三种:
- 一般可视模式(以字符为单位);
- 可视行模式(以行为单位);
- 可视块模式(以块为单位)。
要进入可视模式同样需要在命令模式输入命令来完成。
命令 | 功能 | 说明 |
---|
v | 一般可视模式 | 小写,从光标位置开始,以字符为单位选择文本 |
V | 可视行模式 | 大写,从光标所在行开始,以行为单位选择文本 |
ctrl+v | 可视块模式 | 小写,从光标位置开始,在垂直方向以块为单位选择文本 |
1.5 撤销&恢复撤销
命令 | 功能 | 说明 |
---|
u | 撤销 | 小写,undo,撤销上一次命令的操作,可以一直撤销 |
ctrl+r | 恢复撤销 | 小写,redo,对已经撤销的操作做恢复 |
1.6 删除&复制&粘贴
- 删除文本的操作,本质上就是剪切操作,可和复制命令一样,使用粘贴命令将文本进行粘贴。
- vi编辑器是将删除和复制的文本放在vi缓冲区中。复制命令会将复制的文本放在缓冲区,删除命令会将删除的文本的放在缓冲区。
- 粘贴命令会将vi缓冲区中的文本粘贴到光标所在位置。
- 文本缓冲区与系统剪切板不是同一个。
命令 | 功能 | 说明 |
---|
删除 | | |
x | 删除字符 | x小写,删除光标所在的字符 |
dd | 删除一行 | 删除光标所在位置的行 |
D | 删除至行尾 | 从光标所在的位置删除至行尾 |
数字+dd | 删除多行 | 例如:7dd,即删除7行(包含光标所在位置的行) |
d+移动命令 | 删除多个字符 | 结合移动命令,删除原位置与目的位置之间的文本 |
选择文本+x | 删除多个字符 | x小写,删除可视模式中被选择的文本 |
选择文本+d | 删除多个字符 | 删除可视模式中被选择的文本 |
复制 | | |
yy | 复制一行 | 复制光标所在位置的行 |
数字+yy | 复制多行 | 例如:7yy,即复制7行(包含光标所在位置的行) |
y+移动命令 | 复制多个字符 | 结合移动命令,复制原位置与目的位置之间的文本 |
粘贴 | | |
p | 粘贴 | paste,将vi缓冲区中的文本粘贴到光标所在位置 |
删除/复制命令中的 “d+移动命令” 举例:
- dw,从光标位置删除/复制到单词末尾
- d0,从光标位置删除/复制到该行的起始位置
- d},从光标位置删除/复制到段落末尾
- d+数字+G,删除/复制光标所在行到指定行之间文本
- d+’+字母,删除/复制光标所在行到指定标记行之间的文本
1.7 缩进
命令 | 功能 | 说明 |
---|
>> | 向右缩进4字符 | 英文的两个大于号 |
<< | 向左缩进4字符 | 英文的两个小于号 |
注:在可视模式下,缩进命令只需要一个 > 或 < 并选中多行即可实现多行同时缩进
1.8 查找&替换
命令 | 功能 | 说明 |
---|
查找 | | |
/+文本内容 | 常规查找 | 查找相应的文本内容,n查找下一个,N查找上一个 |
* | 单词快速向下查找 | 向后查早当前光标所在的单词 |
# | 单词快速向上查找 | 向前查早当前光标所在的单词 |
替换 | | |
r | 替换当前字符 | replace,先输入小写r再输入需要替换的字符 |
R | 替换当前光标后的字符 | 进入替换模式,替换完成后按esc键退出,如同Windows的inster键的功能 |
在开发中,通过单词快速查找,可以快速的看到这个单词还在文本中其他什么位置使用过
- 查找并替换:
不同于上面的查找替换,需要在 末行模式
中执行。
基本格式::%s///gc
命令 | 功能 | 说明 |
---|
%s/旧文本/新文本/g | 全局替换 | 一次性替换文件中出现的所有旧文本 |
s/旧文本/新文本/g | 可视模式替换 | 需要先用可视模式选中要替换的文字区域替换 |
%s/旧文本/新文本/gc | 确认替换 | 推荐使用,替换时会有交互式的询问 |
注:
- 可视模式替换:替换时,末行模式会自动添加 ‘<,’> 的命令,不用理会,在后面接着书写 s/旧文本/新文本/g 即可。
- 确认替换的命令:
y(yes)-- 替换
n(no)-- 不替换
a(all)-- 全部替换
q(quit)-- 取消替换
l(last)-- 最后一次替换,替换当前这个后会取消替换
ctrl+E 向下滚屏
ctrl+Y 向上滚屏
2. 编辑模式
2.1 插入命令
命令 | 功能 | 说明 |
---|
i | 在光标前插入 | i小写,insert,常用 |
I | 在当前行的行首插入 | I大写,insert,一般常用 |
a | 在光标后插入 | a小写,append,常用 |
A | 在当前行的行尾插入 | A大写,append,一般常用 |
o | 在当前行后插入空行 | o小写,常用 |
O | 在当前行前插入空行 | O大写,常用 |
2.2 插入命令与重复命令联用
重复命令见本篇文章的 1.1 重复命令。
(1) 在命令模式输入 10
(2) 输入 i 进入编辑模式
(3) 输入 * 也就是需要重复的文字
(4) 按下esc返回命令模式
- 返回命令模式后,vi会将 (2)(3) 再重复执行9次,共插入了10个次文本
- 再按下.(点)即可重复上述(1)(2)(3)(4)再插入10次文本
注:正常开发操作时,需谨慎使用,尽量不用,因为操作不当会导致编辑的内容重复多次,用 u 撤销会将编辑的内容全部撤销
2.3 插入命令与可视化块联用
可视化块见本篇文章的 1.4 移动文本->可视化块。
可以利用可视化块
给多行代码添加注释:
(1)将光标定位到要添加注释的第1行代码,并使用 ^ 将光标移动到行首
(2)按 ctrl+v 进入到可视化块模式
(3)使用j向下移动光标至要添加注释的最后一行,进行内容选中
(4)输入I(大写)进入编辑模式,并在行首进行文本插入
(5)编辑插入 #(也就是python中的注释符号)
(6)按下esc返回命令模式,返回之后 vi 会在(3)选中的内容前都插入 #
3. 末行模式
3.1 保存&退出
命令 | 功能 | 说明 |
---|
保存 | | |
w | 保存文件 | w小写,write,保存当前文件 |
w+空格+文件名/目录 | 文件另存为 | w小写,write,将当前文件另存为 |
退出 | | |
q | 退出vi | quit,如果没有保存不可以退出 |
q! | 强制退出vi | quit,不保存退出,未保存的内容将会丢失 |
保存并退出 | | |
wq | 保存文件并退出vi | write&quit |
x | 保存文件并退出vi | x小写,和 wq 命令作用相同 |
3.2 新建文件&切换文件
命令 | 功能 | 说明 |
---|
n+空格+文件名/目录 | 新建文件 | new |
e+空格+文件名/目录 | 切换为其他文件 | edit |
注:这两个命令执行前必须保证当前文件已经被保存
3.3 查找并替换
见本篇文章的 1.8 查找&替换->查找并替换。
3.4 取消高亮
命令 | 功能 | 说明 |
---|
:noh | 取消高亮 | 可以取消文本查找等对文本产生的高亮 |
3.5 分屏操作
命令 | 功能 | 说明 |
---|
增加分屏 | | |
sp+空格+文件名/目录 | 横向增加分屏 | split |
vsp+空格+文件名/目录 | 纵向增加分屏 | vertical split |
分屏操作 | | |
ctrl+w+w | 切换到下一个窗口 | w均小写,window |
ctrl+w+r | 将两个窗口互换位置 | w&r小写,reverse |
ctrl+w+c | 关闭当前窗口 | w&c小写,close,但不能关闭最后一个窗口 |
ctrl+w+q | 退出当前窗口 | w&q小写,quit,如果是最后一个窗口则关闭vi |
ctrl+w+o | 关闭其他窗口 | w&o小写,other |