进入输入模式
Vi切换到输入模式的正规方法
| 指令 | 指令说明 |
|---|---|
| a | 在当前光标之后输入 |
| A | 在当前行之末输入 |
| i | 在当前光标之前输入 |
| I | 在当前行之首输入 |
| o | 在当前行之下新增一行,并在新增行输入 |
| O | 在当前行之上新增一行,并在新增行输入 |
输入结束后,按Esc键推出输入模式
光标移动
Vi光标移动
| 指令 | 指令说明 |
|---|---|
| h | 向左移动一个字节 |
| i | 向右移动一个字节 |
| j | 向下移动一个字节 |
| k | 向上移动一个字节 |
| b | 左移一个单词,到词首 |
| w | 右移一个单词,到词首 |
| e | 右移一个单词,到词尾 |
| :0 | 移动到文档起始位置 |
| 0 | 移动当前行行首 |
| ^ | 移动到文档起始位置 |
| $ | 移动到当前行行尾 |
| + | 移至下一行的行首 |
| - | 移至上一行的行首 |
| H | 移至视窗的第一行 |
| M | 移至视窗的中间一行 |
| L | 移至视窗的最后一行 |
| G | 移至该文件的最后一行 |
| nG | 移至该文档的第n行 |
| N+ | 下移n行 |
| n+ | 上移n行 |
| { | 光标移动到上一个空行 |
| } | 光标移动到下一个空行 |
| [[ | 光标移动到下一个函数起始位置(‘{’字符所在位置) |
| ]] | 光标移动到上一个函数起始位置(‘{’字符所在位置) |
| ( | 光标移动到上一段落起始位置,空行也被认为是段落(多个连续空行被认为是一个段落) |
| ) | 光标移动到上一段落起始位置,空行也被认为是段落(多个连续空行被认为是一个段落) |
以上命令从h到e,均可指定重复操作次数,如5h表示光标向前移动5个字节,10j表示向下移动10行
视窗移动
Vi视窗移动
| 指令 | 指令说明 |
|---|---|
| <Ctrl>+f | 视窗下卷一页 |
| <Ctrl>+b | 视窗上卷一页 |
| <Ctrl>+d | 视窗下卷半页 |
| <Ctrl>+u | 视窗上卷半页 |
| <Ctrl>+e | 视窗下卷一行 |
| <Ctrl>+y | 视窗上卷一行 |
删除操作
**Vi删除操作
| 指令 | 指令说明 |
|---|---|
| x | 删除光标所在字节 |
| X | 删除光标前一字节 |
| dw | 从光标当前位置开始向后删除一个单词 |
| db | 从光标当前位置开始向前删除一个单词 |
| d0 | 从行首删除至当前光标位置 |
| d$ | 从光标当前位置删除至行尾 |
| dd | 删除光标所在行 |
| D | 同d$ |
| dG | 删除从当前光标位置直到文档末尾的所有内容 |
以上x、X、dw、db、dd可以指定字符/行数,如3x表示删除从当前光标所在位置起的3个字符,3dd表示删除从当前光标所在行开始的3行。
拷贝和粘贴操作
Vi拷贝粘贴
| 指令 | 指令说明 |
|---|---|
| [n]yy | 拷贝一行或n行 |
| p | 粘贴刚刚拷贝或者删除(d*命令操作的内容)到当前光标后面,如果如果是单词则粘贴到当前行,其他内容则在当前光标所在行后面添加新行进行粘贴 |
| P | 粘贴刚刚拷贝或者删除(nx或者d*命令操作的内容)到当前光标后面,如果如果是单词则粘贴到当前行,其他内容则在当前光标所在行后面添加新行进行粘贴 |
修改操作
Vi修改操作
| 指令 | 指令说明 |
|---|---|
| s | 修改光标所在字节,修改完成后按Esc键结束 |
| S | 修改整行内容,修改完成后按Esc键结束 |
| r | 替换当前光标所在字节 |
| R | 进入替换状态,直至按Esc键结束 |
| cw | 修改一个单词(从光标位置至词尾) |
| cb | 修改一个单词(从词首至光标位置) |
| cc | 修改整行内容,完成后按Esc键结束,同S |
| c0 | 修改行首至光标位置的内容 |
| c$ | 修改光标位置至行尾的内容 |
| ~ | 光标所在字节大小写切换 |
指令重复
Vi指令重复
| 指令 | 指令说明 |
|---|---|
| nx | 删除n个字节 |
| ndd | 删除n行 |
| ns | 修改n个字节 |
在指令模式中,可在指令前面加入一个数字n,则该指令会重复执行n次。常用的重复操作
取消前一操作
Vi取消前一个操作
| 指令 | 指令说明 |
|---|---|
| u | 撤消上一指令的结果 |
| U | 撤销本行上的所有修改 |
查找字符串
Vi查找字符串
| 指令 | 指令说明 |
|---|---|
| /字符串 | 从当前光标向后查找该字符串 |
| ?字符串 | 从当前光标向前查找该字符串 |
| n | 从当前光标向后查找下一个字符串 |
| N | 从当前光标向前查找下一个字符串 |
| # | 向上查找当前光标所在位置的单词,如果当前位置为空白,则为其后的第一个单词 |
| * | 向下查找当前光标所在位置的单词,如果当前位置为空白,则为其后的第一个单词 |
查看编辑状况
Vi查看编辑状况
| 指令 | 指令说明 |
|---|---|
| <Ctrl> + g | 显示正在编辑的文件名、当前光标所在行数、文件总行数、文件是否被修改 |
括号匹配
Vi括号匹配
| 指令 | 指令说明 |
|---|---|
| % | 定位到匹配的“(”、“)”、“{”、“}” |
括号匹配符可以用在各种指令中,如d%表示从但前光标位置删除到匹配的“(”“)”“{”“}”
的位置,c%表示替换从当前光标到配置的“(”“)”“{”“}”位置,y%表示拷贝从当前光标位
置到其后匹配的“)”或“}”。当光标不在“(”“)”“{”“}”上时,默认找其后最近的“(”,然后找“{”。
执行指令
Vi执行指令
| 指令 | 指令说明 |
|---|---|
| :10,20d | 删除第10行至第20行的内容 |
| :10d | 删除第10行的内容 |
| :%d | 删除全部内容 |
| :10,20co30 | 将第10行至第20行的内容复制到第30行之后 |
| :10,20mo30 | 将第10行至第20行的内容移动到第30行之后 |
| :1,$s/old/new | 将第1行至最后一行中的old替换成new |
| :1,$s/^/new | 将第1行至最后一行的内容前面插入new |
| :10 | 将光标移至第10行 |
| :10,20y | 拷贝第10行至第20行的内容 |
| :g/old/s//new | 在全文档范围内查找每行第一次出现的old字符串并替换为new字符串 |
| :g/old/s//new/g | 在全文档范围内查找所有old字符串并替换为new字符串 |
| :g/old/d | 删除文档中包含old字符串的行 |
| :r filename | 读入filename文件内容,并粘贴到当前光标下一行 |
| :e | 重新载入当前文档的内容覆盖当前所有修改,其实就是将所有自上次保存(或者打开)后的所有修改撤销。 |
| :$ | 光标移动到文档末尾一行行首 |
| :[w]n[!] [filename] | 切换到下一个文件进行编辑。如果指定了filename则打开指定的filename文件进行编辑,如果filename不存在则默认为创建该新文件。如果没有指定文件名,则只能在vi已经打开多个文件且当前编辑的文件不是最后一个文件时使用该命令。n表示next,w表示在切换到下一个文件前将当前文件的修改进行保存,!表示强制执行。 |
| :rew[!] | rew即rewind,重新打开第一个文件进行编辑,但是如果当前文件的修改没有保存的话将失败,如果使用了!,则将舍弃对当前文档的最近修改(自上次存储或者文件打开以来),强行打开第一个文件进行编辑。 |
| :la[!] | la即last,打开最后一个文件进行编辑,类似rew,只不过一个是打开第一个文件,一个是打开最后一个文件。 |
| :help [key] | 显示vi的帮助信息,如果指定了命令,则显示该命令的帮助信息。用:exit或:q推出帮助界面。 |
以上用具体的数字为例进行介绍,数字表示行数,光标所在行可用“.”代替,文件最后一行可用“$”代替。
保存与退出
Vi保存与退出
| 指令 | 指令说明 |
|---|---|
| :w | 保存,但不退出 |
| :wq | 保存并退出 |
| :x | 同:wq |
| :q | 退出,如果当前文件没有保存,禁止退出 |
| :q! | 不保存退出 |
| :w file1 | 将内容保存至文件file1中,注意:此时编辑的仍为原文件 |
| :w! file1 | 将内容覆盖保存至文件file1中,如文件file1存在,:w file1将禁止执行 |
环境设置
Vi环境设置
| 指令 | 指令说明 |
|---|---|
| :set | 显示已设置的环境状况 |
| :set all | 显示所有的环境设置选项 |
| :set nu | 显示行号 |
| :set nonu | 不显示行号 |
| :set ts=n | 设置Tab键的长度为n |
vi环境设置的缺省值可在$HOME/.exrc文件中设置。
重复指令
Vi重复指令
| 指令 | 指令说明 |
|---|---|
| . | 重复上一条指令 |
切换到shell状态
Vi切换到shell状态
| 指令 | 指令说明 |
|---|---|
| :sh | 切换到shell状态,此时可以执行所有shell命令,知道执行exit返回文档编辑状态。 |