以前用过一段时间的vi编辑器,但是感觉用起来非常不顺手。因为之前用惯了word,所以对这种命令行风格的编辑器就很不习惯。在网上看到说高手一般都比较青睐于vi编辑器,对于菜鸟来说vi编辑器是把钝器,对高手来说却是利器。我在linux系统下一般都是用gedit编辑器来写代码,因为gedit类似于windows下面的记事本,用起来舒服点。相信大多数像我一样的菜鸟都是这样的吧。最近看到一本linux的书上有讲vi编辑器的,我想就干脆再复习一下,当是为今后成为高手打下铺垫,哈哈~
讲到vi编辑器,首先不得不说的是它的3种工作模式:命令模式、输入模式及末行模式。我们先理解一下这三种模式到底是怎么回事。
命令模式:在这个模式下,输入的所有字符被当做vi的编辑命令。vi的命令模式相当于windows的记事本中的编辑菜单。复制、粘贴、删除等等这些文本编辑功能都在这个模式下实现。这个模式下输入的命令不在屏幕上显示出来。
输入模式:这个模式很容易理解,输入的字符就是你想要的编辑的内容。
末行模式:也叫ex转义模式。这个模式相当于windows记事本的文件菜单,文件的保存、退出功能都在末行模式下完成。这个模式下输入的命令会在屏幕上显示出来。
好了,我们已经理解了这三种模式是怎么回事,接下来就是了解在使用vi编辑器时怎么在这三种模式间进行转换。
从图中可以看到,用户刚开始进入vi编辑器时,默认是命令行模式,在该模式中如果输入i或a则可以进入输入模式,如果输入shift+;则可以进入末行模式。当处于输入模式或者末行模式中时,可以输入Esc来返回命令行模式。
现在已经理解了vi编辑器的3种模式以及它们的转换,接下来就开始实战吧!
进入vi
①vi 进入vi编辑器,对一个vi空文件进行操作
②vi filename 若文件不存在则建立新文件,光标定位在第一行第一列
③vi + filename若文件不存在则建立新文件,光标定位在最后一行第一列
④vi +n filename 若文件不存在则建立新文件,光标定位在第n行第一列
⑤vi +/pattern filename 若文件不存在则建立新文件,光标定位在第一个与pattern串匹配的行首
退出vi
在Windows记事本中,退出时在文件菜单下的。文中前面提到vi的末行模式相当于windows记事本的文件菜单。所以可以想象,vi的退出是在末行模式下进行的。下面说明在末行模式下怎么退出vi
①:w[文件名] 将编辑的文件进行保存,但是不退出vi;若指定了文件名,则将编辑的文件保存到指定的文件中
②:wq 将编辑的文件内容写回文件中,并且退出vi,返回到shell中
③ZZ 与:wq的作用一样
④:x与:wq的作用一样
⑤:q 退出vi,当文件已经被修改时,在屏幕的底行显示提示信息
⑥q! 不保存文件,强行退出vi。vi中的!常常具有强制执行的意思
移动光标
移动光标的动作在Windows记事本中相当于编辑功能,对应于vi编辑器的命令模式,因此以下命令式在命令模式下执行的。
l:右移一个字符,nl右移n个光标
h:左移一个字符,nh左移n个光标
j:下移一行,nj下移n行
k:上移一行,nk上移n行
Ctrl+f:向上滚动一屏
Ctrl+b:向下滚动一屏
Ctrl+u:向上滚动半屏
Ctrl+d:向下滚动半屏
删除命令
该命令也是在命令模式下执行的
x:删除光标所在的字符,nx删除光标所在位置开始的后n个字符
X:删除光标前的字符,nX删除光标前的n个字符
dw:删除光标所在字, ndw删除光标位置后的n个字
dd:删除光标所在行
D:从光标位置开始删除至行尾
重复及恢复命令
该命令是在命令模式下执行的
. :重复刚才执行过得命令
u :取消前面刚执行过的更改操作
U:把当前行恢复成编辑前的状态,不管对此行编辑了多少次
复制、更改及取代命令
yw:复制光标处的字到缓冲区,nyw复制光标开始处后的n个字到缓冲区
yy:复制当前行到缓冲区。nyy复制当前行开始的后n行到缓冲区
p:将缓冲区内容贴在当前光标所在行的下一行
P:将缓冲区内容贴在当前光标所在行的上一行
rx:用x取代光标所在位置的字符,这里x代表一个字符。nrx用x取代光标所在位置开始的后n个字符
R:进入替换状态。随后键入的字符一一取代光标所在位置及后面若干字符,直到按ESC退出替换状态
查找及替换命令
该命令是在命令模式下执行的
/字符串:从当前光标所在位置向下查找该字符串
?字符串:从当前光标所在位置向上查找该字符串
n:往下继续寻找下一个相同的字符串,这是在使用了上述两个查找命令后使用的
N:往上继续寻找下一个相同的字符串,这是在使用了上述两个查找命令后使用的
:n1,n2 s/字符串1/字符串2:在第n1行和第n2行之间,寻找当前行上的第一个字符串1,并用字符串2替换之。
n1,n2 s/字符串1/字符串2/g:在第n1行和第n2行之间,寻找当前行开始的所有字符串1,并用字符串2替换之。其中g代表全程替换
显示行号
set nu