vim 官方网站:https://www.vim.org/
什么是vi
首先,我们需要了解以下vi到底是什么东西?为什么要使用vi呢?
- 所有的 UNIX-like 系统都会内置vi文本编辑器,但是其它软件就不一定了。
- 众多软件的编辑接口都会主动调用vi
- vim具有程序编辑的能力,可以主动地以字体颜色辨别语法的正确性、方便程序设计
- 程序简单,编辑速度相当地快速
上面,我们提到了vi、vim,这两个有什么区别呢?
通俗一点来说,vim是vi的升级版。除了vi拥有的功能外,它还可以用颜色或者下划线的方式来显示一些特殊的信息。还有一点,涉及到shell脚本程序,vim会根据文件的或判断文件内容自动调用该程序的语法判断样式,最终再以颜色来显示。这一点广泛应用于Linux中语法问题的检查
可以说,vi就是一个文本编辑器,而vim则是程序编辑器
vi的使用
-
一般命令模式(command mode)
以 vi 打开一个文件就直接进入一般命令模式了。在这个模式中,可以使用【上下左右】按键来移动光标,可以使用【删除、复制、粘贴】等操作来处理文件内容 -
编辑模式(insert mode)
在一般模式下可以进行删除、复制、粘贴等操作,却无法进行编辑,此时就需要按【i、I、o、O、a、A、r、R】任意一个字母进入编辑模式,此时左下方会出现【INSERT】或【REPLACE】字样,若想回到一般命令模式,按下【ESC】即可退出编辑模式 -
命令行模式( command-line mode)
在一般命令模式下,输入【:/ ?】三个中任何一个按钮,就可以将光标移动至最下面一行。在该模式当中,提供了【查询数据】的操作。通常在该模式下我们会进行读取、保存、批量替换字符、退出vi以及显示行号等操作
vi/vim命令
进入vi编辑器命令
命令 | 作用 |
---|---|
vi filename | 打开或者新建文件,并将光标置于第一行首 |
vi +n filename | 打开文件,并将光标置于第n行首 |
vi + filename | 打开文件,并将光标置于最后一行首 |
vi +/pattern filename | 打开文件,并将光标置于第一个与pattern相匹配的行行首 |
vi -r filename | 在上次正编辑时发生系统崩溃,恢复filename |
vi filename......filename | 打开多个文件,进行依次编译 |
移动光标的命令
命令 | 作用 |
---|---|
[ctrl] + [f] | 屏幕[向下]移动一页,相当于[Page Down] |
[ctrl] + [b] | 屏幕[向上]移动一页,相当于[Page Up] |
[ctrl] + [d] | 屏幕[向下]移动半页 |
[ctrl] + [u] | 屏幕[向上]移动半页 |
+ | 光标移动到非空格符的下一行 |
- | 光标移动到非空格符的上一行 |
n<space> | 按下数字再按下<space>,光标会移动到这一行的第n个字符 |
数字0或功能键[Home] | 移动到这一行的最前面字符处 |
$或功能键[End] | 移动到这一行的最后面字符 |
H | (High)光标移动到这个屏幕最上面的一行的第一个字符处 |
M | (Middle)光标移动到这个屏幕中央的一行的第一个字符处 |
L | (Low)光标移动到这个屏幕最下面的一行的第一个字符处 |
G | 移动到这个文件的最后一行 |
nG | n为数字,移动到这个文件的第n行。可配合set nu使用 |
gg | 移动到这个文件的第一行,相当于1G |
n<Enter> | n为数字,光标向下移动n行 |
查找与替换命令
命令 | 作用 |
---|---|
/test | 向光标之下寻找一个名称为 test 的字符串 |
?test | 向光标之上寻找一个字符串名称为word的字符串 |
n | 【重复前一个查找的操作】 如:前面执行/test向下查找test字符串,按下n会查找下一个名称为test的字符串 |
N | 【反向进行】 如:前面执行/test后,按下N会向上查找名称为test的字符串 |
使用 /test 配合n和N同时使用,可以重复查找关键词
:n1,n2s/word1/word2/g | 在第n1行与n2行之间寻找word1字符串,并将该字符串替换为word2
:1,s/word1/word2/gc | 从第一行到最后一行寻找word1字符串,并将该字符串换为word2,且在替换前显示提示字符给用户确认是否需要替换
删除复制与粘贴
命令 | 作用 |
---|---|
x/X | x为向后删除一个字符(相当于del),X为向前删除一个字符(相当于backspace) |
nx | 连续向后删除n个字符 |
dd | 删除(带复制)光标所在的那一整行 |
ndd | 删除光标所在的向下n行 |
d1G | 删除光标所在到第一行的所有数据 |
dG | 删除光标所在到最后一行的所有数据 |
d$ | 删除光标所在处,到该行的最后一个字符 |
d0 | 删除光标所在处,到该行的最前面一个字符 |
yy | 复制光标所在的那一行 |
nyy | 复制光标所在的向下n行 |
y1G | 复制光标所在行到第一行的所有数据 |
yG | 复制光标所在行到最后一行的所有数据 |
y0 | 复制光标所在的那个字符到该行行首的所有数据 |
y$ | 复制光标所在的那个字符到该行行末的所有数据 |
p或P | p为将已复制的数据在光标下一行粘贴,P则为将已复制的数据粘贴在光标上一行 |
J | 将光标所在行与下一行数据结合成一行 |
c | 重复删除多个数据,例如向下删除10行,[10cj] |
u | 恢复前一个操作 |
[Ctrl] + r | 重做上一个操作 |
退出vi编辑器命令
命令 | 作用 |
---|---|
:q | 退出,在文件内容没有被改变时使用 |
:q! | 强制退出不保存,在改变文件后不想保存时使用 |
:w [filename] | 相当于[另存为],将编辑的数据保存成一个新的文件 |
:r [filename] | 在编辑的数据中,读入另一个文件的数据,即将[filename]文件内容加到光标所在行的后面 |
:n1,n2 w [filename] | 将n1到n2的内容保存为 filename 文件 |
:wq | 对vi编辑器中的文件进行保存并退出vi编辑器 |
:wq! | 强制退出保存在对只读文件编写时使用。注意,编辑只读文件必须使用 |
vim环境的修改
:noh | 取消高亮
:set nu | 显示行号
:set nonu | 取消行号
案例练习
1. 请在 /tmp 这个目录下建立一个名为 vitest 的目录;
2. 进入 vitest 这个目录当中
3. 将/etc/man_db.conf复制到本目录下(或在线获取)
4. 使用vi打开本目录下的 man_db.conf 文件,在 vi 中设置行号,移动到第43行,向右移动59个字符,请问你看到小括号内是哪个文字?
5. 移动到第一行,并且向下查找一下【gzip】这个字符串,请问它在第几行?
93行
6. 接着下来,要将29到41行之间的【小写man字符】改为【大写MAN字符】,并且一个一个是否要修改,如何执行命令?如果在确定过程中一直按【y】,结果会在最后一行出现改变了几个man?
13个man
7. 修改完后,后悔了,如何恢复?
8. 复制66到71这6行的内容,并且粘贴到最后一行之后
9. 113行到128行之间的开头为#符号的注释数据我不要了,如何删除
10. 将这个文件另存成一个 man.test.config 的文件名
11. 去到第25行,并且删除15个字符,结果出现的第一个单词是什么?
tree
12. 在第一行新增一行,该行内容输入【I am a student...】
13. 保存退出