编辑文本
切换到输入模式
为了在编辑缓冲区中插入文本,必须键入命令从命令模式切换到输入模式。当结束文本插入之后,还要按<ESC>键离开输入模式返回命令模式。
有12种命令可以改变到输入模式。其中一半用于输入新数据,另一半用于替换已有文本。
你可能会问,只是为了改变到输入模式,为什么需要如此众多的命令呢?答案是每条命令在不同的位置打开编辑缓冲区。因此,当希望插入数据时,可以选择最适合当前情形的命令进行插入。
i 改变到输入模式:在当前光标位置前插入数据
a 改变到输入模式:在当前光标位置后插入数据
I 改变到输入模式:在当前行开头处插入数据
A 改变到输入模式:在当前行末尾处插入数据
o 改变到输入模式:在当前行下面插入一行
O 改变到输入模式:在当前行上面插入一行
修改文本
为了用一个字符替换另一个单独的字符,可以键入r,后面跟着新字符。
r 精确替换1个字符(不进入输入模式)
R 以覆盖方式替换
s 以插入方式替换一个字符
C 以插入方式从当前光标处替换到这一行的末尾
cc 以插入方式替换当前的整行
S 以插入方式替换当前的整行
cmove 以插入方式从当前光标处替换到move所给出的位置处
因此,cw组合可以改变一个单词。c可以与任意一个单字符的光标移动命令组合使用。如果愿意,还可以使用重复次数。例如,命令c5w替换5个单词。命令c4b从当前位置向后替换4个单词。
替换文本
所有的ex命令都以一个:(冒号)字符开头。每当在命令的开头键入一个冒号时,vi将在命令行(屏幕的底部)上立即显示它。在键入命令的其他部分时,命令将回显在这一行上(这就是称这一行为命令行的原因)。
可以看出,ex命令要比vi命令长,而且更复杂。基于这一原因,在键入命令的过程中,vi将回显命令,从而可以看到自己在做什么。
vi命令中仅有的复杂长命令就是搜索命令(/或?),也是由于这个原因,这两个命令也在命令行上显示。
为了替换一个特定的模式,可以使用ex命令:s(substitute,替换)。其语法是:
:s/pattern/replace/
其中,pattern是希望替换的模式,replace是替换文本。
例如,为了使当前行上的“UNIX”替换为“Linux”,可以使用:
:s/UNIX/Linux/
以这种方式使用:s只替换当前行上该模式的第一个匹配项。为了替换所有的匹配项,需要在该命令的末尾键入字母g(global,全局),即:
:s/UNIX/Linux/g
如果希望vi在进行改变之前先经过同意,则需要在该命令的末尾添加字母c(confirm,确认):
:s/UNIX/Linux/c
当然g和c也可以组合在一起使用:
:s/UNIX/Linux/cg
当使用c修饰符时,vi将显示包含该模式的行。vi指出模式的位置,然后等待确认。如果希望进行替换,可以键入y(代表yes),然后再按<Return>键。否则,键入n<Return>或者只是按<Return>键本身,那么vi将慎重地假定您不希望进行修改。
为了删除模式,只需要将该模式替换为空即可。例如,为了删除当前行上所有的“UNIX”,可以使用:
:s/UNIX//g
为了方便起见,如果不在命令的末尾使用一个c或者g,则可以省略最后的/字符。例如下面两条命令是等价的:
:s/UNIX/Linux/
:s/UNIX/Linux
:s命令有两个重要的变体。
首先,可以在冒号后面指定一个特定的行号。这将告诉vi在特定行上替换。
例如,为了在第57行上第一次出现的“UNIX”改变为“Linux”,可以使用:
:57s/UNIX/Linux/
还可以使用两个用逗号分隔的行号表示一个范围。例如,为了在第57行至第60行之间进行相同的替换,可以使用:
:57,60s/UNIX/Linux/
大多数时候不会使用具体的行号。但是,有3种特殊的符号使这种形式的命令特别有用。.(点号)代表当前行,$(美元字符)代表编辑缓冲区的最后一行。因此,下述命令将当前行至编辑缓冲区末尾的所有“UNIX”都替换为“Linux”:
:.,$s/UNIX/Linux/g
从编辑缓冲区的开头至当前行进行相同的改变,可以使用:
:1,.s/UNIX/Linux/g
第三个特殊符号是%(百分比符号),它代表编辑缓冲区中的所有行。因此,为了让编辑缓冲区中的每一个“UNIX”都改变为“Linux”,可以使用:
:%s/UNIX/Linux/g
这与
:1,$s/UNIX/Linux/g
效果相同。
一定要记住%这个方便的缩写,今后将会大量地使用它。
:%s/UNIX/Linux/cg
当使用这样的命令时,可以通过按^C(intr键)在半途停止。这样将终止整条命令,而不仅仅是当前替换。
汇总一下:
:s/pattern/replace/ 替换当前行
:lines/pattern/replace/ 替换指定行
:line:lines/pattern/replace/ 替换指定范围的行
:%s/pattern/replace/ 替换所有行
删除文本
从编辑缓冲区中删除数据的方法有若干种,可以使用vi命令,也可以使用ex命令。
x 删除当前光标处的字符
X 删除光标左边的字符
D 删除从当前光标到本行末尾的字符
dmove 删除从当前光标到move所给位置的字符
dd 删除当前行
另外,还有两个ex命令:
:lined 删除指定行
:line,lined 删除指定范围的行
无论使用哪一条命令,都可以使用撤销u和U撤销删除。记住,有一天该命令会帮上你的大忙。
dmove,d(小写字母“d”),后面跟一条光标移到命令。该命令将删除从当前光标位置到光标移动命令所指示位置的所有字符。与修改文本中讨论的c(change,改变)命令相似。
下面举一些例子:
dw 删除1个单词
d10w 删除10个单词
d10W 删除10个单词(忽略标点符号)
db 向后删除1个单词
d2) 删除2个句子
d5} 删除5个段落
d命令有两种特别有用的使用方法。
第一, 为了删除当前行到编辑缓冲区末尾的所有行,可以使用dG。
第二, 为了删除从当前行到编辑缓冲区开头的所有行,可以使用dgg或d1G(如前所说,gg命令不适用于老版本的vi)。
dd命令删除当前行。如果希望删除不止一行,可以在该命令前面加上一个重复次数。如,为了删除一行,可以使用dd,为了删除10行,可以使用10dd。