1 VI入门
1.1 为什么学习VI
- VI基本上总是可用的,如果所在的系统没有图形界面,例如远程服务器或者X Windows系统配置有故障。
- VI轻巧流畅,是一个轻量化的工具
1.2 背景知识
大多数Linux发行版自带的并不是真正的Vi,而是Vi增强版Vim。Vim对于传统的UNIX系统的Vi进行了重大的改进,在Linux系统中,Vi通常是指向Vim的符合链接或作为Vim的别名。
1.3 启动和退出Vi
启动vi
[root@lvs ~]# vi ~ ~ VIM - Vi IMproved ~ ~ version 7.4.629 ~ by Bram Moolenaar et al. ~ Modified by <bugzilla@redhat.com> ~ Vim is open source and freely distributable ~ ~ Help poor children in Uganda! ~ type :help iccf<Enter> for information ~ ~ type :q<Enter> to exit ~ type :help<Enter> or <F1> for on-line help ~ type :help version7<Enter> for version info
退出vi
:q
强制退出Vi
如果由于某些原因,Vi未能退出,通常因为修改了文件,但没有保存,可以加上感叹号,强行退出Vi。:q!
如果在Vi中迷路,搞不清楚当前所处的模式,连按两次Esc键就可以返回命令模式。
1.4 编辑模式
Vi是一款模式编辑器,当Vi启动时,进入命令模式。在该模式下,几乎每个按键都是命令。
1.4.1 插入模式
向文件中添加文本,必须先进入插入模式,只需按i键即可。如果Vi是以增强方式运行的,屏幕底部会看到INSERT字样,现在就可以输入文本了
The test scripts
按Esc键,可以退出插入模式返回命令模式。
1.4.2 保存文件
保存对文件的改动,按Esc先退回命令模式,然后输入冒号,之后输入w,然后按Enter完成保存,输入wq保存并退出。
1.5 光标移动
命令模式下,Vi提供了大量的光标移动命令,如下:
命令 | 光标移动 |
---|---|
l或右方向键 | 向右移动一个字符 |
h或左方向键 | 向左移动一个字符 |
j或下方向键 | 向下移动一行 |
k或上方向键 | 向上移动一行 |
数字0 | 移动到当前行首 |
^ | 移动到当前行中第一个非空白字符处 |
$ | 移动到当前行尾 |
w | 移动到下一个单词开头或标点符号 |
W | 移动到下一个单词开头,忽略标点符号 |
b | 移动到上一个单词开头或标点符号 |
B | 移动到上一个单词开头,忽略标点符合 |
数字键G | 移动到指定行,1G可以使光标移动到文件的第一行 |
G | 移动到文件的最后一行 |
1.6 基本编辑
大多数编辑是由少数基本操作组成的,例如插入文本,删除文本,而通过剪切、粘贴可以移动文本。除此之外,Vi还提供了有限形式的撤销操作。在命令模式下按u键,Vi会撤销上一次做出的改动。
1.6.1追加
想在句末添加一些文本,可以使用文本追加命令a(append的缩写),将光标移动至行尾并输入a,光标会移动过行尾,同时Vi进入插入模式,编辑完成后按Esc键退出插入模式。
一种更便捷的方式是输入A,将光标移动至当前行的行尾并进行追加,追加完成后,按Esc退出插入模式。
1.6.2 新建
插入文本的另一种方法是新建,可以在已有的两行直接插入一个空行并进入插入模式,新建命令有两种,如下表
命令 | 新建内容 |
---|---|
o | 在当前行之下新建一行 |
O | 在当前行之上新建一行 |
1.6.3 删除
Vi提供了多种删除文本的方法
命令 | 删除内容 |
---|---|
x | 删除当前字符 |
3x | 删除当前字符和接下来的两个字符 |
dd | 删除当前行 |
5dd | 删除当前行及接下来的4行 |
dW | 删除从光标所在处一直到下一个单词的开头 |
d$ | 删除从光标所在处一直到行尾 |
d0 | 删除从光标所在处一直到行首 |
dG | 删除从当前行一直到文件末尾 |
d20G | 删除从当前行一直到第20行 |
标准的Vi支持单级撤销,Vim支持多级撤销。
1.6.4 剪切、复制和粘贴
d命令不仅能删除文本,还可以剪切文本。每次使用d命令,被删除的文本就会被复制到粘贴缓存区,可将其想象成粘贴板。随后可以使用p命令将粘贴缓存区中的内容粘贴到光标的下一行,使用P命令将粘贴缓存区中的内容粘贴到光标的上一行。
y命令可用于复制文本,其使用方式和用于剪切文本的d命令差不多,y命令示例:
命令 | 删除内容 |
---|---|
yy | 复制当前行 |
5yy | 复制当前行及接下来的4行 |
yW | 复制从光标所在处一直到下一个单词的开头 |
y$ | 复制从光标所在处一直到行尾 |
y0 | 复制从光标所在处一直到行首 |
yG | 复制从当前行一直到文件末尾 |
y20G | 复制从当前行一直到第20行 |
1.6.5 合并
Vi提供了一个用于合并的特殊命令J
The quick brown for jumped over the lazy dog. It was cool.
Line 2
Line 3 Line 4
Line 5
1.6.6 搜索和替换
Vi能够在单行或整个文件范围内将光标移动至搜索结果处。另外,还可以执行文本搜索,用户可选择替换时是否需要确认。
1.6.6.1 行内搜索
f命令在行内搜索并将光标移动至指定支付的下一次出现处。例如,命令fa会将光标移动至字符a在行内的下一次出现的位置。输入分号可以重复先前的搜索。
1.6.6.2 搜索整个文件
/命令可以将光标移动至指定单词或短语的下一次出现处,其工作方式和之前讲过的less命令一样。当输入/命令时,/字符会出现在屏幕底部。接着,输入待搜索字符串,然后按Enter键。光标会移动到包含待搜索字符串的下一个位置。要想重复搜索上一次指定的字符串,使用n命令即可。Vi也能够使用正则表达式。
1.6.6.3 全局搜索和替换
Vi使用ex命令在若干行或整个文件范围内执行搜索和替换操作,要想将文件中所有的单词Line更改为line,可以输入下列命令。
:%s/Line/line/g
上述命令拆开,看看各部分的含义
组成 | 含义 |
---|---|
: | 冒号表示接下来是ex命令 |
% | 指定操作的行范围,%是一种便捷写法,代表从第一行到最后一行。也可以将范围写作1,5或者1, ( ( (表示从第一行到最后一行)。如果未指定行范围,则仅对当前行执行操作。 |
s | 替换(substitution) |
/Line/line/ | 指定搜索模式和替换文本 |
g | 代表全局(global),表示对行中所有搜索字符串执行替换操作。如果不指定,则仅替换每行搜索到的第一个字符串。 |