本文以问答的形式对vi编辑器进行认识、熟悉和使用。适合vi初学者、入门者阅读。更多vi深入的东西请参考其它文档。
1.vi是个什么东东?
VI 编辑器是Visual interface的简称,是Linux和Unix上最基本的文本编辑器。能对文本进行输出、删除、查找、替换、块操作等多种操作,类似与windows上的notepad(但是vi是终端上的程序,没有图形界面)。它没有菜单,只有命令,且命令繁多(这也是很多初学者觉得很难的地方)。同时也注意的是它并不像Word或WPS那样能对字体、格式、段落等其他属性进行编排。
上图是centos6.5上的vi(m)编辑器(直接在终端上输入命令vi即可打开)
2.为什么使用vi
为什么我们要使用vi进行文本编辑,换句话说vi编辑器为什么受大家欢迎。我总结了下,有几个原因:1.如上面所说:它是unix/linux上面基本的编辑器,安装完系统后就可以直接使用它,不用单独安装;2.它是非图形界面的编辑器(这哪能说是它的优点呢),就正是因为它是终端型的编辑器,它才能在unix/linux服务器(没有图形界面的操作系统,或者远程连接到linux/unix)上发挥作用,其它图形界面的编辑器如gedit、kate等此时都是渣渣;3.vi编辑器本身的强大,全键盘命令操作、有很多快捷键对文本进行操作、支持自定义设置;4.使用熟练后,你会发现它比其它编辑器gedit等更便捷、高效;5.因为很多牛人大神都用它(扯远老)。
上面我们对vi编辑器有了一个初步的认识,接下来我们将对如何使用vi进行提问。
3.怎么编辑文件
a 在光标之后插入;
I 在光标所在行的行首插入;
A 在光标所在行的行末插入;
o 在光标所在的行的上面插入一行;
O 在光标所在的行的下面插入一行;
S 删除光标所在的行,然后进入插入模式;
4.如何关闭文件
很多时候打开了文件后,不知道怎么退出vi编辑器返回到终端上。
退出文件 需要在命令模式中输入命令才可进行相应的保存、退出相关操作。
按 Esc 键 进入命令模式,然后输入下面的命令可以分别达到不同的效果:
:w 保存;
:w filename 另存为filename;
:wq! 保存退出;
:wq! filename 注:以filename为文件名保存后退出;
:q! 不保存退出;
:x 应该是保存并退出 ,功能和:wq!相同
上面的w表示write,q表示quit。!表示强制的意思,比如:wq!表示强制保存退出。
5.不同模式的区别和切换
通过上面的学习,我们知道vi有三种模式,他们分别是:
Command(命令)模式,用于输入命令(默认是该模式,键入 Esc 也可进入该模式);
Insert(插入)模式,用于插入编辑文本(参考标题3.怎么编辑文件);
Visual(可视)模式,用于视化的的高亮并选定正文(这个是vim独有的模式,在命令模式下,输入 v 即可进入该模式);
6.方便的光标移动
我们常用方向键来上下左右移动光标,要是你知道了下面的方法来控制光标,这是一件多么快乐的事情。
首先习惯性的 按一下 Esc 进入命令模式
j 向下移动一行;
k 向上移动一行;
h 向左移动一个字符;
l 向右移动一个字符;
(backspace 也可以向前移动一个字符)
上面的几个命令,大家觉得不能体现出什么优势 就和 方向键的功能一样,其实当你使用习惯时,会发现在输入文本时,右手不用怎么移动(不需要移动到遥远的方向键的位置)就可以移动光标了。下面的技巧,你会更喜欢..
在h、j、k、l动作命令的前面加上数字可以叠加操作,比如 3j,表示向下移动3行。
7.强大的删除操作
在插入模式中,可以使用backspace来删除字符。但是这样删除很慢,习惯性的 按 Esc进入命令模式,然后通过命令(h、j、k、l)迅速的移动到你需要操作的地方,使用下面的命令进行删除内容:
x 一个字符;
#x 删除几个字符,#表示数字,比如3x;
dw 删除一个单词;
#dw 删除几个单词,#用数字表示,比如3dw表示删除三个单词;
dd 删除一行;
#dd 删除多个行,#代表数字,比如3dd 表示删除光标行及光标的下两行;
d$ 删除光标到行尾的内容;
J 清除光标所处的行与上一行之间的空格,把光标行和上一行接在一起;
8.怎么撤销修改、删除
往往在对文本编辑时,总有犯错的时候,这是我们如果使用 ctrl+z是不能撤销操作的,正确的方法是:按Esc键(进入命令模式),再按 u 键 即可撤销一次,多按几次 u 就多撤销几次。
记住是在命令模式下输入小写 u 哦...
9.复制和粘贴
说到复制粘贴,我们也会想到剪贴,上面7说的删除操作其实就是剪贴的功能。比如dd后当前行被删除了并放入了vi的剪贴区中,然后移动光标到相应的地方,输入p即可把刚删除的内容粘贴到光标处。
p 在光标之后粘帖;
shift p 在光标之前粘帖;
下面举个例,
比如我们想把一个文档的第3行复制下来,然后帖到第5行的后面,我们应该怎么做呢? 、
有两种方法;
第一种方法:
先把第3行删除,把光标移动到第3行处,然后用dd动作,接着再按一下shift p键。这样就把刚才删除的第3行帖在原处了。--复制
接着我们再用k键移动光标到第5行,然后再按一下p键,这样就把第3行的内容又帖到第5行的后面了;--粘贴
第二种方法:
进入命令模式移动光标到第3行,在进入可视模式(按Esc键,然后按v键),移动光标选中第3行的内容,然后按y键复制;再移动指针到第5行,最后按p键;
所以复制和粘贴操作,是命令模式、插入模式及可视模式的综合运用,我们要学会各种模式之间的切换,要常用Esc键,更为重要的学会在命令模式下移动光标。
10.怎么显示行号
很多编辑器都有显示行号的功能,当然vi也有这个功能。
在命令模式下输入:
:set number
即可显示行号
11.查找功能
命令模式
/pattern<Enter> :向下查找pattern匹配字符串
?pattern<Enter>:向上查找pattern匹配字符串
使用了查找命令之后,使用如下两个键快速查找:
n:按照同一方向继续查找
N:按照反方向查找
字符串匹配
pattern是需要匹配的字符串,例如:
/abc<Enter> #查找abc
/ abc <Enter> #查找abc单词(注意前后的空格)
除此之外,pattern还可以使用一些特殊字符,包括(/、^、$、*、.),其中前三个这两个是vi与vim通用的,“/”为转义字符。
/^abc<Enter> #查找以abc开始的行
/test$<Enter> #查找以abc结束的行
//^test<Enter> #查找^tabc字符串
12.替换功能
命令模式
:s/str1/str2/ #用字符串 str2 替换行中首次出现的字符串 str1
:s/str1/str2/g #用字符串 str2 替换行中所有出现的字符串 str1
:.,$ s/str1/str2/g #用字符串 str2 替换正文当前行到末尾所有出现的字符串 str1
:1,$ s/str1/str2/g #用字符串 str2 替换正文中所有出现的字符串 str1
:g/str1/s//str2/g #功能同上
例如:
:s/vivian/sky/ #替换当前行第一个 vivian 为 sky
:s/vivian/sky/g #替换当前行所有 vivian 为 sky
:n,$s/vivian/sky/ #替换第 n 行开始到最后一行中每一行的第一个 vivian 为 sky
:n,$s/vivian/sky/g #替换第 n 行开始到最后一行中每一行所有 vivian 为 sky
(n 为数字,若 n 为 .,表示从当前行开始到最后一行)
:%s/vivian/sky/ #(等同于 :g/vivian/s//sky/) 替换每一行的第一个 vivian 为 sky
:%s/vivian/sky/g #(等同于 :g/vivian/s//sky/g) 替换每一行中所有 vivian 为 sky
同时:可以使用 #或+ 作为分隔符,此时中间出现的 / 不会作为分隔符
:s#vivian/#sky/# 替换当前行第一个 vivian/ 为 sky/
:%s+/oradata/apras/+/user01/apras1/+ (使用+ 来 替换 / ): /oradata/apras/替换成/user01/apras1/
13.vim中的正则表达式
请参考:http://blog.charlee.li/vim-regexp/