- vi是Linux中的文本编辑器
- 设计的核心思想是:让程序员的手指始终在键盘的核心区域,就能完成所有的编辑操作。
基础操作
新建/打开
- 打开/新建文件,vi 在后面跟上文件名:
- 如果文件已经存在,会直接打开该文件
- 如果文件不存在,会新建一个文件
vi test.c
打开定位到某行
- 到打开一个文件,并定位到指定行:
vi 文件名 + 行数- 如果只带上+ 而不指定行号,会直接定位到文件末尾
文件异常处理
- 如果vi异常退出(比如没保存就关闭了终端窗口),磁盘上可能会保存有交换文件
- 下次再使用vi编辑文件时,会看到提醒信息,按下字母d删除交换文件即可
vi三种模式

命令行模式
- 打开文件首先进入命令行模式
- 可以通过命令,可以进行复制、粘贴、删除、定位等操作
插入模式
- 也叫编辑模式,可以正常的编辑文字
底行模式
- 光标位于屏幕的底行
- 底行模式可以输入命令,进行文件的保存、查找、替换等
- 要退出vi,返回到控制台,也是在底行模式下输入退出命令
- 底行模式是vi的出口
常用命令
:q:(Quit)退出没有修改的文件(若文件被修改了而没有保存,则此命令无效):q!:强制退出,且不保存修改过的部分:w:(Write)保存文件,但不退出:x:(Exit)保存文件并退出 wq等价命令:w File:另存为File给出的文件名,不退出:r File:(Read)读入File指定的文件内容插入到光标位置a``a:(Append)进入编辑状态,从当前光标之后的位置开始插入键盘输入的字符i``I:(Insert)进入编辑状态,从当前光标之后的位置开始插入键盘输入的字符o``O:(Open)进入编辑状态,并插入一新行,光标移到该新行的行首,以后键盘输入的字符将插入到光标位置ESC:进入命令状态:! Command:在vi中执行外部命令Command,按回车键可以返回vi继续工作
光标命令
移动光标
| 命令 | 功能 | 手指 |
|---|---|---|
| h | 向左 | 食指 |
| j | 向下 | 食指 |
| k | 向上 | 中指 |
| l | 向右 | 无名指 |
行内移动
| 命令 | 功能 |
|---|---|
| w | 向后移动一个单词 |
| b | 向前移动一个单词 |
| 0 | 行首 |
| ^ | 行首,第一个不是空白字符的位置 |
| $ | 行尾 |
行数移动
| 命令 | 功能 |
|---|---|
| gg | 文件顶部(go) |
| G | 文件末尾 |
| 数字gg | 移动到数字对应行数 |
| 数字G | 移动到数字对应行数 |
| :set nu | 设置显示行号 |
| :set nonu | 取消显示行号 |
屏幕移动(浏览代码)
| 命令 | 功能 |
|---|---|
| ctrl + b | 向上翻页 |
| ctrl + f | 向下翻页 |
| H | 屏幕顶部 |
| M | 屏幕中间 |
| L | 屏幕底部 |
文本操作命令
文本选中
| 命令 | 模式 | 功能 |
|---|---|---|
| v | 可视模式 | 从光标位置开始按照正常模式选择文本 |
| V | 可视行模式 | 选中光标经过的完整行 |
- esc可以放弃选中,回到命令行模式
文本删除/剪切
| 命令 | 功能 |
|---|---|
| [n]x | 删除光标所在字符 |
| [n]dd | 删除光标所在行,可以ndd删除多行 |
- 如果使用可视模式已选中了一段文本,d和x都可以删除选中文本
- 命令d、x类似图形界面的剪切操作(ctrl + x)
文本复制、粘贴
| 命令 | 功能 |
|---|---|
| y | 复制 |
| [n]yy | 复制一行,nyy复制多行 |
| p | 粘贴 |
- y0-将光标至行首的字符拷入剪贴板
- y$-将光标至行尾的字符拷入剪贴板
- d0-将光标至行首的字符剪切入剪贴板
- d$-将光标至行尾的字符剪切入剪贴板
- range y-块复制
- range d-块剪切
撤销、恢复撤销
| 命令 | 功能 |
|---|---|
| u | 撤销上次命令 |
| ctrl + r | 恢复撤销的命令 |
文本替换
| 命令 | 功能 | 模式 |
|---|---|---|
| r | 替换当前字符 | 命令模式 |
| R | 替换当前行光标后的字符 | 替换模式 |
- R可以进入替换模式,替换完成后,按Esc可以返回命令模式
- 替换命令的作用就是不用进入编辑模式,对文件进行轻量级的修改
文本查找
| 命令 | 功能 |
|---|---|
| /str | 查找str |
| n | 查找下一个 |
| N | 查找上一个 |
- 如果不想看到高亮显示,可以随便查找一个文件中不存在的内容即可
查找并替换
- 需要在末行模式下执行:范围s/旧文本/新文本/g
- s代表替换
- g全部替换(默认换一行中的第1个)
- 举例:
10,20s/hello/HELLO/g第10行到第20行.,20s/hello/HELLO/g当前行到第20行5,$s/hello/HELLO/g第5行到最后一行%s/旧文本/新文本/g全文替换
- 确认替换:
%s/旧文本/新文本/gc- 会出现提示:
- y-yes 替换
- n-no 不替换
- a-all 替换所有
- q-quit 退出替换
- 会出现提示:
分屏
| 命令 | 功能 |
|---|---|
| :sp[文件名] | 横向增加分屏 |
| :vsp[文件名] | 竖向增加分屏 |
ctrl + h光标到左边窗口ctrl + l光标到右边窗口ctrl + j光标到下面窗口ctrl + k光标到上面窗口