Skip to content

[L1] Vim 常用操作——模式切换、搜索替换、保存退出

一句话结论

Vim 有四种主要模式,Normal 模式是核心,掌握 hjkl/搜索替换/wq 即可应对日常运维。

体系讲解

模式切换

Normal(默认)
  ↓ i / a / o / I / A / O   进入 Insert(插入)模式
  ↑ Esc                      返回 Normal
Normal
  ↓ v / V / Ctrl-v            进入 Visual(可视)模式
  ↑ Esc
Normal
  ↓ :                         进入 Command-line 模式
  ↑ Enter / Esc
按键进入插入模式的位置
i光标前
a光标后
o当前行下方新建一行
I行首
A行尾
O当前行上方新建一行

移动与编辑(Normal 模式)

按键功能
h j k l左下上右
gg / G跳到文件首/尾
0 / $行首/行尾
w / b向前/后移动一个词
dd删除当前行
yy复制当前行
p粘贴到光标后
u撤销
Ctrl-r重做

搜索与替换

vim
/pattern      向下搜索,n 下一个,N 上一个
?pattern      向上搜索
:%s/old/new/g      全文替换
:%s/old/new/gc     全文替换,每处询问确认
:5,10s/old/new/g   第 510 行替换

保存与退出(Command-line 模式)

命令含义
:w保存
:q退出(文件未修改时)
:wq:x保存并退出
:q!强制退出,丢弃修改
:w !sudo tee %以 sudo 权限保存只读文件

考察意图

服务器上常只有 Vim 可用,考察候选人能否在无 GUI 环境下完成配置修改、日志查看等基础运维操作,以及不被"怎么退出 Vim"卡住。

追问链

  1. 编辑 /etc/nginx/nginx.conf 时忘记用 sudo 打开,修改后无法保存怎么办? 在 Normal 模式执行 :w !sudo tee %,将当前缓冲区内容通过 sudo tee 写回文件,然后 :q! 退出。

  2. 如何快速跳到某一行?(比如日志定位):123 跳到第 123 行;或在 Normal 模式输入行号再按 G123G;用 Ctrl-g 可查看当前行号和总行数。

  3. 在 Vim 中如何批量注释多行代码? 进入 Ctrl-v 列可视模式,选中目标行的第一列,按 I(大写 i)输入注释符(如 #),再按 Esc;Vim 会将注释符插入到每一选中行的行首。

  4. :wq:x 有什么区别?:x(等价于 :exit)只在文件有修改时才写入磁盘,未修改则不更新 mtime;:wq 无论是否修改都强制写入,会改变 mtime,可能触发不必要的 inotify 事件。

易错点

  • 卡在 Insert 模式无法执行命令:必须先按 Esc 返回 Normal 模式,才能输入 :wq 等命令;紧急退出可连按两次 Esc:q!
  • 搜索后 n 方向与预期相反:用 / 搜索时 n 向下,用 ? 搜索时 n 向上;混淆后可按 N(大写)反向遍历。
  • :%s 替换含特殊字符时需转义:替换含 /*^ 等字符时要加 \,或换分隔符::%s|/old/path|/new/path|g

代码示例

bash
# 用 Vim 打开文件并直接跳到第 50 行
vim +50 /var/log/php-fpm/error.log

# 打开文件并直接执行全文替换(非交互式,常用于脚本)
vim -c ':%s/debug/info/g' -c ':wq' config.php

# 以只读模式打开(防误操作)
vim -R /etc/php/7.4/fpm/php.ini

# 打开多个文件,用 :n / :N 切换
vim file1.php file2.php

基于 Apache License 2.0 开源