一、先搞明白:vi 和 vim 到底是啥?
vi/vim 是 visual interface 的简称,是 Linux 中最经典的文本编辑器。同图形化界面中的文本编辑器一样,vi 是命令行下对文本文件进行编辑的绝佳选择。简单说,vi/vim 就是 Linux 里的'记事本',专门用来编辑文本 —— 比如改系统配置、写脚本。
- vi:Linux 自带的老版本'记事本',功能基础但够用;
- vim:vi 的升级版,多了语法高亮(比如写代码时关键字会变色)、代码补全等功能,现在 Linux 里输
vi命令,其实默认打开的是 vim。
不管用 vi 还是 vim,操作逻辑都一样,下面统一叫'vim'。
二、核心中的核心:vim 的 3 种工作模式
这是学好 vim 的关键!刚开始会觉得绕,但记住'按 Esc 键能回到命令模式',就不会慌了。先看图示理解模式切换关系:
[图示:vim 三种模式切换关系]
1. 命令模式(打开就进,默认模式)
通常图形化编辑器双击即开,但 vim 不一样 —— 打开文件后,默认进入'命令模式',这时按键盘不会输入文字,而是执行命令(比如移动光标、复制粘贴)。所敲的按键编辑器都理解为命令,以命令驱动执行不同的功能。此模式下,不能自由对文本进行编辑。
怎么进命令模式?
终端输入 vim 文件名 就行,比如想编辑一个叫 test.txt 的文件,就输:
vim test.txt
- 如果
test.txt不存在,会新建这个文件; - 如果文件存在,就打开已有的文件。
命令模式必学快捷键(带例子,一看就会)
这些是日常最常用的,记几个高频的就行,不用贪多:
| 功能 | 快捷键 | 例子说明 |
|---|---|---|
| 光标移动(上下左右) | h/j/k/l | 按 j 光标向下动 1 行,比按方向键快 |
| 跳转到文件首行 | gg | 不管光标在哪,按 gg 直接到第一行 |
| 跳转到文件尾行 | G(大写) | 按 G 直接到最后一行 |
| 复制当前行 | yy | 按 yy,当前行内容就被'复制'了 |
| 粘贴复制的内容 | p(小写) | 复制后按 p,内容粘在光标下一行 |
| 删除当前行 | dd | 按 dd,当前行就被'删掉'了 |
| 撤销上一步操作 | u | 删错了?按 u 就能恢复 |
比如你想复制第 3 行,粘到第 5 行下面:
- 按
3G跳转到第 3 行; - 按
yy复制这行; - 按
5G跳转到第 5 行; - 按
p粘贴,内容就到第 6 行了。
2. 输入模式(要写字,先切这个模式)
命令模式不能输入文字,想写字就得切到'输入模式'。
怎么切到输入模式?
在命令模式下按下面这些键,按完后屏幕左下角会出现'INSERT'或'插入'字样,就说明能写字了:
| 快捷键 | 效果 | 什么时候用? |
|---|---|---|
| i | 光标在哪,就从哪开始写 | 想在光标位置补字时 |
| a | 从光标下一个字符开始写 | 想在光标后加字时 |
| o | 在光标所在行下面新建一行写 | 想另起一行写内容时 |
比如你光标在'hello'的'e'上面:
- 按
i,输入'x',会变成'hxello'; - 按
a,输入'x',会变成'hexllo'; - 按
o,会在下面新起一行,直接能写。
怎么退回命令模式?
写完字想执行复制、删除这些命令,得先退回到命令模式——不管在输入模式下按什么,按一下 Esc 键就回去了。
3. 底线命令模式(保存、退出用这个)
想保存文件、退出 vim,就得用'底线命令模式',这个模式是从命令模式切过来的。
怎么切到底线命令模式?
在命令模式下按 :(冒号),这时屏幕左下角会出现一个 :,就可以输命令了。
底线命令模式必学命令(就记这几个,够用)
| 命令 | 效果 | 注意事项 |
|---|---|---|
| :w | 保存文件,但不退出 vim | 写完内容先按 Esc,再输 :w 保存 |
| :q | 退出 vim | 没保存文件时,用这个会报错 |
| :q! | 强制退出,不保存修改 | 写错了不想保存,就用这个 |
| :wq | 保存文件并退出 vim | 最常用的,写完直接保存退出 |
比如你编辑完 test.txt:
- 按 Esc 退到命令模式;
- 按
:,输:wq,按回车,就保存并退出了;如果不想保存,就输:q!,按回车强制退出。
三、新手必避的坑 + 实用小技巧
1. 最容易犯的错:模式搞混
刚学的时候经常会在命令模式下直接写字(按了半天没反应),或者在输入模式下按复制命令(结果全变成乱码)。记住:不管什么时候,操作没反应就先按 Esc 退到命令模式,再重新来。
2. 实用小技巧(能省很多时间)
- 显示行号:在命令模式下输
:set nu,屏幕左边就会显示行号,找内容更方便;想关掉行号就输:set nonu。 - 查找内容:在命令模式下输
/关键词(比如/hello),按回车就能找到文件里所有'hello',按n跳下一个,按N跳上一个。 - 批量删除:比如想删第 5 到第 10 行,在命令模式下按
5G跳第 5 行,再按5dd(5 是行数,dd 是删行),就能删掉 5 行(第 5 到第 10 行)。
四、小试牛刀
跟着做一遍,马上就有感觉了:
- 打开终端,输
vim test.txt(新建并打开 test.txt); - 按
i进入输入模式,输入'我在学 vim 编辑器'; - 按 Esc 退到命令模式,按
:w保存(这时没退出,还能继续写); - 按
o在下面新起一行,输入'跟着练习,不难!'; - 按 Esc 退到命令模式,按
:wq保存并退出; - 输
cat test.txt,就能看到刚才写的内容了。
五、总结:记住这 3 点,vim 就入门了
- 打开 vim 先在命令模式,想写字切输入模式(按 i/a/o),想保存退出切底线命令模式(按:);
- 不管在哪,按 Esc 能回到命令模式,这是'救命键';
- 先记高频命令(比如 yy 复制、dd 删除、:wq 保存退出),用多了自然就熟了。
刚开始可能会忘命令,没关系,建议收藏备用,用到的时候翻一翻,练个两三次就能上手了!
六、命令模式以及底线命令模式扩展
1. vi/vim 命令模式快捷键大全
| 功能分类 | 快捷键 | 功能描述 |
|---|---|---|
| 模式切换与输入 | i | 在光标当前位置进入输入模式 |
| a | 在光标当前位置之后进入输入模式 | |
| I | 在当前行的开头进入输入模式 | |
| A | 在当前行的结尾进入输入模式 | |
| o | 在当前光标下一行进入输入模式 | |
| O | 在当前光标上一行进入输入模式 | |
| r | 替换光标所在位置的单个字符 | |
| R | 进入连续替换模式(按 Esc 退出) | |
| s | 删除光标所在字符并进入输入模式 | |
| cw | 删除当前单词并进入输入模式(修改单词) | |
| cc | 删除当前行并进入输入模式(重写行) | |
| 光标移动 | h / 左箭头 | 向左移动 1 个字符 |
| j / 下箭头 | 向下移动 1 行 | |
| k / 上箭头 | 向上移动 1 行 | |
| l / 右箭头 | 向右移动 1 个字符 | |
| 0(数字零) | 移动光标到当前行的开头 | |
| $ | 移动光标到当前行的结尾 | |
| ^ | 跳转到当前行第一个非空字符 | |
| w | 跳至下一个单词的开头 | |
| W | 跳至下一个单词开头(忽略特殊符号) | |
| b | 跳至上一个单词的开头 | |
| B | 跳至上一个单词开头(忽略特殊符号) | |
| gg | 跳至文件首行 | |
| G(大写) | 跳至文件尾行 | |
| nG(n 为数字) | 跳至文件第 n 行 | |
| H | 跳至当前屏幕顶部行 | |
| M | 跳至当前屏幕中间行 | |
| L | 跳至当前屏幕底部行 | |
| Ctrl+u | 向上翻半屏 | |
| Ctrl+d | 向下翻半屏 | |
| Ctrl+f | 向下翻一整屏 | |
| Ctrl+b | 向上翻一整屏 | |
| PageUp(PgUp) | 向上翻页 | |
| PageDown(PgDn) | 向下翻页 | |
| 文本复制 / 剪切 / 删除 | yy | 复制光标所在行 |
| nyy(n 为数字) | 复制当前行及下方共 n 行 |
2. vi/vim 底线命令模式命令大全
| 功能分类 | 命令 | 功能描述 |
|---|---|---|
| 文件保存与退出 | :w | 保存文件(不退出) |
| :q | 退出 vim(文件未修改时) | |
| :q! | 强制退出,放弃所有修改 | |
| :wq / :x | 保存文件并退出 | |
| ZZ(大写) | 快捷键保存并退出(无需输入冒号) | |
| 显示与设置 | :set nu | 显示行号 |
| :set nonu | 隐藏行号 | |
| :set paste | 开启粘贴模式(解决粘贴乱码) | |
| :set fileencoding=utf-8 | 设置文件编码为 UTF-8 | |
| 查找与替换 | :s / 旧内容 / 新内容 | 替换当前行第一个匹配项 |
| :s / 旧内容 / 新内容 /g | 替换当前行所有匹配项(g = 全局) | |
| :% s / 旧内容 / 新内容 /g | 替换整个文件所有匹配项(%= 全文) | |
| :n1,n2s / 旧内容 / 新内容 /g | 替换第 n1 行到第 n2 行的所有匹配项 | |
| 其他实用命令 | :! 命令 | 执行 Linux 外部命令(不退出 vim),如:!ls |
| :recover | 恢复意外关闭的文件内容 |


