重复次数:可以通过在命令前键入一个数字来重复执行命令,这个数字称为重复次数。
如:10j 光标向下移动10个位置。
除非特殊声明,以下命令均在命令模式下。
移动光标
当前行:光标所在的行
命令 | 效果 |
h | 将光标向左移动一个位置 |
j | 将光标向下移动一个位置 |
k | 将光标向上移动一个位置 |
l | 将光标向右移动一个位置 |
<Left> | 将光标向左移动一个位置 |
<Down> | 将光标向下移动一个位置 |
<Up> | 将光标向上移动一个位置 |
<Right> | 将光标向右移动一个位置 |
<Backspace> | 将光标向左移动一个位置 |
<Space> | 将光标向右移动一个位置 |
- | 将光标移动到上一行的开头 |
+ | 将光标移动到下一行的开头 |
<Return> | 将光标移动到下一行的开头 |
0 | 将光标移动到当前行的开头 |
$ | 将光标移动到当前行的末尾 |
^ | 将光标移动到当前行的第一个非空白符的字符上 |
w | 将光标移动到下一个单词的词首 |
e | 将光标移动到下一个单词的词尾 |
b | 将光标移动到上一个单词的词首 |
W | 同w,忽略标点符号 |
E | 同e,忽略标点符号 |
B | 同b,忽略标点符号 |
) | 移动到下一个句子句首 |
( | 移动到上一个句子句首 |
} | 移动到下一个段落 |
{ | 移动到上一个段落 |
H | 将光标移动到屏幕顶部 |
M | 将光标移动到屏幕中间 |
L | 将光标移动到屏幕最后一行 |
ps:
句子:一个字符串,以句号,逗号,问号,或感叹号结尾,后面至少跟两个空格或一个新行字符。
段落:以一个空白行开头,并以一个空白行结束的一块文本区域。
在编辑缓冲区移动
命令 | 效果 |
^F | 向下移动一屏 |
^B | 向上移动一屏 |
^D | 向下移动半屏 |
^U | 向上移动半屏 |
ps:在对^D和^U前键入数字时,设置的是应该跳转的行数,并且会一直保持这个设定到改变数字。
跳转到前一位置
命令 | 效果 |
`` | 回到前一位置 |
m | 后加一个字母,如ma,即用这个字母标记该行 |
` | 后跟指定行的标记名称,如`a,跳转到标记该行的准确位置 |
' | 后跟指定行的标记名称,如'a,跳转到标记行的行首 |
搜索
命令 | 效果 |
/pattern | pattren为希望搜索的模式,光标将跳转到接下来包含该模式的行上 |
/ | 重复上一模式向前搜索 |
?pattern | pattern为希望搜索的模式,光标将跳转到之前包含该模式的行上 |
? | 重复上一模式向后搜索 |
n | 沿和之前相同的方向进行搜索 |
N | 沿和之前相反的方向进行搜索 |
使用行号
命令 | 效果 |
:set number | 显示行号 |
^G | 显示文件名称,位置(行,百分比) |
行号G | 跳转到指定行 |
:行号 | 跳转到指定行 |
gg | 跳转到第一行 |
插入文本
命令 | 效果 |
i | 改变到输入模式:在当前光标位置前插入数据 |
a | 改变到输入模式:在当前光标位置后插入数据 |
I | 改变到输入模式:在当前行开头插入数据 |
A | 改变到输入模式:在当前行末尾插入数据 |
o | 改变到输入模式:在当前行下插入一行 |
O | 改变到输入模式:在当前行行插入一行 |
^W | 输入模式下,删除光标之前的一个单词 |
^U | 输入模式下,删除光标之前的一行 |
修改文本
命令 | 效果 |
r | 后跟新字符,将当前字符更换为新字符 |
R | 改变到REPLACE模式,随后键入的每个字符都将替换当前行上光标后(包括光标)的一个字符 |
s | 改变到输入模式,多个字符替代一个字符 |
C | 替换从当前光标位置到这一行末尾的所有字符 |
S | 替换一整行 |
cc | 替换一整行 |
c | 后跟光标移动命令,替换从光标当前位置到移动命令所指定位置的所有字符。如c5w,替换5个单词 |
:s/pattern/replace | 替换当前行上pattern的第一个匹配项为replace,可在;和s中指定行号,以 , 分隔两个行号,可表示范围 |
:s/pattern/replace/g | 替换当前行上所有的匹配项 |
:s/pattern/replace/c | 替换前需确认 |
ps:
. 代表当前行
$ 代表编辑缓冲区的最后一行
% 代表编辑缓冲区所有的行
删除文本
命令 | 效果 |
x | 删除当前光标处的字符 |
X | 删除当前光标左边的字符 |
D | 删除从当前光标到本行末尾的字符 |
d | 后跟光标移动命令,删除从当前光标到光标移动命令指定位置的字符 |
dd | 删除当前行,光标移动到下一行行首 |
:行号d | 删除指定行 |
:行号1,行号2d | 删除行号1,到行号2的行 |
ps:
10dd,删除从当前行开始10行的文本
撤销或重复改变
命令 | 效果 |
u | 撤销上一命令对编辑缓冲区的修改 |
U | 恢复当前行 |
. | 重复上一命令对编辑缓冲区的修改 |
p | 复制上一次删除的内容,插入到光标之后 |
P | 复制上一次删除的内容,插入到光标之前 |
编号p | 将编号缓冲区中相应编号的内容插入当前行的下面 |
编号P | 将编号缓冲区中相应编号的内容插入当前行的上面 |
ps:
无名缓冲区:保存上一次删除保留的副本。
编号缓冲区:vi将删除内容保存在编号缓冲区中,并从1~9编号。
组合命令:
xp 调换两个字符
deep 调换两个单词
ddp 调换两行
复制文本
命令 | 效果 |
y | 后接光标移动命令,复制从当前光标到光标指定位置的字符 |
yy | 复制整行 |
Y |
复制整行 |
:行号1co行号2 | 复制行号1的行到行号2的行下面 |
:行号1,行号2co行号3 | 复制行号1到行号2之间的行到行号的行3下面 |
ps:
复制的文本保存在无名缓冲区中。可以使用p取出。
10yy,复制从当前行开始10行的内容。
移动文本
命令 | 效果 |
:行号1m行号2 | 移动行号1的行到行号2的行下面 |
:行号1,行号2m行号3 | 移动行号1到行号2之间的行到行号3的行下面 |
改变字母大小写
命令 | 效果 |
~ | 改变光标所在字符的大小写 |
ps:
若光标所在字符是非字母,光标像前移动一个位置,不进行改变。
10~ 改变从光标所在字符开始10个字符的大小写。
连接行
命令 | 效果 |
J | 把当前行和下一行合并成一个长行 |
ps:
当vi在连接行时,会在合适的位置自动地插入空格,即,在句子末尾插入两个空格。
3J 连接当前行开始3行为一个长行。
输入shell命令
命令 | 效果 |
:!命令 | 将命令发送给shell执行,当命令结束后,控制返回vi |
;!! | 重复执行最近一条shell命令 |
:sh | 暂停vi,并启动一个新的默认shell副本 |
插入文件数据
命令 | 效果 |
:行号r 文件 | 将文件内容插入到行号的行下面 |
插入shell命令输出
命令 | 效果 |
:行号r !命令 | 将命令的输出插入到行号的行下面 |
ps:
行号未指定,则为当前行
将数据写入文件
命令 | 效果 |
:w | 将数据写入原始文件 |
;w 文件 | 将数据写入新文件 |
:w! 文件 | 覆盖一个已有的文件 |
:w>>文件 | 将数据追加到指定的文件 |
切换到一个新文件
命令 | 效果 |
:e 文件 | 切换到新文件进行编辑 |
:e! | 重新编剧当前文件,忽略自动检查 |
:e! 文件 | 编辑指定文件,忽略自动检查 |