很多新手刚连上 Linux 服务器,打开配置文件时会被 vi 搞懵:进去之后不知道怎么移动光标、怎么打字、保存退出,甚至经常卡住不知道怎么退出。vi 是 Linux 自带的老牌文本编辑器,几乎所有发行版都默认内置,就算没有安装 vim 也可以直接使用,掌握它是运维、后端开发的必备基础技能。
提示:vi 和 vim 用法大体一致,vim 是 vi 的增强版本,下面的操作在两者中通用。
vi 的三种模式(重中之重)
vi 最核心的概念就是模式,不同模式下按键作用完全不一样,很多人混乱就是分不清模式:
- 普通模式(命令模式)
打开文件默认进入这个模式。这个模式下不能直接输入文字 ,所有按键都是命令,用来移动光标、复制、删除、跳转。
从其他模式回到普通模式:按下Esc键。 - 插入模式(编辑模式)
用来输入、修改文本。在普通模式按下i/a/o等按键进入。 - 末行模式(ex 模式)
在普通模式输入冒号:进入,在底部输入命令,用来保存、退出、查找、替换、设置行号。
模式切换流程:
普通模式 → i/a/o → 插入模式
插入模式 → Esc → 普通模式
普通模式 → : → 末行模式
一、打开文件
bash
vi test.txt
- 如果
test.txt存在:直接打开文件 - 如果不存在:新建文件,只有执行保存之后文件才会真正创建
二、普通模式:光标移动(日常高频)
先确认在普通模式,不确定就按一下 Esc。
基础移动
h 向左一个字符
j 向下一行
k 向上一行
l 向右一个字符
补充:部分老终端环境方向键会失效,优先记住 hjkl;新环境方向键 ←↓↑→ 也可以使用。
支持数字前缀:
10j向下跳 10 行,5h向左移动5个字符。
行内快速跳转
0 跳到本行开头(数字0)
^ 跳到本行第一个非空白字符
$ 跳到本行末尾
按单词跳转
w 下一个单词开头
b 上一个单词开头
e 当前单词末尾
W/B 大写,仅以空格分隔单词,忽略标点符号
翻页
Ctrl + f 向下翻一页
Ctrl + b 向上翻一页
Ctrl + d 向下翻半页
Ctrl + u 向上翻半页
文件快速跳转
G 跳到文件最后一行
10G 跳到第10行
1G 跳到文件第一行
屏幕内跳转
H 屏幕最上方一行
M 屏幕中间一行
L 屏幕最下方一行
三、普通模式:进入编辑(插入模式)
在普通模式按下下面任意一个按键,即可开始编辑文本:
i 在光标**前面**插入
a 在光标**后面**插入
I 在本行开头插入
A 在本行末尾插入
o 在光标**下一行**新开一行插入
O 在光标**上一行**新开一行插入
进入插入模式后,左下角一般会出现 -- INSERT -- 标识,这时就可以正常打字修改内容。修改完成,按 Esc 返回普通模式。
四、普通模式:删除、复制、粘贴
x 删除光标所在单个字符
dd 删除光标所在整行
5dd 从当前行开始,删除5行
yy 复制当前整行
3yy 复制3行
p 在光标下一行粘贴
P 在光标上一行粘贴
dw 删除光标位置到当前单词结尾
u 撤销上一步操作
五、末行模式:保存、退出、查找替换
普通模式输入 :,左下角出现冒号,进入末行模式,输入命令回车执行。
保存与退出(最常用)
:w 保存文件,不退出
:wq 保存并退出
:q 退出,文件没有修改时才能用
:q! 强制退出,放弃本次所有修改
:w! 强制保存(只读文件,需要权限)
显示行号,排查配置文件
:set nu 显示行号
:set nonu 关闭行号
查找内容
普通模式直接输入 /关键词,回车向下搜索;?关键词 向上搜索
/nginx 向下搜索 nginx
n 查找下一个匹配项
N 查找上一个匹配项
批量替换
格式::[范围]s/旧内容/新内容/g
:s/abc/123/g 当前行,把 abc 全部替换成 123
:%s/abc/123/g 整个文件全局替换
:%s/abc/123/gc 全局替换,每次替换前询问确认
%代表全文;g代表一行内全部匹配,不加g只会替换每行第一个。
六、新手踩坑清单
- 进去随便打字乱码、没反应:大概率停留在普通模式,没有按 i/a 进入插入模式
- 改完不知道怎么保存:先 Esc,然后
:wq - 提示 E37: No write since last change:文件改动了,不能直接 :q,要么:wq保存,要么:q!放弃修改
- 按错一堆字符:普通模式按
u撤销;多次撤销可以连续按 u - 配置文件修改建议:改之前先备份,
cp nginx.conf nginx.conf.bak,改错方便回滚
小结
vi 的学习曲线比较陡,核心就是适应模式的概念。日常服务器运维场景,优先掌握:打开文件、hjkl移动、i编辑、Esc退出编辑、:wq保存退出、:q!强制退出、行号显示、关键词查找,这几个命令就可以应对绝大多数配置修改场景。熟练之后再慢慢学习复制粘贴、批量替换等高级用法。