启动VI会话
命令 光标移动
vi file 编辑file
vi –r file 系统崩溃后,编辑保存的最后一个file版本
vi –R file 在只读模式下编辑file
vi +n file 在只读文件并将光标置于第N行
vi + file 编辑文件并将光标置于最后一行
vi file1 file2 file3… 通过文件file3编辑file1,并且保存对file1的改动后,你可以通过键入:n移动到file2
vi +/string file 编辑文件并将光标置于包含有string的行的开头
在vi中添加文本
a 在光标后添加新的文本
A 在当前行的末尾添加新的文本
i 在光标前插入新的文本
I 在当前行的头部插入新的文本
o 在当前行的下面打开一行并插入
O 在当前行的上面打开一行并插入
:r file 读取file并在当前行后插入
:nr file 读取file并在第N行后插入
Escape 返回到命令模式
^v char 插入时忽略char的特殊意思。这用于插入特殊的字符
在vi 中删除文本
x 删除光标处的字符。在X的前面加上一个数字则可确定要删除的字符数
nx 删除以光标处开始的N个字符
X 删除前面的字符。在X的前面加上一个数字则可确定要删除的字符数
nX 删除前面的n个字符
dw 删除到下一个单词的开始处为止
ndw 删除以当前单词为开头随后的n个单词
dG 删除行一直到文件的结尾
dd 删除整个行
ndd 删除以当前行开始的n行
db 删除前一个单词
ndb 删除以当前行开始的n 行
:n,md 删除n到m之间的行
D or d$ 从光标处开始一直删除到行的结尾
dcursor_command 删除光标命令(cursor_command)所指处的文本,dG将从当前行删除到文件的结尾
^h或backspac 插入时删除前一个字符
^w 插入时删除前一个字符
在vi中修改文本
rchar 用char替代当前字符
Rtext escape 用text替代当前字符,直到输入ESC键结束
stext escape 用text替代当前字符
S或cctext escape 用text替代整行
cwtext escape 用text替代整行
Ctext escape 将当前字改为text
cG escape 修改到文件的末尾
ccursor_cmd text escape 从当前位置处到光标命令(cursor_cmd)所指位置处都改为text
vi中的搜索和替代
/text 在文件中向前搜索text
?text 在文件中向后搜索text
n 同最初搜索相同的方向重复搜索
N 同最初搜索相反的方向重复搜索
ftext 在当前行中向前搜索text
Ftext 在当前行中向后搜索text
ttext 在当前行中向前搜索text,并在text字符前停止
Ttext 在当前行中向前搜索text,并在text字符后停止
:set ic 搜索时忽略大小写
:set noic 使搜索对大小写敏感
:s/oletext/newtext/ 用newtext(新文本)替代oletext(旧文本)
:m,ns/oldtext/newtext 用newtext替代从m行到n 行中的oletext
& 重复上一次的:s命令
:g/text1/s/text/text3 搜索包含text1的行,并用text3替代text2
:g/text/command 在所有包含text的行中运行command命令
:v/text/command 在所有不包含text的行中运行conmmand命令
vi中的复制
yy 移出当前行
nyy 移出n行
p(小写) 在光标后放置已移出的文本
P(大写) 在光标前放置已移出的文本
"(a--z)nyy 复制n行到命名缓冲区,缓冲区的名字为括号中的字母。省略n将只复制当前行
"(a--z)ndd 复制n行到命名缓冲区,缓冲区的名字为括号中的字母。省略n将只删除当前行
"(a--z)p 在当前行后放置命名缓冲区中的行,缓冲区的名字为括号中的字母
"(a--z)p 在当前行放置命名缓冲区中行,缓冲区的名字为括号中的字母
vi中的撤消操作
u 撤消上一次的修改
U 撤消对当前行
.( 句号) 重复上一次的修改
,(逗号) 向相反方向重复上一次的f,F,t或T搜索命令
;(分号) 重复上一次的f,F,t或 搜索命令
"np 恢复最后第n个删除 (即恢复缓冲区中有限数目的删除,通常为9个 )
n 重复上一次的/或?搜索命令
N 向相反方向重复上一次的/或?搜索命令
保存文本和退出vi操作
:w 保存文件,但不退出vi
:w file 保存file中的修改,但不退出vi
:wq或ZZ或:x 保存文件并退出vi
:q! 不保存文件退出vi
:e! 重新编辑文件,放弃上一次书写时的修改
vi中的选项
:set all 打印所有选项
:set nooption 关闭option选项
:set nu 设置每行前面加上行号
:set showmode 显示是输入模式还是替代模式
:set noic 搜索时忽略大小写
:set list 显示制度(tab)符(^|)和行结尾符($)
:set ts=8 设置制表(tab) 符的大小(即每次击tab键移动的字符数)
:set window=n 设置文本窗口中的行数为n
vi中的状态
:.= 打印当前行数
:= 打印文件的行数
^g 显示文件名,当前行数,文件中的总行数和文件位置的百分比
:| 使用字母"|"来显示各种不同的特殊字符,如制表符(tab)和换行符(newline)
vi中的定位与标记
} 在第一列插入{来定义一节
[[ 返回到一节的开头
]] 向前跳到下一节的开头
m(a--z) 使用字母标记当前位置,比如mz标记z
(a--z) 移动光标到指定的标记处,比如' z将移动到z处
在vi中连接行
J 将下一行连接到当前行的末尾
nJ 连接随后的n行
H 将光标移动到屏幕的顶行
nH 从屏幕的顶行移动到第n行
M 将光标移动到屏幕的中间
L 将光标移动到屏幕的底行
nL 从屏幕的底行将光标移动到第n行
^e(control--e) 将光标向上移动一行
^y 将光标向下移动一行
^u 将屏幕向上移动半页
^d 将屏幕向下移动半页
^b 将屏幕向上移动一页
^f 将屏幕向下移动一页
^l(letter |) 刷新屏幕
z-return 使当前显示在屏幕的顶部
nz-return 使第n行显示在屏幕的顶部
z. 使当前行成为中间行
nz 在屏幕上使第n行成为中间行
z- 使当前行成为底行
nz- 使第n行在屏幕上成为底行
vi中的Shell Escape命令
:! Command 执行诸如:!Is之类的shell命令command
:!! 执行最后一个shell命令
:r! command 从command读取和插入输出,例如:r!Is运行Is并读取内容
:w! command 将当前被编辑的作为标准输出发送给command ,并执行command,例如:w!grep all
:cd directory 将当前工作目录变成directory
:sh 启动一个子shell并用^d(control -d)返回vi
:so file 在shell程序file中读取和执行命令
vi中的宏命令和缩写
:map key command_seq text 定义key来运行commanf_seq,例如:无论何时利用e移动一个单词的末尾时,用:map e ea来添加
:map key command_seq text 在状态行上显示所有被定义的宏命令
:umap key 消除key的宏
:ab string1 string2 当插入string1时定义一个缩写,用string2代替string1。当插入文本类型string1时,按escape键,这时将插入string2
:ab 显示所有的缩写
:cd directory 将当前工作目录改变到directory
:una string 非缩写化string
避免使用控制键盘,符号,并且不使用字符:KVgqv*=和功能键
Vi中的缩进文本
^I(control键加I)或tab 在插入文本时,插入移位宽度。移位宽度可以定义
:set ai 打开自动缩进功能
:set sw=n 设置移位宽度为n个字符
n<< 将n行左移一个移位宽度
n>> 将n行右移一个移位宽度。例如,3>>是将后面的三行右移一个移位宽度
vi中的shell过滤器
!cursor_command command 将文本发送到shell_command,从当前位置
vi中的模式匹配
^ 匹配一行的开头。为了在行的开头搜索think,可以使用\^think可以和$结合使用,$匹配行的尾部,
$ 用:g/^$/d删除所有的空行匹配行的尾部。匹配last,只要它跟有新行符你可以使用::g/^$/d
. 匹配任何单个的字符
\< 匹配词的开头
\> 匹配词的尾部
[string] 匹配在strng中的任意单个字符。为了搜索到mp,mP,MP或MP可以使用:/[mM[pP]
将所有的input或Input改为INPUT:
:%/[li]nput/INPUT/g
[^string] 匹配不在string中的任意字符
[a-p] 匹配在a和p中的任意字符
* 匹配零个或多个出现在表达式前面的字符
\ 下一个字符转意。为了搜索[,可以使用一下方法:^[
\\ 转意\字符