Vim 是基于 Vi 发展而来的文本编辑器,用于在终端中查看和修改配置、脚本及文本。编辑时改变的是内存中的缓冲区,保存后才写入磁盘。系统中的 vi 不一定是完整功能的 Vim,本文以常规 Vim 为例。
模式与基本流程
| 模式 | 进入方式 | 用途 |
|---|---|---|
| 普通模式 Normal | 默认启动状态,其他模式按 Esc 返回 | 移动、复制、删除 |
| 插入模式 Insert | i、a、o 等 | 输入文字 |
| 可视模式 Visual | v、V、Ctrl+V | 选择字符、整行或矩形区域 |
| 命令行模式 | :、/、? | 执行命令或搜索,回车确认 |
打开、修改与保存
在可写的练习目录运行 vim app.conf。文件不存在时会建立新缓冲区,保存才创建文件。
- 按 i,输入
port=8080。 - 按 Esc,输入
:w并回车,检查底部是否提示写入成功。 - 输入
:q退出,再用cat app.conf核对落盘内容。
| 命令 | 含义 |
|---|---|
:w | 保存当前缓冲区 |
:q | 关闭当前窗口,未保存修改可能阻止退出 |
:wq | 保存并关闭窗口 |
:x 或普通模式 ZZ | 有修改时保存,然后关闭窗口 |
:q! | 强制关闭窗口;单窗口常见场景中会放弃未保存修改 |
:w copy.conf | 写入另一个文件,默认不切换当前文件名 |
强制操作的边界
:w!不能绕过系统权限;:q!可能丢失修改。保存配置后仍需执行所属程序的配置检查,不能将编辑器写入成功视为服务已生效。
移动与输入
定位文本
| 按键 | 作用 |
|---|---|
| h j k l | 左、下、上、右 |
| 0 / ^ / $ | 行首 / 第一个非空白字符 / 行尾 |
| w / b / e | 下一个词首 / 向后词首 / 词尾 |
| gg / G | 第一行 / 最后一行 |
| 42G 或 :42 | 第 42 行 |
| Ctrl+f / Ctrl+b | 向下 / 向上翻页 |
| % | 在匹配的括号等结构间跳转 |
小写 w 按 Vim 的 word 规则移动,标点可能形成边界;大写 W 主要按空白分隔的 WORD 移动。
插入位置
| 按键 | 位置 |
|---|---|
| i / a | 光标前 / 后 |
| I / A | 当前行第一个非空白字符前 / 行末 |
| o / O | 在当前行下方 / 上方新建一行 |
I 不一定到物理行首;配置文件有缩进时,要区分 I 与 0i。
复制、删除与修改
操作符与范围
常用组合为“次数 + 操作符 + 移动或文本对象”。d 删除,y 复制,c 删除后进入插入模式。
| 操作 | 结果 |
|---|---|
| yy / 3yy | 复制当前行 / 从当前行起复制三行 |
| dd / 3dd | 删除当前行 / 从当前行起删除三行 |
| dw | 删除光标到下一个词边界的范围 |
| ciw | 修改当前词内部 |
| ci” / ci( | 修改引号 / 括号内文本 |
| d$ | 删除到行尾 |
| p / P | 放在光标后 / 前;整行内容则放在当前行下 / 上 |
cw 在非空白字符上通常按 ce 的方式修改到词尾,不宜简单理解为 dw 后进入插入模式。替换完整单词可使用 ciw。
复制和删除的内容通常进入寄存器,后续删除可能覆盖先前复制的内容。需要保留时用 "ayy 复制到寄存器 a,再用 "ap 粘贴。3p 是重复粘贴三次,实际行数由寄存器内容决定。
可视选择与剪贴板
v 选择字符,V 选择整行,Ctrl+V 选择矩形列。移动光标扩大选区,再用 y、d、c 操作。范围不明确时先用可视模式确认。
系统剪贴板与 Vim 寄存器不同。支持剪贴板的 Vim 可用 "+y、"+p;可用性取决于编译功能和图形环境,SSH 远程 Vim 不会自动获得本地剪贴板访问能力。
撤销与重复
普通模式下 u 撤销,Ctrl+R 重做,句点 . 重复上一次可重复的修改。批量操作后先查看结果,发现错误先撤销,再调整范围。句点并不是重复最近任意按键。
搜索与替换
搜索
输入 /error 后回车向前搜索,?error 向后搜索。n 沿最近搜索方向继续,N 沿相反方向继续,并不固定表示向下和向上。
搜索采用 Vim 正则表达式。查找字面文本可用 /\Vexample.com 降低特殊字符解释程度,但仍须注意反斜杠。
:set number:set hlsearch:set incsearch:nohlsearch前三项分别显示行号、高亮匹配和输入时预览搜索;最后一项暂时清除高亮,不删除搜索模式。
替换范围
:%s/old_name/new_name/gc百分号代表全文,s 表示替换,g 表示每行全部匹配,c 表示逐个确认。省略 g 时默认每行只替换首个匹配。替换端的 & 表示整个匹配,不能总当作普通字符。
| 示例 | 范围 |
|---|---|
:s/old/new/gc | 当前行 |
:10,20s/old/new/gc | 第 10 到 20 行 |
:%s/old/new/gc | 全文 |
:'<,'>s/old/new/gc | 可视选区涉及的行,不自动限于所选字符列 |
替换后搜索旧值和新值,并核对上下文再保存。相同配置项可能出现在注释和多个服务块中,匹配数量不能单独证明修改正确。
多文件与常用设置
缓冲区、窗口和标签页
缓冲区保存内容,窗口展示缓冲区,标签页组织一组窗口;三者不是同一对象。
| 命令 | 用途 |
|---|---|
:e app.conf | 打开文件 |
:ls / :b 2 | 列出缓冲区 / 切换到编号 2 |
:split other.conf | 上下分割窗口 |
:vsplit other.conf | 左右分割窗口 |
| Ctrl+w w | 切换窗口 |
比较文件可用 vim -d app.conf app.conf.bak。不要为了切换文件而使用 :e!,它会丢弃当前缓冲区的修改。
最小配置
先在当前会话尝试设置,确认合适后再写入 ~/.vimrc。
syntax onset numberset incsearchset hlsearchset expandtabset shiftwidth=4set softtabstop=4缩进应服从文件格式。例如 Makefile 的命令行通常需要真实制表符,不能盲目转换为空格。用 :verbose set shiftwidth? 可以查看设置及来源。
配置修改与异常处理
操作闭环
- 确认文件路径和权限,保留原件。
- 使用 Vim 编辑;需要提权时,可在已配置 sudo 权限的环境使用
sudoedit /path/to/app.conf。 - 保存并比较修改前后的差异,检查是否误改注释或其他配置块。
- 使用应用的配置检查命令,通过后按应用要求重载。
- 检查服务状态和实际行为,异常时按保留的原件恢复。
Vim 不能判断端口冲突、配置依赖和重载结果,这些检查需要由应用完成。
常见问题
| 现象 | 检查与处理 |
|---|---|
| 输入文字变成命令 | 当前是普通模式,按 i 进入插入模式 |
| 无法写入 | 检查路径、文件及目录权限、只读挂载和空间;必要时先另存 |
| 提示交换文件已存在 | 先确认有无另一编辑会话,不直接删除交换文件 |
| 异常退出需恢复 | 用 vim -r app.conf 恢复,另存后与磁盘文件比较 |
| 粘贴缩进错乱 | 检查终端括号粘贴支持;旧环境可临时 set paste,完成后 set nopaste |
| 出现 ^M 或乱码 | 查看 fileformat、fileencoding,确认源格式后再转换 |
恢复并核对之前,不覆盖原文件,不清除唯一的恢复材料。交换文件不保证包含所有未保存内容。