博客地址:http://www.moonxy.com

一、前言

Vi 与 Vim 都是多模式编辑器,是 Linux 中必不可少的工具。不同的是 Vim 是 Vi 的升级版本,它不仅兼容 Vi 的所有命令,Vi 使用于文本编辑,但是 Vim 更适用于 Coding。不仅如此,Vim 还有一些新的特性在里面。
Vim 的这些优势主要体现在以下几个方面:
1、多级撤消:我们知道在 vi 里,按 u只能撤消上次命令,而在vim里可以无限制的撤消。
2、易用性:Vi 只能运行于 Unix中,而 Vim 不仅可以运行于 Unix,Windows,Mac 等多操作平台。
3、语法加亮:Vim 可以用不同的颜色来加亮你的代码。
4、可视化操作:就是说 Vim 不仅可以在终端运行,也可以运行于 X Window、 Mac OS、 Windows。
5、对 Vi 的完全兼容:某些情况下,你可以把 Vim 当成 Vi 来使用。

二、三种模式

Vi 和 Vim 都有 3 种模式,分别为:一般模式、编辑模式、命令模式。

2.1 一般模式

该模式可以移动光标、删除字符等。
使用 vim filename 编辑一个文件时,默认进入该文件的一般模式,如果还没有安装 Vim,则可以使用 yum 先安装:[root@ryan ~]# yum install -y vim-enhanced

一般模式 - 移动光标

h 或向左方向键(←):光标"向左"移动一个字符;
j 或向下方向键(↓):光标"向下"移动一个字符;
k 或向上方向键(↑):光标"向上"移动一个字符;
l 或向右方向键(→):光标"向右"移动一个字符;
[Ctrl]+[f]或者[Page Down] 按键:屏幕"向下"移动一页;
[Ctrl]+[b]或者[Page Up] 按键:屏幕"向上"移动一页;
[Ctrl]+[d]:屏幕"向下"移动半页;
[Ctrl]+[u]:屏幕"向上"移动半页;
0 或者 Shift+6:数字"0",移动到本行的行首(常用);
Shift+4:移动到本行行尾(常用);
gg:移动到这个文件的首行,相当于 1G(常用);
G:移动到这个文件的最后一行(常用,先按 Capse Lock 切换到大写,然后再按字母 G);
nG:n 为任意数字。移动到这个文件的第 n 行。例如 20G 则会移动到这个文件的第 20 行(常用,可配合显示行号 :set nu);
n<Enter>:n 为数字,然后按回车键,光标向下移动 n 行;

一般模式 - 删除、复制与粘贴

x,X:在一行字中,x 为向后删除一个字符(相当于 [Del] 按键),X 为向前删除一个字符(常用,相当于 [backspace] 即退格键);
nx:n 为数字,连续向后删除n个字符。举例来说,要连续删除10个字符,则输入"10x";
dd:删除/剪切光标所在的那一整行(常用);
ndd:n 为数字。从光标位置开始,向下删除/剪切 n 行,例如 20dd 则是从光标行开始向下删除/剪切20行(常用);
d1G:删除光标所在位置到第一行的所有数据;
dG:删除光标所在位置到最后一行的所有数据;
d$:删除光标所在位置到该行的最后一个字符;
d0:d 的后面是数字0,删除光标所在处,到该行的最前面一个字符;
yy:复制光标所在的那一行(常用);
nyy:n为数字。复制光标所在的向下n行,例如 20yy 则是复制 20 行(常用);
y1G;复制光标所在行到第一行的所有数据;
yG;复制光标所在行到最后一行的所有数据;
y0:复制光标所在的那个字符到该行行首的所有数据;
y$:复制光标所在的那个字符到该行行尾的所有数据;
p,P:p 为将已复制的数据粘贴到光标的下一行,P 则为贴在光标上一行。举例来说,当前光标在第20行,且已经复制了10行数据。则按下 p 后,那10行数据会贴在原来的20行之后,即由21行开始贴。但如果是按下 P,那么原来的第20行会被变成30行(常用);
J:将光标所在行与下一行的数据结合成同一行;
c:重复删除多个数据,例如向下删除10行,[10cj];
v:按 v 后移动光标会选中指定字符,然后可以实现复制、粘贴等操作;
y:复制选中的字符;
.:这是小数点,意思是重复前一个动作。如果想重复删除、重复粘贴,按下小数点"."就可以;
u:复原前一个操作(常用);
[Ctrl]+r:重做上一个操作(常用);
u 与 [Ctrl]+r 是很常用的命令。一个是复原,另一个则是重做一次。利用这两个功能按键,编辑起来就得心应手。

2.2 编辑模式

在此模式下可以输入字符,按 ESC 键将回到一般模式。 
一般模式下不可以修改某一个字符,如果要修改字符,只能进入编辑模式,从一般模式进入编辑模式,只需按 i、I、a、A、o、O、r 或 R 中的任何一个键即可。进入编辑模式后,在屏幕左下方会显示"-- INSERT --"或"-- REPLACE --"提示,从编辑模式回到一般模式时,只需要按 Esc 键即可。
i、I
插入:在当前光标所在处插入输入文字,已存在的文字会向后退;其中,i 为"从当前光标所在处插入",I 为"在当前所在行的第一个非空格符处开始插入"(常用);
a、A
a 为"从当前光标所在的下一个字符处开始插入",A 为"从光标所在行的最后一个字符处开始插入"(常用);
o、O
这是英文字母 o 的大小写。o 为"在当前光标所在的下一行处插入新的一行";O 为"在当前光标所在处的上一行插入新的一行"(常用);
r、R
替换:r 会替换光标所在的那一个字符;R 会一直替换光标所在的文字,直到按下 ESC 键为止;
使用上面这些按键时,在vi画面的左下角处会出现"--INSERT--"或"--REPLACE--"的字样。通过名称就知道是什么操作。特别注意,上面也提过了,想在文件中输入字符时,一定要在左下角处看到 INSERT/REPLACE 才能输入。

