刚进入vi时,处于指令模式,输入字符i,此时处于输入模式,输入完成后,按esc后指令模式。
进入vi
vi filename:打开或新建文件,并将光标置于第一行首
vi +n filename:打开文件,并将光标置于第n行首
vi + filename:打开文件,并将光标置于最后一行首
vi +/patternfilename:打开文件,并将光标置于第一个与pattern匹配的串处
vi -r filename:在上次正用vi编辑时发生系统崩溃,恢复filename
vifilename....filename:打开多个文件,依次编辑
离开vi
若在输入模式下,先利用esc进入指令模式,而后选用以下指令离开vi
:q! 退出但不保存
:wq 保存并退出
:ZZ 保存并退出
:x 保存并退出
:w 保存
:q 退出
输入模式
如何进入输入模式
a 在光标之后插入
A 在光标所在行末插入
i 在光标前插入
I 在光标所在行首插入
o 新增一行,在该行下供输入资料用
O 新增一行,在该行上供输入资料用
如何离开输入模式
按ESC
指令模式
光标的移动
h:光标左移一个字符
j或Ctrl+n:光标下移一行 nj:表示下移n行
k或Ctrl+p:光标上移一行 nk :表示上移n行
l:光标右移一个字符
0:(注意是数字零)光标移至当前行首
$:光标移至当前行尾
^:移至该行第一个字元处
H:光标移至屏幕顶行
M:光标移至屏幕中间行
L:光标移至屏幕最后行
G:移至该文件的最后一行
+:移至下一列的第一个字元处
-:移至上一列的第一个字元处
):光标移至句尾
(:光标移至句首
}:光标移至段落开尾
{:光标移至段落结头
space:光标右移一个字符
Backspace:光标左移一个字符
Enter:光标下移一行
w或W:光标右移一个字至字首
b或B:光标左移一个字至字首
e或E:光标右移一个字至字尾
n$:光标下移n-1行,并置到尾
nG:光标移至第n行首
n+:光标下移n行
n-:光标上移n行
ctrl+g:会显示该文件名称,该行的行号,文件中最末行的行号,光标所在行占总行号的百分比
fx :往右移动到 x 字符上
Fx :往左移动到 x 字符上
tx :往右移动到最近的x 字符前
Tx :往左移动到最近的 x 字符后
(注意:以上四个命令中,其中x是键入的字符)
分号,配合 f 和 t 使用,重复一次
逗号,配合 f 和 t 使用,反方向重复一次
视窗的移动(屏幕翻滚)
Ctrl+u:向文件首翻半屏
Ctrl+d:向文件尾翻半屏
Ctrl+b;向文件首翻一屏
Ctrl+f:向文件尾翻一屏
Ctrl+y;向文件首翻一行
Ctrl+e:向文件尾翻一行
nz:将第n行滚至屏幕顶部,不指定n时将当前行滚至屏幕顶部
插入文本类命令
i:在光标前
I:在当前行首
a:光标后
A:在当前行尾
o:在当前行之下新开一行
O:在当前行之上新开一行
r:替换当前字符
R:替换当前字符及其后的字符,直至按ESC键
s:从当前光标位置处开始,以输入的文本替代指定数目的字符
S:删除指定数目的行,并以所输入文本代替之
ncw或nCW:修改指定数目的字
nCC:修改指定数目的行
删除命令
ndw或ndW:删除光标处开始及其后的n-1个字
do:删至行首
d$:删至行尾
ndd:删除当前行及其后n-1行
x或X:删除一个字符,x删除光标后的,而X删除光标前的
Ctrl+u:删除输入方式下所输入的文本
搜索命令:
/pattern:从光标开始处向文件尾搜索pattern
?pattern:从光标开始处向文件首搜索pattern
n:在同一方向重复上一次搜索命令
N:在反方向上重复上一次搜索命令
替换命令
s 将当前字符替换为一个或多个字符
S 将当前行替换为一个或多个字符
5 s 将从当前字符开始的5个字符替换为一个或多个字符
:s/p1/p2/g:将当前行中所有p1均用p2替代
:n1,n2s/p1/p2/g:将第n1至n2行中所有p1均用p2替代
:g/p1/s//p2/g:将文件中所有p1均用p2替换
:g/s1/s/s2/s3/g 第一个g表示对每一个包括s1的行都进行替换,第二个g表示对每一行包括s1的行所有的s2都用s3替换s表示替换,s2是要被替换的字符串,他可以和s1相同(如果相同的话用//代替),s3是替换字符串
:%s/old_word/new_word/g 这个指令是于在整个文件中替换特定字符串
选项设置
all:列出所有选项设置情况
term:设置终端类型
ignorance:在搜索中忽略大小写
list:显示制表位(Ctrl+I)和行尾标志($)
number:显示行号
report:显示由面向行的命令修改过的数目
terse:显示简短的警告信息
warn:在转到别的文件时若没保存当前文件则显示NO write信息
nomagic:允许在搜索模式中,使用前面不带“\\”的特殊字符
nowrapscan:禁止vi在搜索到达文件两端时,又从另一端开始
mesg:允许vi显示其他用户用write写到自己终端上的信息
最后行方式命令
:n1,n2 co n3:将n1行到n2行之间的内容拷贝到第n3行下
:n1,n2 m n3:将n1行到n2行之间的内容移至到第n3行下
:n1,n2 d:将n1行到n2行之间的内容删除
:w:保存当前文件
:e filename:打开文件filename进行编辑
:x:保存当前文件并退出
:wq:保存当前文件并退出
:q:退出vi
:q!:不保存文件并退出vi
:!command:执行shell命令command
:n1,n2w!command:将文件中n1行至n2行的内容作为command的输入并执行之,
若不指定n1,n2,则表示将整个文件内容作为command的输入
:r!command:将命令command的输出结果放到当前行 。
删除命令操作
d l 删除当前字符(与x命令功能相同)
d 0 删除到某一行的开始位置
d ^ 删除到某一行的第一个字符位置(不包括空格或TA B字符)
d w 删除到某个单词的结尾位置
d 3 w 删除到第三个单词的结尾位置
d b 删除到某个单词的开始位置
d W 删除到某个以空格作为分隔符的单词的结尾位置
d B 删除到某个以空格作为分隔符的单词的开始位置
d 7 B 删除到前面7个以空格作为分隔符的单词的开始位置
d)删除到某个语句的结尾位置
d 4)删除到第四个语句的结尾位置
d(删除到某个语句的开始位置
d } 删除到某个段落的结尾位置
d { 删除到某个段落的开始位置
d 7 { 删除到当前段落起始位置之前的第7个段落位置
d d 删除当前行
d /t e x t 删除从文本中出现“ t e x t”中所指定字样的位置,一直向前直到下一个该字样所出现的
位置(但不包括该字样)之间的内容
d fc 删除从文本中出现字符“c”的位置,一直向前直到下一个该字符所出现的位置(包括
该字符)之间的内容
d tc 删除当前行直到下一个字符“ c”所出现位置之间的内容
D 删除到某一行的结尾
d $ 删除到某一行的结尾
5 d d 删除从当前行所开始的5行内容
d L 删除直到屏幕上最后一行的内容
d H 删除直到屏幕上第一行的内容
d G 删除直到工作缓存区结尾的内容
d 1 G删除直到工作缓存区开始的内容
修改命令操作
c l 更改当前字符
c w 修改到某个单词的结尾位置
c 3 w 修改到第三个单词的结尾位置
c b 修改到某个单词的开始位置
c W 修改到某个以空格作为分隔符的单词的结尾位置
c B 修改到某个以空格作为分隔符的单词的开始位置
c 7 B 修改到前面7个以空格作为分隔符的单词的开始位置
c 0 修改到某行的结尾位置
c)修改到某个语句的结尾位置
c 4)修改到第四个语句的结尾位置
c(修改到某个语句的开始位置
c } 修改到某个段落的结尾位置
c { 修改到某个段落的开始位置
c 7 { 修改到当前段落起始位置之前的第7个段落位置
c tc 修改当前行直到下一个字符c所出现位置之间的内容
C 修改到某一行的结尾
c c 修改当前行
5 c c 修改从当前行所开始的5行内容
1.交换两个字符位置
xp
2.上下两行调换
ddp
3.把文件内容反转
:g/^/m0/ (未通过)
4.上下两行合并
J
5.删除所有行
dG
6.从当前位置删除到行尾
d$
7.从当前位置复制到行尾
y$ 如果要粘贴到其他地方 p 就可以了
由于vi 是建立在 EX 上的 所以 当键入 : 时就来到了 EX 命令状态
8.写简写,跳出全称
:ab string strings
例如 ":ab usa United Statesof America",
当你在文见里插入 usa 时
United States of America 就蹦出来了
9.
:map keys new_seq
定义你当前 键盘命令
10.显示行号
:set [all]
vi or ex 的编辑状态
如 显示每行 :set nu
11.
在命令状态下,nyy表示拷贝从光标行起的下n行内容,p表示paste,可刚复制的内容粘贴在光标处的下面。
12.
单个字符替换用r,覆盖多个字符用R,用多个字符替换一个字符用s,整行替换用S
17. vi 环境选项 Solaris ksh
noautoindent nomodelines noshowmode
autoprint nonumber noslowopen
noautowrite nonovice tabstop=8
nobeautify nooptimize taglength=0
directory=/var/tmp paragraphs=IPLPPPQPPLIpplpipnpbtags=tags /usr/lib/tags
noedcompatible prompt tagstack
noerrorbells noreadonly term=vt100
noexrc redraw noterse
flash remap timeout
hardtabs=8 report=5 ttytype=vt100
noignorecase scroll=11 warn
nolisp sections=NHSHH HUuhsh+c window=23
nolist shell=/bin/ksh wrapscan
magic shiftwidth=8 wrapmargin=0
mesg noshowmatch nowriteany
For C-Shell:
setenv EXINIT "set nu"
For Bourne or Korn Shell:
EXINIT="set nu"; export EXINIT
For Korn Shell Only (alternate method):
typeset -x EXINIT="set nu"
在 .profile 里设置 vi 的环境选项 , 以上均测试过
18.标记文本
mchar 用字母char标记当前光标的位置
`char 移至char所标记处
'char 移至char标记所在行的开头处
" 移至当前行上一次所在位置(在光标移动之后)――一个双引号
'' 移至当前行上第一次所在位置的行的开头处(在光标移动之后)――两个单引号
19. 如何在两个文件之间快速切换(注意:必须是一个窗口打开的文件)
方法一:同时vi多个文件时,CTRL-SHIFT-6回到上一个文件,在本次vi的文件和上次vi 的文件之间切换。
但是我发现一个BUG:在用CTRL-SHIFT-6切换到上一个文件后,用:args查看多 文件vi状态时,屏幕底部仍然显示目前vi的是刚才的文件。
(在HP-UX,Solaris,AIX上通过)
方法二:也可以使用:
:e#
进行切换
方法三:还可以用
:n ---à在这里n代表next
进行切换
20.
sco 下VI 要在文本前同样的字符加用
%s/^/要加的内容/g 要在文本后同样的字符加
%s/$/要加的内容/g