vi (vim)详解/图解

[语法]:vi [-wn] [-R] 文件...
[说明]: vi 是一个基于行编辑器 ex 上的全屏幕编辑器,可以在vi 中使用 ex,ed的全部命令,vi选项中 -wn 指将编辑窗口大小置为n行,-R 为将编辑的文件置为只读模式, vi 工作模式分为命令模式和输入模式,一般情况下在命令模式下,可敲入vi命令,进入输入模式下时可以编辑要编辑的文本,命令 a A i I o O c C s S R 可进入输入模式,在输入模式下按 ESC 键可推出输入模式,回到命令模式,在命令模式中敲入: 命令,则可进入ex方式,在屏幕底部出现提示符 : ,此时可使用任意ex命令,屏幕底行也用来作/ ? ! 命令的提示行,大多数命令可以在其前面加数字,表示命令执行的重复次数,下面简单介绍一下vi 的命令集,^ 表示(CTRL)键
^B 退回前一页,前面加数字表示重复次数,每次换页时
保留上一页的两行
^D 在命令模式下,表示下滚屏幕的一半,在输入模式下,表示回退至
左边的自动缩进处
^E 显示屏幕底线之下的一行
^F 前进一页,前面加数字表示重复次数,每次换页时
保留上一页的两行
^G 显示当前文件名,当前行号和文件总行数,并用百分号当前行在
整个文件中的位置
^H(退格) 在命令模式下,光标左移一格;在输入模式下,删去前面的字符
^I(TAB) 在输入模式下,产生一串空格
^J(LF) 光标下移一行
^L 刷新屏幕,即将屏幕重新显示
^M(回车) 在命令模式下,光标移动至下行开头
在输入模式下,开辟一新行
^N 光标下移一行
^P 光标上移一行
^Q 在输入模式下,将其后的非打印字符作为正文插入
^R 刷新屏幕
^U 屏幕上滚一半,前面加数字时表示上滚的行数,此数字对
以后的^D ^U 命令有效
^V 在输入模式下,将其后的非打印字符作为正文插入
^W 在输入模式下,使光标回退一个字
^Y 显示屏幕底线之上的一行
^Z 暂停编辑,退回上层Shell
^[(ESC) 退出输入模式,回到命令模式
! 暂时退出编辑,执行Shell命令
(双引号) 用于标志有名缓冲区,编号缓冲区1-9用于保存被删去的正文,字
母名缓冲区a-z供用户存放自定义的正文
$ 将光标移动到当前行尾,前加数字则表示前移行数,如2$表示移动
到下一行行尾
% 将光标移动到配对的小括号()或大括号{}上去
( 退回句子开头
) 前移到句子开头
- 退到上一行第一个非空格字符
. 重复上一次改变缓冲区内容的命令
/ 模式 向前搜索模式,将光标移动到模式出现处,模式是一个正规
表达式,(参看 grep)
: 在屏幕底部提示:,其后可使用ex命令
? 功能同 / ,但方向是向前查找
[[ 光标回退至前一节分界处
转意符
]] 光标前移至节分界处
^(不是CTRL) 光标移至当前行第一个非空字符上
' 连续两个''表示将光标移至其移动前的位置,'后跟字母表示光标字
母标记的行首(参看 m 命令)
A 在行尾插入正文,进入输入模式
B 光标回退一个字
C 替换光标后的内容
D 删除光标后的内容
E 光标前移到字尾
F 字符 在当前行向左查找指定字符
G 光标移动到其前面数字指定的行,若未指定则移动到最后一行
H 光标移动到屏幕顶行,若前面有数字,则移动到屏幕上该数字
指定的行
I 在行开头插入正文
J 连接两行,若前面有数字则连接数字指定的行
L 光标移动到屏幕底行,若前面有数字,则移动到屏幕底线往上数该
数字指定的行
M 光标移动到屏幕中线
N 使用模式查找/或?时,重复找下一个匹配的模式,但方向与上次相
反,其功能同 n ,但方向相反
O 在当前行上开辟一新行
P 将上次被删除的正文插入光标前面,可在其前面加缓冲区编号,编
号1-9用于保存被删去的正文,字母名缓冲区a-z供用户存放自定
义的正文
Q 从vi 推出进入ex命令状态
R 替换字符串
S 替换整行
T 字符 向左查找字符
U 将当前行恢复至第一次修改前的状态
W 光标移至下一个字首
X 删除光标前的字符
Y 将当前行存入无名缓冲区,前面加数字表示存入的行数,也可用有
名缓冲区来保存,以后可用命令p或P将其取出
ZZ 存盘退出vi
a 光标后插入正文
b 光标回退至上一个字首
cw 替换当前字
c) 替换当前句子
dw 删除一个字
dd 删除一行
e 光标移到下一个字末
f 字符 在当前行向前查找字符
h 光标左移一格
i 在光标前插入正文
j 光标下移一行
k 光标上移一行
l 光标右移一格
m 字母 用字母标记当前行,以后可用 '字母使光标移动到当前行,
(参看'命令)
n 重复上次 / 或 ? 命令
o 在当前行下开辟一新行
p 将用户缓冲区内容放到光标位置(参看P命令)
r 替换当前字符
s 用一串字符替换当前字符
t 字符 光标移动至字符前
u 取消上次操作
w 光标移至下一字首
x 删除当前字符
yw 将当前字存入无名缓冲区,前面可加x,表示存入名字为x的有名
缓冲区(x为a-z),也可加数字表示存入的字数,以后可用P或p命
令取出
yy 将当前行存入无名缓冲区,用法参看yw
{ 光标移动至前一段开头
| 光标移至行首,若前面加数字,则移到数字指定行的行首
} 光标移至下一段开头
在:提示符下,常用命令如下:
:w 当前文件存盘
:w! 强制存盘
:w 文件 将内容写入指定文件
:w! 文件 强制写入指定文件
:x,y w 文件 将 x至 y 行写入指定文件中
:r 文件 将文件读到光标位置
:r ! 命令 将系统命令的输出读到光标位置
:q 退出编辑
:q! 强制退出
:x 与命令ZZ相同
:e 文件名 编辑另一文件
:e ! 重新编辑文件,放弃任何改变
:sh 执行sh,结束后回到编辑
:! 命令 执行命令后回到编辑
:n 编辑下一文件
:n 文件表 重新定义待编辑文件表
:set 设置 vi 的选项,例如 set nu 表示每行前显示行号,在选项前
加no则表示清除该选项,例如 set nonu 表示每行前不显示行
号,下面是一些常用的选项:
ai 自动缩进
aw 编辑下一文件前自动存盘
ic 查找字符串时不区分大小写
nu 每行前显示行号
sm 输入)及}时显示与之配对的( 或 {
slow 插入时延迟屏幕刷新
ws 使查找能绕过文件尾从头进行
wa 写文件之前不作对文件的检查

=================================================================

vi(Visual)是以视觉为导向的全屏幕编辑器、共分为三种方式(mode):
command方式:
任何输入都会作为编辑命令,而不会出现在屏幕上,若输入错误则有“岬”的声音;任何输入


都引起立即反映
insert方式:
任何输入的数据都置于编辑寄存器。在command方式下输入(I,a,A等),可进入insert方式,  insert方式下按ESC,可跳回command方式。
escape方式:
以“:”或者“/”为前导的指令,出现在屏幕的最下一行,任何输入都被当成特别指令。
进入vi(在系统提示符下面输入以下指令):
vi           进入vi而不读入任何文件
vi filename      进入vi并读入指定名称的文件(新、旧文件均可)。
vi +n filename    进入vi并且由文件的第几行开始。
vi +filename      进入vi并且由文件的最后一行开始。
vi + /word filename  进入vi并且由文件的word这个字开始。
vi filename(s)     进入vi并且将各指定文件列入名单内,第一个文件先读入。
vedit         进入vi并且在输入方式时会在状态行显示“INSERT MODE"。
编辑数个文件(利用vi filename(s))进入vi后)
:args         显示编辑名单中的各个文件名
:n          读入编辑名单中的下一个文件
:rew         读入编辑名单中的第一个文件
:e#          读入编辑名单内的前一个文件
:e file        读入另一个文件进vi(此文件可不在编辑名单内),若原文件经修改还没有存档,则           应先以: w 存档。
:e! file       强迫读入另一个文件进入vi,原文件不作存档动作。
存储及退出vi
:w filename      存入指定文件,但未退出vi(若未指定文件名则为当前工作的文件名)。
:wq 或者 :x或者zz   存文件,并且退出vi.
:q          不作任何修改并退出vi。
:q!          放弃任何修改并退出vi。
:!command       暂时退出vi并执行shell指令,执行完毕后再回到vi。
:sh          暂时退出vi到系统下,结束时按Ctrl + d则回到vi。
加数据指令
i           在关标位置开始插入字符,结束时候按ESC键。
I           在光标所在行的最前面开始加字,结束时按ESC键。
a           在光标位置后开始加字,结束时按ESC键。
A           在光标所在行的最后面开始加字,结束时按ESC键。
o           在光标下加一空白行并开始加字,结束时按ESC键。
O           在光标上加一空白行并开始加字,结束时按ESC键。
!command       执行shell指令,并把结果加在光标所在行的下一行。
删除指令
nx          删除由光标位置起始的n个字符(含光标位置,按一个x表示删除光标所在的字符)
nX           删除由光标位置起始的n个字符(不含光标位置)。
ndw          删除光标位置其实的n个字符组(word)。
d0           将行的开始到光标位置的字符全部删除。
d$ 或D         将光标位置起始到行尾的字符全部删除。
ndd          将光标位置起始的n行(整行)删除(dd表示删除光标所在行)。
:start,endd      删除文件的第start到end行。
关标移动
0           移到一行的开始
$           移到一行的最后
[           移到文件开始位置
]           移到文件结束位置
nh          往左移n位
nl或者spacebar     往右移n位
nk          向上移n行
n+          向上移n行,光标在该行的起始
ni           向下移n行
n-          向下移n行,光标在该行的起始
H           移到屏幕的左上角
M           移到屏幕的中间行开头
L           移到屏幕的最后一行
G           移到文件的最后一行
nG或者:n       移到文件的第n行
nw          右移n个字组,标点符号属于字组
nW          右移n个字组,标点符号不属于字组
nb          左移n个字组,标点符号属于字组
nB          左移n个字组,标点符号不属于字组
Ctrl + u       屏幕上卷半个菜单
Ctrl + d        屏幕下卷半个菜单
Ctrl + b        屏幕上卷一个菜单
Ctrl + F        屏幕下卷一个菜单
修改指令
r           修改光标文件的字符
R           从光标位置开始修改,结束时按ESC键
new          更改n组字符,结束时按ESC键
ncc          从光标所在位置开始更改n行,结束时按ESC键
重排各行长度
i           并按Enter将该行由光标所在处断开,并进入insert方式
J           把下一行的数据连接到本行之后
寻找指令
/text         从光标位置往下找字串text
?text         从光标位置往上找字串text
n           继续找下一个字串(在输入上面的寻找指令之后使用)
寻找并且取代指令
:getxt1/s/ /text2/options   将各行的text1替换为text2
option=g表示文件中所有的text1均被取代,若未输入任何option,则只有               各行中的第一个出现的text1被取代
option=go 在屏幕显示各取代的行
option=gc 在每个字串取代之前要求确认 
Start,endgtext1/s/ / text2/options  同上,只寻找并取代第start~end行。
或:Start,ends/text1/text2/options
复制及移动文件
:first,last co dest      将first 到last行的数据复制到目标行(dest)下面
:Start,end m dest      将start 到 end行的数据移动到目标行(dest)下。   
:r filename          将指定文件的内容读入光标所在行下。
nY               将光标所在位置开始的n行数据暂存
p               复制暂存数据在光标的下一行
P               复制暂存数据在光标的上一行
其他命令
.               重复前一指令
u               取消前一指令
Ctrl + l           刷新屏幕显示
:set number          显示文件的行号,但不会存文件
:set nonumber         解除行号显示
:set ai            设置每行起始位置(以光标当前位置为起始)
:set noai           取消行起始位置设定
:f 或<Ctrl> + g        告诉用户有关现行编辑文件的数据。
=================================================================

Last line mode:
/exp Go forward to exp
?exp Go backward to exp


:w Write buffer to disk
:w newfile Write buffer to newfile
:w! file Write Absolutely
:q Quit editor
:q! Quit,discarding buffer
:wq Write buffer and quit
:x Write if needed & quit
:f Edit & file status
:r Read file into buffer
:r file Read named file in
:e (Re)edit file
:e! (Re)edit,discard file in
:e file Edit nameed file
:3,8d Delete lines 3-8
:4,9m 12 Move lines 4-9 to 12
:2,5t 13 Copy lines 2-5 to 13
:5,9w file Write lines 5-9 to file
:s/old/new/ Current line,sub first "old" w/ "new"
:s/old/new/g Current line,sub each "old" w/ "new"
:3,9s/old/new Lines 3-9,sub first "old" w/ "new"
:%s/old/new All lines,sub first "old" w/ "new"
:%s/old/new/g All lines,sub each "old" w/ "new"
:s/pat./new A . matches any charcter
:s/pat*/new A * matches 0 or more "t"s
:s/pa[0-9aeioA-Z]/new selection set or range
:s/pa[^aeiou]/new match any non-vowel
:s/^pat/new anchor "par" to beginning of line
:s/pats/new anchor "par" to end of line
:s/old/& and new/ restoe matched pattern on sub
:%s/./ &/ indenta whoie file
:set nu Display line numbers
:set nonu Turn off option
:set all Show all settings
:set list Try to display invisible chars
:set wm=5 Wrap lines 5 sp from R margin

Command mode:
<- | ->
hljk Cursor movement
G Goto last file line
3G Goto line 3
0 Goto line start
$ Goto line end
% Goto matching brace/paren
H Goto screen top
M Goto screen middle
L Goto screen bottom
w Go forward 1 word
3w Go forward 3 word
b Go back 1 word
3b Go back 3 word
n Repeat previous search
N Reverse previous search
x Delete one character
dw Delete one word
dd Delete one line
D Delete to end of line
d0 Delete to beginning of line
dG Delete to end of file
4dd Delete 4 lines
u Undo last change
. Do last chang
Y Yank a copy of a line
5Y Yank a copy of 5 lines
P Put below cursor
p Put above cursor
J Join next line to current
4J Join 4 lines to current
>> Shift a line right
3>> Shift 3 lines right
^d 1/2 scroll forward
^u 1/2 scroll backwards
^f Scroll forward
^b Scroll backwards
n Repeat previous search
N Reverse previous search
ZZ Write if needed & quit vi

Insert mode:
a Append after cursor
A Append at line end
cw Change a word
3cw Change 3 words
C Change line
i Insert before cursor
5i Insert at 5 times
I Insert at beginning of line
o Open a linebelow cursor
O Open a line above cursor
r Replace one character
R Replace/type-cver a line
s Substitute a character
S Substitue a line

你可能感兴趣的:(vi (vim)详解/图解)