2.3 命令模式

该模式可以实现保存文件、退出 Vi、设置 Vi、查找、替换等操作。 
在一般模式下,输入 ":" 或者 "/" 即可进入命令模式。在该模式下,我们可以搜索某个字符或者字符串,也可以实现保存、替换、退出、显示行号等操作。
/word
从光标位置开始,向下寻找一个名为 word 的字符串。例如要在文件内搜索 word 这个字符串,就输入 /word 即可(常用);
?word
从光标位置开始,向上寻找一个名为 word 的字符串;
n
n 是小写英文字母。表示"重复前一个搜索的动作"。举例来说,如果刚刚执行 /word 去向下搜索 word 字符串,则按下 n 后,会向下继续搜索下一个名称为 word 的字符串。如果是执行 ?word 的话,那么按下 n,则会向上继续搜索名称为 word 的字符串;
N
N 是大写英文字母。与 n 刚好相反,为"反向"进行前一个搜索操作。例如 /word 后,按下N则表示"向上"搜索 word;
:n1,n2s/word1/word2/g
n1 与 n2 为数字。在第 n1 与 n2 行之间寻找 word1 这个字符串,并将该字符串替换为 word2。举例来说,在 100 到 200 行之间搜索 word1 并替换为 word2,如果不加 g 则只替换每行的第一个 word1,如:":100,200s/word1/word2/g"(常用);
:1,$s/word1/word2/g
从第一行到最后一行寻找 word1 字符串,并将该字符串替换为 word2(常用);
:1,$s/word1/word2/gc
从第一行到最后一行寻找 word1 字符串,并将该字符串替换为 word2。且在替换前显示提示符给用户确认(conform)是否需要替换(常用);
:w
将编辑的数据写入硬盘文件中保存,但不离开;
:w!
若文件属性为"只读"时,强制写入该文件。不过,到底能不能写入,与文件权限有关;
:q
离开 vi;
:q!
若曾修改过文件,又不想存储,使用 ! 为强制离开不存储文件;注意一下,那个感叹号(!)在 vi 当中,常常具有"强制"的意思(常用);
:wq
存储后离开,若为 :wq! 则为强制存储后离开(常用);
:e!
将文件还原到最原始的状态;
ZZ
若文件没有更改,则不存储离开,若文件已经更改,则存储后离开;
:w [filename]
将编辑的数据存储成另一个文件(类似另存新文件);
:r [filename]
在编辑的数据中,读入另一个文件的数据。即将"filename"这个文件内容加到光标所在行的后面;
:n1,n2 w [filename]
将 n1 到 n2 行的内容存储成 filename 文件;
:! command
暂时离开 vi 到命令行模式下执行 command 的显示结果。例如":! ls /home",即可在vi中查看 /home 中以 ls 输出的文件信息;
:set nu
显示行号,设置之后,会在每一行的前缀显示该行的行号;
:set nonu
与 set nu 相反,为不显示行号;
注意,在 vi 中,"数字"是很有意义的。数字通常表示重复做几次的意思。也有可能表示要去哪里的意思。举例来说,要删除 50 行,则是用"50dd"。数字加在动作之前。要向下移动20行,使用"20j"或者"20↓"即可。

最新文章

  1. 连连看游戏(dfs)【华为上机题目】
  2. Informatica Lookup Transformation组件的Connect 与Unconnected类型用法
  3. tp框架总结(二)
  4. 解决Regsvr32: DllRegisterServer entry point was not found
  5. 161107、spring异步调用,完美解决!
  6. Hadoop学习地址
  7. javascript触摸事件touch使用
  8. ubuntu14.04源代码安装postgresql 9.1
  9. gcc -D选项
  10. JS浏览器关闭时清空cookie
  11. 关于Go语言共享内存操作的小实例
  12. HDU 3715 Go Deeper(2-sat)
  13. json文件报expected name at 1 1错误
  14. PowerBI 第二篇:数据建模
  15. 003.MongoDB主要概念
  16. Deepin 15.5上安装 Node.js
  17. Jmeter+Ant+Jenkins搭建持续集成的接口测试(推荐 Mark)
  18. vue2.0的生命周期
  19. mac上校验文件的 md5 sha-1
  20. Shell 文本处理工具

热门文章

  1. spring cloud 断路器 Hystrix
  2. caffe学习网站
  3. java两个对象属性比较
  4. cookies和sessionstorage和localstorage区别
  5. .NET CORE 怎么样从控制台中读取输入流
  6. python requests接口测试系列:连接mysql,获取mysql查询的值作为接口的入参
  7. .NET Core 学习资料精选:进阶
  8. 分享一个赚钱方法:用趣分类app在家轻松赚钱
  9. NLP(九) 文本相似度问题
  10. python中,一个函数想使用另一个函数中的变量